如果我必须保存许多相关的字符串,并且可以用不同的语言进行分类:最好的方法是什么?
我想我有以下选择。选项1和3对我来说是最明确的解决方案。它们有更多的列,但会产生更少的行。
选项2和4是最灵活的(我可以在不更改数据库的情况下动态添加新的string_x)。它们只有三列,但它们会产生很多行。
选项5会产生许多表格。
选项1:
id | string_1 | string_2 | string_3 | string_4 | ... | string_n | lang
选项2 *(其中name为string_1或string_2等。)*
id | name | lang
选项3
id | string_1 | string_2 | string_3 | string_4 | ... | string_n
id | lang | stringid
选项4
id | lang | stringid
id | name
选项5
id | string_1 | lang
id | string_2 | lang
id | ... |lang
我正在使用它来存储多个视图的预先缓存的html值(一个线视图,两行,长描述等),如果这是感兴趣的话。
答案 0 :(得分:5)
不建议使用选项1和3,因为您最终会在字段名称中使用该语言(即数据)。如果要添加其他语言,则必须更改数据库设计。
不建议使用选项5,因为您最终会在表名中使用字符串标识符(即数据)。如果要添加另一个字符串,则必须更改数据库设计。
选项2或4可以正常工作。选项4更规范化,因为您没有重复的字符串名称,但如果直接在表视图中输入值,则选项2可能更容易使用。
表中有很多行不是问题,这就是为数据库系统构建的。
答案 1 :(得分:0)
虽然我没有专门处理多语言界面,如果这是它的全部目的,是翻译,我会选择1,但交换,像
id英语法语德语西班牙语等...
所以你基本上会有一个主列(例如英语)作为总是填充的“主要”单词,然后在可用的情况下填写其他语言列。这样,你可以继续添加尽可能多的“单词” “如你所知,如果他们填充所有不同的语言,那就这样吧......如果没有,你仍然可以使用”主要“值。
答案 2 :(得分:0)
这取决于很多其他事情。首先,可以有多少个字符串?有多少种语言?为简化起见,假设这些数字中的任何一个大于5,那么选项1和3是不可行的。
在进一步讨论之前,您一定要考虑在数据库之外实现多语言功能。在PHP中,您可以使用Gettext并将翻译数据放在平面文件中。出于多种原因,这是一个更好的主意,主要原因是外部翻译的性能和易用性。
如果绝对必须在数据库中执行此操作,则应使用与此类似的表结构:
id | string | language
示例条目是:
welcome_message | Hello, World! | english
我认为你在选项2 中描述过。为了澄清,根据不同语言和不同字符串的数量,您应该使用具有固定数量字段的单个表。
答案 3 :(得分:0)
如果您只支持几种语言,您可能还会考虑每种语言都有自己的列的架构:
ID EN ES FR Etc...
这比您的选项4更不规范,但它很容易使用。我们已经构建了这样的数据库翻译。在我们开发代码时,我们创建字符串资源填写英文文本。后来,翻译员填写了他们语言的字符串。