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

Mysql 关系数据库设计-一个表中的双主键?,mysql,database-design,primary-key,Mysql,Database Design,Primary Key,我有一个表,用于保存项目的用户评分。 我想允许每个用户只对一个项目进行一次评分,有没有办法强制数据库不允许itemId和userId重复 我不希望每个字段都是主键。 我希望主键同时基于这两个键。 例如,有一行: itemId= 1 & userId = 1 应允许以下情况: itemId= 2 & userId = 1 itemId= 1 & userId = 2 itemId= 1 & userId = 1 不允许出现以下情况: itemId= 2 &a

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

我不希望每个字段都是主键。 我希望主键同时基于这两个键。 例如,有一行:

itemId= 1 & userId = 1
应允许以下情况:

itemId= 2 & userId = 1
itemId= 1 & userId = 2
itemId= 1 & userId = 1
不允许出现以下情况:

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

对。在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 )
)
(假设项目表为“项目”,用户表为“用户”。)

我不知道为什么你的拇指向上和向下都有一个值?如果这是一个布尔值,您可能只需要一个:如果thumbs up为0,那么实际上就是thumbs down

编辑:复合关键点的定义

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


这两者的组合必须是唯一的,而不是钥匙的每个部分都是唯一的。

是的。在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 )
)
(假设项目表为“项目”,用户表为“用户”。)

我不知道为什么你的拇指向上和向下都有一个值?如果这是一个布尔值,您可能只需要一个:如果thumbs up为0,那么实际上就是thumbs down

编辑:复合关键点的定义

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


这两者的组合必须是唯一的,而不是键的每个部分都是唯一的。

大多数数据库都允许由多个列组成复合主键。您正在使用哪个数据库

有趣的相关讨论:

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

大多数数据库都允许从多个列生成复合主键。您正在使用哪个数据库

有趣的相关讨论:

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列组成)


谢谢,如果我不想有一个复合主键,我会做什么不同的事情呢?我会说你不会做任何不同的事情。评级是一个连接表,在这种情况下,它是在用户表和项目表之间建立关系的唯一方法。谢谢,如果我不想使用复合主键,我会做什么不同的事情呢?我想说,您不会做任何不同的事。评级是一个连接表,在这种情况下,是在用户表和项目表之间建立关系的唯一方法。使用复合主键的一个缺点是,如果与其他表存在关系,那么最终也可能需要复合外键。在这个例子中,它可能不是一个因素,但在其他例子中它可能变得复杂。假设每个评分都有许多段落和附件,每个段落和附件都有自己的表格。然后这些表也需要itemId和userId列,并且在更新和查询中必须小心使用这两个键。或者,您可以为评级表使用一个代理键,并使用约束强制itemId和userId的唯一性。但是,如果您将主题分析为实体和关系,并将所有属性绑定到此ER框架,然后以一种相当简单的方式将属性绑定到关系中,那么最终将得到一个表,其中从未有实体引用关系或关系引用其他关系。至少一开始不是这样。使用复合主键的一个缺点是,如果与其他表存在关系,那么最终也可能需要复合外键。在这个例子中,它可能不是一个因素,但在其他例子中它可能变得复杂。假设每个评分都有许多段落和附件,每个段落和附件都有自己的表格。然后这些表也需要itemId和userId列,并且在更新和查询中必须小心使用这两个键。或者,您可以为评级表使用一个代理键,并使用约束强制itemId和userId的唯一性。但是,如果您将主题分析为实体和关系,并将所有属性绑定到此ER框架,然后以一种相当简单的方式将属性绑定到关系中,那么最终将得到一个表,其中从未有实体引用关系或关系引用其他关系。至少,一开始不是。我怀疑把这个逻辑放进数据库。似乎它应该属于其余的验证代码。我怀疑是否将此逻辑放入数据库。似乎它应该属于其余的验证代码。