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

Я видел, как многие люди добавляли первичный ключ на многие из многих таблиц, но я думаю, что это не важно и тратить пространство. так что это правильно?

Кстати, я использую PostgreSQL

+1

Композитный первичный ключ (user_id, lang_code), причем оба являются внешними ключами. – Esailija

+0

Рассмотрим полный код отношения n: m, которое я опубликовал только вчера в [соответствующем ответе] (http://stackoverflow.com/a/13259085/939860). Так вы обычно это делаете. –

ответ

4

Лично я бы с раствором 4:

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

with composite PRIMARY KEY (user_id, lang_code) 

Я не думаю, добавив суррогатный ключ (user_lang_id в 3 решения) действительно добавляет любое значение схему и просто добавляет другую колонку, о которой нужно беспокоиться. Первичный ключ - хорошая идея, но для поддержания уникальности - без него вы можете добавить одну и ту же комбинацию user_id/lang_code несколько раз.

+0

спасибо за ваш ответ lc – Ahmad

+0

, так что user_id (PK, FK) и lang_code (PK, FK) правильно? – Ahmad

+0

@ Амад Да, вот что я имею в виду. –

2

Композитный первичный ключ на (user_id,lang_code) - общий подход. Вам может понадобиться суррогатная ПК, если вы хотите, чтобы ссылка в другой таблице была user_language, или если вы сохраните некоторые другие атрибуты в этой таблице. Но даже в этом случае у вас обычно есть уникальное ограничение на (user_id,lang_code)

Смежные вопросы