多对多表中的主键

时间:2012-11-07 16:20:03

标签: sql postgresql

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

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

2 个答案:

答案 0 :(得分:4)

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

user_language
---------------
user_id (FK)
lang_code (FK)

with composite PRIMARY KEY (user_id, lang_code)

我不认为在解决方案3中添加代理键(user_lang_id)确实会为架构添加任何值,只需添加另一列就必须担心。主键是一个好主意,但保持唯一性 - 没有它,你可以多次添加相同的user_id / lang_code组合。

答案 1 :(得分:2)

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

有唯一约束