MySQL-使用主键-唯一索引相关表多对多

MySQL-使用主键-唯一索引相关表多对多,mysql,primary-key,create-table,unique-index,b-tree-index,Mysql,Primary Key,Create Table,Unique Index,B Tree Index,快乐的一天 我正在创建一个电影数据库,所有电影都将为每个用户获得一张投票票,按照电影本身的价值,“好的、好的或公平的”这些投票票存储在一个表[movies\u has\u rating]中,该表具有投票用户的ID、投票类型和创建日期,我需要确保并防止一个用户可以两次参与一部电影,因为每个用户只允许一次投票,虽然我已经通过PHP和MySQL查询完成了这一点,但仍然有可能从MySQL手动添加它,并且也能够建立相同的默认MySQL,我的问题是: 1)如果字段定义为[vote id]和[user\U i

快乐的一天

我正在创建一个电影数据库,所有电影都将为每个用户获得一张投票票,按照电影本身的价值,“好的、好的或公平的”这些投票票存储在一个表[movies\u has\u rating]中,该表具有投票用户的ID、投票类型和创建日期,我需要确保并防止一个用户可以两次参与一部电影,因为每个用户只允许一次投票,虽然我已经通过PHP和MySQL查询完成了这一点,但仍然有可能从MySQL手动添加它,并且也能够建立相同的默认MySQL,我的问题是:

1)如果字段定义为[vote id][user\U id]主键,则可以避免对同一影片的用户进行两次评估,例如

CREATE TABLE `user_has_rating` (
    `movie_id`  int UNSIGNED NOT NULL ,
    `vote_id`  int UNSIGNED NOT NULL ,
    `user_id`  int UNSIGNED NOT NULL ,
    `create_at`  datetime NOT NULL ,
    PRIMARY KEY (`vote_id`, `user_id`)
)
2)当字段唯一索引[vote id][user\u id]已经定义为主键时,有必要将其添加到字段中,当我们定义主键时,使用唯一索引具有优势和差异

CREATE TABLE `user_has_rating` (
    `movie_id`  int UNSIGNED NOT NULL ,
    `vote_id`  int UNSIGNED NOT NULL ,
    `user_id`  int UNSIGNED NOT NULL ,
    `create_at`  datetime NOT NULL ,
    PRIMARY KEY (`vote_id`, `user_id`),
    UNIQUE INDEX `vote_id` (`vote_id`) ,
    UNIQUE INDEX `user_id` (`user_id`) 
);
3)需要指定索引的方法类型,例如“BTREEHASH


非常感谢你的帮助,非常感谢

我个人认为设置是错误的,你应该有一个表,其中列出了所有电影,并有一个ID。该ID属于表
user\u has\u rating
,以了解用户是否对该电影投票。唯一键或多个键应该与此无关。@X否则,非常感谢您,如果更正了此问题,我将逐步指定电影的字段。@Learning and Shareing 1)您不需要投票id
主键(电影id,用户id)
将执行您想要的操作。2) 不,你没有。用户id上的唯一键将阻止用户投票两部不同的电影。3) 你不需要。如果您不指定,将使用默认值。@Rocki,这样,非常感谢您的回答,您可以在许多电影中投票,但只能在一部电影中投票,我的问题很清楚,将[vote id]和[user_id]列定义为主要列更方便吗?或者定义唯一索引[投票id]和[用户id]?我个人认为设置是错误的,您应该有一个表,其中列出了所有电影并有一个id。该id属于表
user\u has\u rating
,以了解用户是否对该电影投票。唯一键或多个键应该与此无关。@X否则,非常感谢您,如果更正了此问题,我将逐步指定电影的字段。@Learning and Shareing 1)您不需要投票id
主键(电影id,用户id)
将执行您想要的操作。2) 不,你没有。用户id上的唯一键将阻止用户投票两部不同的电影。3) 你不需要。如果您不指定,将使用默认值。@Rocki,这样,非常感谢您的回答,您可以在许多电影中投票,但只能在一部电影中投票,我的问题很清楚,将[vote id]和[user_id]列定义为主要列更方便吗?或者定义唯一索引[投票id]和[用户id]?
CREATE TABLE `user_has_rating` (
    `movie_id`  int UNSIGNED NOT NULL ,
    `vote_id`  int UNSIGNED NOT NULL ,
    `user_id`  int UNSIGNED NOT NULL ,
    `create_at`  datetime NOT NULL ,
    PRIMARY KEY (`vote_id`, `user_id`),
    UNIQUE INDEX `vote_id` (`vote_id`) USING BTREE ,
    UNIQUE INDEX `user_id` (`user_id`) USING BTREE 
);