![](/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.