(在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,但这似乎不是非常人性化。
这是要走的路?
答案 0 :(得分:0)
您的第二个示例是使用Attribute-Value Model。如果(正如您所说的那样),您需要经常添加更多列和/或如果您的大多数实体不需要所有列,否则它们会留下NULL
。
缺点是它使查询编写起来更复杂,这就是我尽可能避免使用它的原因 - 我认为简单更重要的是担心必须偶尔添加一列。除非需要非常频繁地添加新列,例如,如果最终用户需要在运行时添加新字段,那么我将使用您的第一个选项 - 具有语言属性的语言表和每当您使用的外键需要它。您可能甚至不需要id
列,只需使用lng
作为自然键。
像MongoDB这样的无架构数据库可以更好地处理这个问题。它没有列的概念,因此您可以随时开始存储新数据,如果您有一个不需要所有字段的实体,则只需指定它们。
答案 1 :(得分:-1)
您可以尝试以JSON格式对其进行编码,因此您可以使用
id | value
------------------
1 | { "lng":"en" , "text direction":"ltr" , .... }
哪个需要最少的列