Реляционная база данных - двойной первичный ключ в одной таблице? - PullRequest
0 голосов
/ 20 сентября 2010

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

alt text

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

itemId= 1 & userId = 1

должно быть разрешено следующее:

itemId= 2 & userId = 1
itemId= 1 & userId = 2

следующее НЕ должно быть разрешено:

itemId= 1 & userId = 1

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Да.Создайте первичный ключ для itemId и userId.

Чтобы сделать это в T-SQL (SQL Server), вы должны использовать что-то вроде:

CREATE TABLE rating (
  itemId int NOT NULL
    CONSTRAINT fk_rating_item FOREIGN KEY REFERENCES item ( itemId ),
  userId int NOT NULL
    CONSTRAINT fk_rating_user FOREIGN KEY REFERENCES [user] ( userId ),
  thumbsUp int,
  thumbsDown int,
  CONSTRAINT pk_rating PRIMARY KEY ( itemId, userId )
)

(Предполагается, что ваша таблица элементов 'item ', а ваша таблица пользователей -' user '.)

Я не уверен, почему у вас есть значение для больших и больших пальцев вниз?Если это логическое значение, вам может понадобиться только одно: если thumbs up равен 0, то это в любом случае эффективно thumbs down.

Редактировать: Определение составных ключей

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

Это комбинация двух, которые должны быть уникальными, а не каждая часть ключа в отдельности.

0 голосов
/ 20 сентября 2010

Использовать составной первичный ключ (первичный ключ, состоящий из 2 столбцов).

CREATE TABLE Rating 
(
 itemID     INT NOT NULL
,userID     INT NOT NULL
,thumbsUP   INT NOT NULL
,thumbsDown INT NOT NULL
,PRIMARY KEY (itemID, userID)
);
0 голосов
/ 20 сентября 2010

Большинство баз данных позволяют составные первичные ключи, сделанные из нескольких столбцов. Какую базу данных вы используете?

Интересное, связанное обсуждение: Каковы недостатки использования составного / составного первичного ключа?

Пример типа MySQL:

createuserratings.sql
CREATE TABLE USERRATINGS
( 
    itemId     INT NOT NULL,
    userId     INT NOT NULL,
    thumbsUp   INT NOT NULL,
    thumbsDown INT NOT NULL,
    PRIMARY KEY (itemID, userID)
);

Выполните поиск составных / составных первичных ключей в документации mySQL, и вы должны получить много информации (я не использую mySQL).

...