gpt4 book ai didi

mysql - 如何安排MySQL数据库跟踪关联到多个主键的用户?

转载 作者:行者123 更新时间:2023-11-29 05:41:30 32 4
gpt4 key购买 nike

我在 MySQL 中有一个表,其中包含多个报告的事件(主键、提交日期和文本)。用户可以“喜欢”或“+1”报告,类似于 facebook/google。现在,用户可以无限次地“喜欢”单个事件。安排数据库以检查他之前是否同意的最佳方式是什么?

我考虑添加一个可以存储大量文本的列,如果他同意(逗号分隔),则将用户添加到该文本 block 。然后我可以稍后分解文本并搜索它以查看他的名字是否在其中。但是,我想一定有更好的方法来解决这个问题 - 有什么建议吗?

最佳答案

我会使用三个表:eventuseruser_likes_event

CREATE TABLE `event` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`submitted` DATE NULL ,
`text` TEXT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;

CREATE TABLE `user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;

CREATE TABLE `user_likes_event` (
`event_id` INT UNSIGNED NOT NULL ,
`user_id` INT UNSIGNED NOT NULL ,
PRIMARY KEY (`event_id`, `user_id`) ,
INDEX `fk_user_id` (`user_id` ASC) ,
INDEX `fk_event_id` (`event_id` ASC) ,
CONSTRAINT `fk_event_id`
FOREIGN KEY (`event_id` )
REFERENCES `event` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id` )
REFERENCES `user` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;

插入一些值:

INSERT INTO `event` (submitted, text) VALUES
('2011-06-20', 'Event 1'),
('2011-06-21', 'Event 2'),
('2011-06-22', 'Event 3');

INSERT INTO `user` (name) VALUES
('Tom'), ('Dick'), ('Harry');

INSERT INTO `user_likes_event` (event_id, user_id) VALUES
(1,1), (1,2), (1,3),
(2,1), (2,2), (2,3),
(3,1), (3,2), (3,3);

现在每个用户都喜欢每个事件一次。如果 Tom 再次尝试点赞事件 1,则会抛出主键约束错误:

INSERT INTO `user_likes_event` (event_id, user_id) VALUES (1,1);

ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

如果你不想抛出错误,你可以尝试条件插入:

INSERT INTO `user_likes_event` (event_id, user_id)
SELECT 1,1 FROM DUAL
WHERE NOT EXISTS (
SELECT event_id, user_id FROM `user_likes_event`
WHERE event_id = 1 AND user_id = 1
);

参见 this question有关 INSERT WHERE NOT EXISTS 备选方案的想法。

参见 SELECT Syntax有关 DUAL 表的更多信息。

关于mysql - 如何安排MySQL数据库跟踪关联到多个主键的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6435332/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com