关系数据库设计 - 一个表中的双主键?

时间:2010-09-20 00:48:55

标签: mysql database-design primary-key

我有一个表来保持用户对商品的评分。 我想允许每个用户只对项目评分一次,有没有办法强制数据库不允许重复itemId和userId?

alt text

我不希望每个单独的字段都是主键。 我希望主键同时基于它们。 例如,有一行:

itemId= 1 & userId = 1
应该允许

以下:

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

以下不应该被允许:

itemId= 1 & userId = 1

3 个答案:

答案 0 :(得分:3)

是。在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 )
)

(这假设您的商品表是'商品'而您的用户表是'用户'。)

我不确定为什么你的拇指和拇指都有价值?如果这是一个布尔值,你可能只需要一个:如果竖起大拇指为0,那么无论如何都会有所帮助。

编辑:复合键的定义

当您在一个表中的两列上创建主键时,这意味着它只需要对两个值都是唯一的,即只要每个userId不同,它将允许具有相同itemId的任意数量的行,反之亦然。

两者的组合必须是唯一的,而不是单独的每个部分。

答案 1 :(得分:0)

大多数数据库将允许由多列组成的复合主键。您使用的是哪个数据库?

一个有趣的相关讨论:What are the down sides of using a composite/compound primary key?

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)。

答案 2 :(得分:0)

使用复合主键(由2列组成的主键)。

CREATE TABLE Rating 
(
 itemID     INT NOT NULL
,userID     INT NOT NULL
,thumbsUP   INT NOT NULL
,thumbsDown INT NOT NULL
,PRIMARY KEY (itemID, userID)
);
相关问题