Mysql 关系数据库设计-一个表中的双主键?
我有一个表,用于保存项目的用户评分。 我想允许每个用户只对一个项目进行一次评分,有没有办法强制数据库不允许itemId和userId重复 我不希望每个字段都是主键。 我希望主键同时基于这两个键。 例如,有一行: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= 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框架,然后以一种相当简单的方式将属性绑定到关系中,那么最终将得到一个表,其中从未有实体引用关系或关系引用其他关系。至少,一开始不是。我怀疑把这个逻辑放进数据库。似乎它应该属于其余的验证代码。我怀疑是否将此逻辑放入数据库。似乎它应该属于其余的验证代码。