这是一个常见的数据库设计问题。假设下表:
======================================================================
| product_translation_id | language_id | product_id | name | price |
======================================================================
| 1 | 1 | 1 | foobar | 29.99 |
----------------------------------------------------------------------
| 2 | 2 | 1 | !@#$%^ | &*()_ |
----------------------------------------------------------------------
(假设language_id = 2是某种不基于拉丁字符的语言等)。
将翻译后的价格存储在数据库中是否正确?虽然它允许我正确显示翻译,但我担心当我想对它们进行数学运算时会给我带来问题(例如,向&*()_
添加10%的销售税)。
处理数字翻译的好方法是什么?
答案 0 :(得分:2)
如果您可以以编程方式将“29.99”转换为“& *()_”,那么我会将价格放在产品表中,并将其翻译为显示层。如果你存储两次,那么你将有两个明显的问题:
当你需要更新你的价格时,第一个问题会给你带来很多麻烦,你的会计师会讨厌弄乱你的书。
第二个问题将使您的数据库在您需要在数据库内进行任何计算或比较时讨厌您。一遍又一遍地调用CONVERT(string AS DECIMAL)
会产生费用。
您可以将数字格式保存在产品表中(用于计算,排序等),然后将翻译表中的本地化翻译作为字符串。这种方法只是放大了上述两个问题。但是,如果你需要让人类翻译你的数字,那么这种方法可能是必要的。如果您坚持使用此功能,那么您可以通过在每次更新后运行某种形式的完整性检查程序来缓解一致性问题,甚至可以将理智检查程序包装在某种类型的触发器中。