[英]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.