假设我有两个表,用户和语言
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
答案 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)