在sql中拥有行或列是否更高效?

时间:2012-03-20 12:33:10

标签: mysql sql database performance normalization

如果我必须保存许多相关的字符串,并且可以用不同的语言进行分类:最好的方法是什么?

我想我有以下选择。选项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值(一个线视图,两行,长描述等),如果这是感兴趣的话。

4 个答案:

答案 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更不规范,但它很容易使用。我们已经构建了这样的数据库翻译。在我们开发代码时,我们创建字符串资源填写英文文本。后来,翻译员填写了他们语言的字符串。