按国家/地区设计语言表的最佳方法是什么?

时间:2016-02-03 09:22:46

标签: database-design

我正在设计一个language数据库表,我已经提出了以下字段

id (auto increment)
name (Name of the language)
iso_code (ISO code, example: en)
language_code (Ex: en-us for US english)
locale

上表更通用,并未指定国家/地区的不同语言。 例如,马来西亚有3种语言英语(en),马来语(ms)和中文(zh)。

将国家/地区链接到语言表是一种好习惯吗? 我能想到的一个用例是当人们从马来西亚访问网站时,我应该能够在马来西亚向用户提供可用的语言。

[[更新]]

Language
----------
id      name                code    locale
-----------------------------------------------
1       English             en      
2       American English    en-US   en_US.UTF-8
3       British English     en-GB
4       Malaysia Malay      ms-MY   
5       Chinese             zh

Country
------------
id  name            iso_code_2      iso_code_3
----------------------------------------------
1   Malaysia        MY              MYS     
2   United States   US              USA     
3   China           CN              CHN     


Malaysia has three languages Malay, English and Chinese then my third table would look like this


Country_Language
----------------------------
id      language_id     country_id
-----------------------------------
1       1               1
2       4               1
3       5               1

如果我是马来西亚支持的查询语言,我将能够从上表中获得结果。不过我想(language_id, country_id)应该是 UNIQUE

1 个答案:

答案 0 :(得分:2)

将国家/地区链接到语言表是一种好习惯吗?

不,不是,因为它违反了规范化。

包括这些国家会导致重复数据。按照你的例子:

id  name       ...  country
---------------------------------
 1  English    ...  Great Britain
 2  English    ...  Malaysia
 3  English    ...  Canada
 4  Norwegian  ...  Norway
 5  Hungarian  ...  Hungary

(' ...'代表您所有其他列。顺便说一句,如果您使用国家/地区ID而不是全名,问题仍然相同。)

如你所见'英语'连同它的连接数据显示三次。这种重复会导致所谓的更新异常。

相反,您应该创建第三个表(我假设已经存在国家表),其中包含国家和语言之间的关系:

language_id  country_id
-----------------------
1            42

您还应该仔细查看iso_codelanguage_codename之间的依赖关系。不知道你想要存储在locale中的内容,我只能指出其他三个之间的功能依赖关系。这也会导致冗余。

特别是当一个应用程序将基于它构建时,你实际上可能会对这里较低的正常形式感到高兴。然而,你应该意识到这个问题,如果方便的话,有意识地打破正常化。