我有一个关于在MySql数据库中放置数据的问题。我想创建Web应用程序的产品列表类型,其中应该是几个字段,如:name(每种语言最多包含256个字符的多语言字段),重量,宽度,高度,颜色,材料(以及其他一些应该包含的字段)只包含数字,不需要为每种语言进行更改)。所以我堆叠了,我不知道如何正确处理这个任务。
我可以对我的所有数据使用单个表,并为new创建新列 语言,但问题将出现在开发人员试图 更改数据库的宽度或高度信息。所以他/她会的 必须为所有语言更改此单个参数。
我可以使用2个表,1表示多语言“名称”,另一个表示 “产品”,其中第一个表中的1个字段表示 第二个表的ID。在这种情况下,如果开发人员需要更改某些参数,他/她将只更改“产品”表中的1个字段。
我知道这个问题可能看似主观,但想想其他一些尝试创建多语言网络应用程序的人,就像我的一样,会觉得答案很有用。
P.S。 对不起我的英语技能
答案 0 :(得分:1)
使用单个列进行多次翻译的ID标记部分听起来很合理。然后,您可以使用集中式服务器来存储特定于应用程序的转换文件,这些文件始终与ID同步以处理不同类型的客户端。任何客户端都应该能够使用自定义调用获取特定的翻译数据。这种机制可以很容易地利用缓存优化,并始终保证最新的翻译。
答案 1 :(得分:1)
像这样的数据库列的国际化可能会变得棘手,并且确实没有“一种真正的方式”。
在你的例子中,将名称分成一个单独的表似乎是一个良好规范化的直接案例 - 我当然不会考虑复制整行只是为了翻译一列。但是,这种方法变得难以处理您最终翻译的列越多 - 在极端情况下,对于原始表中的每一列,您现在都有一个新表,并且您的原始表只存在于将它们全部保存在一起。 (关系数据库理论家喜欢这样的模式 - 查找5NF和6NF - 但实际上尝试使用数据库的人可能不那么热衷于必须使用那么多JOIN
s。
另一种方法是拥有一个大型文本字符串表,每个字符串都存储一个唯一的ID +语言,然后通常会有一个VarChar
列,您可以将相关的ID存储在转换表中。或者,您可以使转换表直接存储每个字符串的上下文(例如,表,列名和主键)。这样可以减少数据库的“杂乱”感觉,但是在数据建模方面,文本字符串表格相当奇怪:它们之间没有连接,期望它们成为字符串。
我使用了另一种解决方案,I called "Atomic Translations" in this blog post a few years back(该帖子包含了我刚刚提到的方法的详细信息,顺便提一下)。我的想法是,不要将其视为规范化问题,而是将其视为数据类型问题:产品名称是单条信息,而翻译只是单个值的一部分。实际上,不是将数据分成多个表,而是将其全部压缩到原始列中。 My specific implementation is for PostgreSQL,所以我不知道这在MySQL中是多么实用,如果类型与DBMS没有很好的集成,那么性能上有一些棘手的问题,但我没有发现它的缺陷。基本方法。