簡體   English   中英

更新數據庫結構-新表或添加字段

[英]updating db structure - new table or adding a field

這聽起來像是一個愚蠢的問題,但事實確實如此。 我敢肯定,這里的任何人都發生了這種情況,您按照規范(php / mysql)構建了一個具有db結構的Web應用程序,但是隨后規范略有變化,您需要在db中進行更改以反映出來,這是一個簡短的例子:

Order table
->order id
->user id
->closed
->timestamp

但是由於訂單的支付貨幣與數據庫中引用的貨幣不同,因此我需要添加字段exchange rate ,該exchange rate僅在關閉訂單時才檢查並知道,而不是在插入記錄時才知道。 因此,我可以將新字段添加到當前表中,並在插入時將其保留為空/空白,然后在必要時進行更新; 或者我可以使用以下結構創建一個新表:

Order exchange rates
->exchange id
->order id
->exchange rate

盡管我相信這封信會更好,因為它是一種不太麻煩的更改,並且不會影響應用程序的其余功能,但最終可能會出現瘋狂的連接查詢,以獲取所有必要的信息。 另一方面,前一種方法可能會使您在數據庫中存在的其他查詢混亂,但是從整體數據庫結構的角度來看,這絕對是更實用且合乎邏輯的。 另外,我認為使用insert null的結構並在以后進行更新不是一個好習慣,但這可能只是我的寂寞意見。因此,我想問一下您認為哪種方法更可取。

我在考慮另一種選擇。 設置匯率表,例如:

create table exchange_rate(
   cur_code_from varchar2(3)  not null
  ,cur_code_to   varchar2(3)  not null
  ,valid_from    date         not null
  ,valid_to      date         not null
  ,rate          number(20,6) not null
);

alter table exchange_rate 
  add constraint exchange_rate_pk 
      primary key(cur_code_from, cur_code_to, valid_from);

該表應包含類似於以下內容的數據:

cur_code_from   cur_code_to valid_from  valid_to   rate
=============  =========== ==========  ========    ====
    EUR           EUR      2014-01-01   9999-12-31  1
    EUR           USD      2014-01-01   9999-12-31  1,311702
    EUR           SEK      2014-01-01   2014-03-30  8,808322
    EUR           SEK      2014-04-01   9999-12-31  8,658084
    EUR           GBP      2014-01-01   9999-12-31  0,842865
    EUR           PLN      2014-01-01   9999-12-31  4,211555

從和轉換為相同貨幣時,請注意特殊情況。 從規范化的角度來看,您不需要valid_to因為可以從下一個valid_from進行計算,但是從實際的角度來看,使用有效日期比每次使用子查詢都容易。

然后,要轉換成客戶貨幣,您可以使用此表:

select o.order_value * x.rate as value_in_customer_currency
  from orders o
  join exchange_rate_t x on(
       x.cur_code_from = 'EUR' -- Your- default currency here
   and x.cur_code_to   = 'SEK' -- The customers currency here
   and o.order_close_date between x.valid_from and x.valid_to
  )
 where o.order_id = 1234;

在這里,我使用了自order_close_date有效的order_close_date 因此,如果您有兩個訂單,一個訂單的截止日期為2014-02-01,那么它將獲得與截止日期為2014-04-05的訂單不同的匯率。

我認為您只需要在訂單表中添加exchange_rate_id並使用表ex_rate_iddescriptiondeletedcreated_date創建一個表Exchange_Rates

因此,當訂單關閉時,您只需要用id更新訂單表中的exchange_rate_id列,以后便可以使用查找表創建聯接以提取記錄。

請記住

  1. 一個訂單在關閉時只有一種貨幣。
  2. 可以針對一個或多個訂單更新一種貨幣

這是一對多的關系,所以我認為您不必為此創建單獨的表。 如果您這樣做,我認為可以考慮進行額外的標准化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM