我正在构建一个多货币应用程序。
考虑具有以下字段的帖子表:
id, country_id, price
每次获取价格字段时,我还需要使用货币将其显示在前端。因此,每次尝试获取帖子以获取货币时,我都需要进行两次联接(或使用laravel
with
运行3个查询)。post->country->currency
为了解决这个问题,我可以只在发布表中存储货币。但是,这违反了规范化准则。它还跨表复制数据。
我应该对数据进行非规范化并将货币存储在邮政表格中吗?
最佳答案
那要看。price
是否应在销售时冻结? (我认为是。)不要规范化。
还是您需要根据当前汇率转换价格?做归一化。
另外,country_id
不是currency
的正确密钥。 currency_id
应该在发布时确定;如果还需要,请保留country_id
。
然后,当一种货币贬值,或者一个国家转移到欧元,或者...时,该架构不会妨碍您。
另外,在某些情况下,旅游区很愿意以不同的货币兑现现金。美国许多杂志都以美元和加元标价。
规范化目的:
某些“名称”或“地址”将来可能会更改。因此,将其标准化到另一个表中。否则,当发生更改时,您需要遍历多个表中的多行以影响更改。
节省空间...您的字符串经常出现,但是(很可能)永远不会改变。通过“规范化”(错误的术语,但类似的实现),可以将长字符串仅放在一个位置。例如,将其替换为2个字节的SMALLINT UNSIGNED
,最多允许65K个不同值。注意:如果字符串较短,例如标准的2个字母的country_codes,请不要进行标准化。 5字符的邮政编码几乎不值得缩减为2字节的smallint。货币代码的标准很好(USD,EUR –仅3个字母),太短了,无法正常化。
因此,请归一化。以我的经验,“价格”不属于这两个类别。和
关于mysql - 什么时候应该在MySQL中对数据进行非规范化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49908625/