我正在设计一个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 。
答案 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_code
,language_code
和name
之间的依赖关系。不知道你想要存储在locale
中的内容,我只能指出其他三个之间的功能依赖关系。这也会导致冗余。
特别是当一个应用程序将基于它构建时,你实际上可能会对这里较低的正常形式感到高兴。然而,你应该意识到这个问题,如果方便的话,有意识地打破正常化。