2

(在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 文本描述,而在查询时直接使用 ids,但这似乎不太人性化。

哪条路要走?

4

2 回答 2

0

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

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

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

于 2012-11-24T10:33:18.900 回答
-1

您可以尝试以 JSON 格式对其进行编码,因此您会得到类似的东西

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

这将需要最少的列

于 2012-11-24T09:03:33.180 回答