2012-11-07 25 views
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) 

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

BTW我使用PostgreSQL的

+1

复合主键(user_id,lang_code),两者都是外键。 – Esailija

+0

考虑一下我在昨天发布在[这个相关答案](http://stackoverflow.com/a/13259085/939860)中的n:m关系的完整代码示例。这就是你通常这样做的方式。 –

回答

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组合。

+0

感谢您的回答lc – Ahmad

+0

所以user_id(PK,FK)和lang_code(PK,FK)对不对? – Ahmad

+0

@Ahmad是的,这就是我的意思。 –

2

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