![](/img/trans.png)
[英]Is there any possibility of changing the MySQL DB table's field name or adding a new field in Joomla in any project?
[英]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_id
, description
, deleted
, created_date
創建一個表Exchange_Rates
。
因此,當訂單關閉時,您只需要用id更新訂單表中的exchange_rate_id
列,以后便可以使用查找表創建聯接以提取記錄。
請記住
這是一對多的關系,所以我認為您不必為此創建單獨的表。 如果您這樣做,我認為可以考慮進行額外的標准化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.