什么时候应该在MySQL中对数据进行非规范化?

时间:2018-04-18 20:36:36

标签: mysql database database-design relational-database

我正在构建一个多币种应用程序。

考虑一个包含以下字段的帖子表:

id, country_id, price

每次我获取价格字段时,我还需要货币才能在前端显示。因此,每次尝试获取帖子时,我都需要进行两次连接(或使用laravel with运行3次查询)。

post->country->currency

要解决这个问题,我可以将货币存储在post表中。然而,这违反了标准化指南。它还会复制表格中的数据。

我应该对数据进行非规范化并将货币存储在帖子表中吗?

1 个答案:

答案 0 :(得分:0)

这取决于。

出售时price应该被冻结吗? (我想是的。)不要正常化。

或者您是否需要根据当前汇率转换价格?做正常化。

此外,country_id不是currency的正确密钥。 currency_id应在发布时确定;如果您还需要,请保留country_id

然后,当一种货币贬值,或一个国家转移到欧元或......时,架构就不会妨碍你。

此外,有些旅游区非常愿意以不同货币购买现金。美国的许多杂志都以美元和加元列出价格。

规范化目的:

  • 某些“名称”或“地址”将来可能会发生变化。因此将其规范化为另一个表。否则,当发生更改时,您需要在多个表中运行多行以实现更改。
  • 节省空间......你有一个频繁出现的字符串,但(比方说)不太可能改变。通过“规范化”(错误的术语,但类似的实现),您可以只在一个地方使用长字符串。它被替换为例如2字节SMALLINT UNSIGNED,允许多达65K的不同值。注意:如果字符串很短,例如标准的2个字母的country_codes,请不要打扰规范化。一个5字母的邮政编码几乎不值得缩小到2字节的小字节。货币代码有一个很好的标准(美元,欧元 - 只有3个字母),太短而无法正常化。

因此,如果其中任何一个适用,请进行标准化。根据我的经验,“价格”不属于任何一类。并且