2

假设我有两个表,用户和语言

user (Table Name)
-----------------
user_id (PK)
user_name
mobile
...
....

language (Table Name)
---------------------
lang_code (PK)
lang_name
...
....

问题是,如果我想在用户和语言表(多对多)之间添加关系,这是正确的方法吗?

solution 1

user_language (Table Name)
--------------------------
user_id (FK)
lang_code (FK)


or solution 2

user_language (Table Name)
--------------------------
user_id (PK)
lang_code (PK)


or solution 3

user_language (Table Name)
--------------------------
user_lang_id (PK)
user_id (FK)
lang_code (FK)

我看到很多人在多对多表上添加主键,但我认为这并不重要并且浪费空间。那么哪个是正确的?

顺便说一句,我正在使用 PostgreSQL

4

2 回答 2

4

就个人而言,我会选择解决方案 4:

用户语言
---------------
user_id (FK)
语言代码 (FK)

使用复合 PRIMARY KEY (user_id, lang_code)

我不认为添加代理键(user_lang_id在解决方案 3 中)真的会为模式添加任何值,而只是添加另一个需要担心的列。主键是保持唯一性的好主意 - 没有它,您可以多次添加相同的 user_id/lang_code 组合。

于 2012-11-07T16:22:39.487 回答
2

复合主键(user_id,lang_code)是一种通用的方法。如果您想在另一个表中引用user_language,或者如果您在此表中存储一些其他属性,则可能需要代理 PK。但即使在这种情况下,您通常也会对(user_id,lang_code)

于 2012-11-07T16:28:14.053 回答