mysql - 完全唯一行的表的主键?

标签 mysql database

直接进入这个。我有一张表,用于表示一种“喜欢”的功能。这张表自然有以下内容:

Name      | Type   | Attributes  | (Comment)
Post ID   | int    | index       | ID of the post which was "Liked"
Topic ID  | int    | index       | ID of the topic which contains the "Liked" post
Member ID | int    | index       | ID of the member who "Liked" the post
Date      | bigint | index       | Date/time of "Like"

如您所见,没有主键。这似乎很自然。唯一需要执行的功能是插入(表示“喜欢”)、删除(表示“不喜欢”)以及按帖子或提供点赞的成员按最近点赞的顺序搜索点赞。

每个条目显然都非常“独特”——因为每个人每个帖子只需要一个赞。似乎完全不需要唯一的主索引,就好像重复项(以某种方式)发生一样,我想将它们全部删除,而不仅仅是具有特定 ID 的索引。和插入一样,没有人可以喜欢同一件事两次。这些“喜欢”只会使用来自其他表的索引来选择。

然而,phpMyAdmin 现在禁止我进行任何手动编辑、复制或删除。这也很好,但促使我进一步查找没有主键的逻辑。当我找到一个 stackoverflow 答案时,普遍的看法是不需要主键的情况“非常罕见”。

所以,要么我发现了这些非常罕见的时刻之一,要么根本不那么罕见。我的场景看起来很简单和常见,所以应该有一个更明确的答案。这样一切看起来都很自然,我永远不需要实际使用主键。因此,我认为没有一个会更简单。我是否忽略了 MySQL 的任何真正神秘(并且有些神奇)的方式?或者我是否可以安全地省略一个无用的自动递增主 ID key (无论如何,它可能会在任何当前使用的 ID 之前达到其极限)至少直到我找到它们的用途(从不)?

最佳答案

您说过帖子 ID 和成员(member) ID 定义了列的唯一性(并且主题 ID 是次要的,只是为了方便而包含)。

那么,为什么不在 (Post ID, Member ID) 上设置一个主键呢?如果您已经对它们设置了 UNIQUEness 约束,那么这不是一个很大的飞跃。

CREATE TABLE `Likes` (
   `PostID`   INT UNSIGNED NOT NULL,
   `TopicID`  INT UNSIGNED NOT NULL,
   `MemberID` INT UNSIGNED NOT NULL,
   `Date`     DATETIME     NOT NULL,

   PRIMARY KEY (`PostID`, `MemberID`),
   FOREIGN KEY (`PostID`)   REFERENCES `Posts`   (`ID`) ON DELETE CASCADE,
   FOREIGN KEY (`MemberID`) REFERENCES `Members` (`ID`) ON DELETE CASCADE
) Engine=InnoDB;

(我对 TopicID 的了解还不够,无法为其提出关键约束,但您可能希望添加一些。)

当然,添加任意的自动递增字段是没有意义的,但这并不意味着您不能拥有有意义的主键。

顺便说一句,我会考虑删除 TopicID 字段;如果您的外键设置正确,那么在没有它的情况下进行后<->主题查找应该是微不足道的,在这种情况下,您正在复制数据并违反关系模型!

关于mysql - 完全唯一行的表的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24184840/

相关文章:

php - 使用 mysql 字段值填充饼图

php - 不关闭 mysql 连接是否有任何可能的负面影响

Java JSP Mysql 错误

java - native 存储过程与 Hibernate

mysql - 计算多列中出现的次数

database - 如何使 Docker Compose 服务构建依赖于另一项服务?

c# - 在 asp.net mvc 5 中删除角色

PHP 代码在 PHP CLI 中不起作用

php - mysql 按 id 将表 1 左连接到表 2,其中表 2 id 最新日期

c# - 在日期时间 c# 中格式化字符串以插入 MYSQL 日期时间列