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