2015-10-18 3 views
1

Предположим, что у меня есть таблица со следующими столбцами:Внешний ключ - идентификатор или просто UNIQUE столбец

CREATE TABLE users 
{ 
    id INTEGER PRIMARY KEY, 
    login VARCHAR(50) UNIQUE, 
    password VARCHAR(50) 
} 

И мне нужно, чтобы создать таблицу, которая будет хранить одно печенье для каждой учетной записи. Что лучше - создать внешний ключ, который ссылается на login колонки из первой таблицы

CREATE TABLE cookies 
{ 
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    login VARCHAR(50) FOREIGN KEY REFERENCES users(login) 
} 

или создать внешний ключ, который ссылается на id колонки?

CREATE TABLE cookies 
{ 
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    expires DATETIME, 
    id_user INTEGER FOREIGN KEY REFERENCES users(id) 
} 

И почему?

+0

Я предпочитаю соответствовать FK пользователей (id), что наилучшим образом. – Chandru

+1

Какова цель столбца cookie? Это столбец или несколько столбцов в таблице cookie? Это одна строка в таблице cookie для пользователя? Или может быть несколько? Что делать, если вы добавили этот столбец в таблицу пользователей напрямую? –

+0

Если память обслуживает, по крайней мере, в sql-сервере, вы должны использовать первичный ключ, по крайней мере, с одной стороны ограничения внешнего ключа (в одной-на одной стороне должны быть первичный ключ) –

ответ

3

Хорошо, поскольку у вас есть несколько столбцов в таблице cookie, и поскольку это отдельная сущность, я согласен, и имеет смысл взять эти дополнительные столбцы в отдельной таблице. Как насчет pks и fks? Поскольку у вас есть только одна строка для каждого пользователя я бы userid в primary key и foreign key одновременно:

cookies 
{ 
    id_user(pk, fk), 
    cookie, 
    expires 
} 
+0

Спасибо за ответ! Как я могу добавить строку о конкретном пользователе в эту таблицу? – FrozenHeart

+0

Сначала вы добавляете строку в таблицу users, а затем в таблицу coocie. Немного непонятно, в чем проблема добавления строки в таблицу? –

+0

В порядке - http://sqlfiddle.com/#!9/91cdce? – FrozenHeart

1
CREATE TABLE cookies 
{ 
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    login VARCHAR(50) FOREIGN KEY REFERENCES users(login) 
} 

Я думаю, что это лучший вариант, так как вам нужно общаться с login.

+0

Обратите внимание: в MySQL эта строка: 'login VARCHAR (50) FOREIGN KEY REFERENCES users (login)' будет ** не создавать FOREIGN KEY **. Столбец будет там, но определение FK будет грустно и довольно молча игнорируется. –

1

Использование внешнего ключа, который относится к первичному ключу таблицы пользователей:

create a foreign key that refers to the id column? 

CREATE TABLE cookies 
(
    id INTEGER PRIMARY KEY, 
    cookie VARCHAR(50), 
    expires DATETIME, 
    user_id INTEGER, 
    FOREIGN KEY (user_id) REFERENCES users(id) 
) 

Причина для этого в качестве общей конвенции является то, что пользователи (идентификатор) первичный ключом является непреложным значением. Столбец «Логин» или любой другой, который представляет метаданные об объекте, внешнем по отношению к базе данных, может со временем меняться и поэтому менее подходит для использования в ссылках на внешние ключи.

+0

Обратите внимание, что в MySQL эта строка: 'id_user INTEGER FOREIGN KEY REFERENCES users (id)' будет ** не создавать FOREIGN KEY **. Столбец будет там, но определение FK будет грустно и довольно молча игнорируется. –

+0

Нет, встроенные определения внешних ключей игнорируются во всех двигателях. Вам нужно определить внешний ключ отдельно. См.: ** [Использование внешнего ключа и ссылок для ON DELETE CASCADE в mysql] (http://dba.stackexchange.com/questions/14070/using-foreign-key-and-references-for-on-delete-cascade- in-mysql/14086 # 14086) ** –

+0

Хорошо, я удалил свой комментарий. Вы можете прояснить свой комментарий, чтобы показать, как правильно выполнять внешние ключи, поскольку это поможет лучше ответить на вопрос. –

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