如何有效地存储此语言设置数据?

时间:2012-11-24 08:56:02

标签: mysql database database-design

(在mysql数据库上),我想要一个包含不同语言的不同变量的表,例如:文字方向,是名字的第一个字母总是资本,我应该url编码链接等。

人类会这样想:

id | lng | text direction | url encode | 1st letter cap |
---------------------------------------------------------
1  | en  | ltr            | 0          | 1              |
2  | he  | rtl            | 1          | 0              |
3  | fr  | ltr            | 1          | 1              |

但是这样我可能会发现我必须添加更多列,我理解这不是很好的数据库设计。另一种选择是维护一个固定的2列表'id'和'lng',然后是这个表:

lng id | var            | val |
-------------------------------
1      | text direction | ltr |
1      | url encode     | 0   |
1      | 1st letter cap | 1   |
2      | text direction | rtl |
(and so on)

或者甚至可能有三个表:语言名称和ID,var名称和ID以及上面的表格 - 用var id替换var text description。

我甚至可能想忘记存储var文本描述,并在查询时使用id direclty,但这似乎不是非常人性化。

这是要走的路?

2 个答案:

答案 0 :(得分:0)

您的第二个示例是使用Attribute-Value Model。如果(正如您所说的那样),您需要经常添加更多列和/或如果您的大多数实体不需要所有列,否则它们会留下NULL

缺点是它使查询编写起来更复杂,这就是我尽可能避免使用它的原因 - 我认为简单更重要的是担心必须偶尔添加一列。除非需要非常频繁地添加新列,例如,如果最终用户需要在运行时添加新字段,那么我将使用您的第一个选项 - 具有语言属性的语言表和每当您使用的外键需要它。您可能甚至不需要id列,只需使用lng作为自然键。

像MongoDB这样的无架构数据库可以更好地处理这个问题。它没有列的概念,因此您可以随时开始存储新数据,如果您有一个不需要所有字段的实体,则只需指定它们。

答案 1 :(得分:-1)

您可以尝试以JSON格式对其进行编码,因此您可以使用

id | value
------------------
1  | { "lng":"en" , "text direction":"ltr" , .... }

哪个需要最少的列