繁体   English   中英

完全唯一行的表的主键?

[英]Primary keys for a table of completely unique rows?

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

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"

如您所见,没有主键。 这似乎很自然。 唯一需要执行的功能是INSERT(用于“喜欢”),DELETE(用于“不喜欢”)和按照最近的顺序搜索喜欢的帖子或提供给他们的成员。

每个条目显然都非常“独特” - 因为每个帖子每人只需要一个。 似乎绝对不需要唯一的主索引,好像重复发生(不知何故)我想要将它们全部删除,而不仅仅是具有特定ID的一个。 与插入相同,没有人可以两次相同的东西。 而这些“喜欢”只能使用其他表中的索引进行选择。

然而,phpMyAdmin现在禁止我进行任何手动编辑,复制或删除。 这也很好,但促使我进一步查找没有主键的后勤工作。 当我发现stackoverflow的答案时,一般的意见是,“非常罕见”不需要主键。

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

您已经说过帖子ID和成员ID定义列的唯一性(并且该主题ID是次要的,仅为方便起见而包含)。

那么,为什么没有主键(Post ID, Member ID) 如果你已经对它们有了UNIQUE ness约束,那么这不是一个很大的飞跃。

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 ,我会考虑删除TopicID字段; 如果你的外键设置正确,那么在没有它的情况下发布< - >主题查找应该是微不足道的,在这种情况下你复制数据并违反关系模型!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM