完全唯一行的表的主键?

时间:2014-06-12 12:48:24

标签: 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"

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

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

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

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

1 个答案:

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