直接进入这一个。我有一张桌子用于"喜欢"特征。该表自然具有以下内容:
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(用于" Like"),DELETE(用于"与"不同)和按照最近的顺序搜索喜欢的帖子或给予他们的成员
每个条目显然都非常“独特”。 - 因为每个人每个帖子只需要一个像。似乎绝对不需要唯一的主索引,好像重复发生(不知何故)我想要将它们全部删除,而不仅仅是具有特定ID的一个。与插入相同,没有人可以两次相同的东西。而这些"喜欢"只会使用其他表中的索引选择。
然而,phpMyAdmin现在禁止任何手动编辑,复制或删除。这也很好,但促使我进一步查找没有主键的后勤工作。当我找到一个stackoverflow答案时,一般意见是它非常罕见"不需要主键。
所以,要么我发现了这些非常罕见的时刻之一,要么根本不是那么罕见。我的场景似乎很简单和常见,所以应该有一个更明确的答案。一切看起来都很自然,我永远不需要实际使用主键。因此,我认为没有一个更简单。有没有任何真正神秘(有点神奇)的MySQL我可以忽略的方式?或者我可以放弃一个无用的自动递增主ID密钥(无论如何,它可以在任何当前使用的ID之前达到其限制方式)至少直到我找到它们的用途(从不)?
答案 0 :(得分:3)
您已经说过帖子ID和会员ID定义了列的唯一性(并且该主题ID是次要的,仅为方便起见而包含在内)。
那么,为什么不在(Post ID, Member ID)
上拥有主键?如果你已经对它们有UNIQUE
个约束,那么这不是一个大的飞跃。
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
字段;如果您正确设置了外键,那么在没有它的情况下发布< - >主题查找应该是微不足道的,在这种情况下,您重复数据并违反关系模型!