【问题标题】:MySQL Unique Key instead of PKMySQL 唯一键而不是 PK
【发布时间】:2017-06-01 11:51:22
【问题描述】:

我有两张桌子messagehashtag

一条消息可以有多个主题标签。但一条消息没有重复的主题标签。

message 表:

hashtag 表:

在表 hashtag 中,我们必须使用键,id 的一个 PRIMARY 和另一个 UNIQUE 键(hashtagmessage_id)。

问题:

如果我们有唯一的 (hashtag message_id) 对,使用 hashtag 表中的 id 列是否有意义?

如果id没有必要,是否存在一些性能问题或其他缺点?

【问题讨论】:

  • 在表标签中。是什么让它与众不同?它是 message_id 本身还是与 hashtag 和 message_id 的组合?让我问一下,消息上可以有一个或多个主题标签吗?
  • @Arion 是的 message 可以有多个 hashtags。但一条消息没有重复的主题标签。
  • 那么是一对一的关系?
  • @Arion 一对多,检查更新
  • 您的message 表可能也有 [4, food, 3] 吗?如果是这样,你需要“many:many”。

标签: mysql performance database-performance unique-constraint unique-key


【解决方案1】:

如果您有一个“自然”PRIMARY KEY,则可以(并且通常有利)避免添加 AUTO_INCREMENT(或“序列”)。

如果 1:many:

CREATE TABLE hashtag (
    hashtag VARCHAR(6) NOT NULL,
    message_id INT     NOT NULL,
    PRIMARY KEY(hashtag),
    INDEX      (message_id, hashtag)
);

对于很多:很多

CREATE TABLE hashtag (
    hashtag VARCHAR(6) NOT NULL,
    message_id INT     NOT NULL,
    PRIMARY KEY(hashtag, message_id),
    INDEX      (message_id, hashtag)
);

进一步讨论:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

在 MySQL 中,使用 ENGINE=InnoDB,并且始终使用显式的 PRIMARY KEY。请记住,PK 是一个 UNIQUE 键,是一个 INDEX

另一个问题...INT 总是 4 个字节。 VARCHAR(6)(假设是英文文本)占用 1 到 7 个字节。你猜怎么了? VARCHAR(6) 可能平均而言会更小。因此,为每个主题标签分配 INT id 可能会浪费空间和速度!

【讨论】:

    【解决方案2】:

    您可能是对的,您希望对 ID/消息 ID 进行unique 约束。

    但是,在不知道具体情况的情况下,我认为更好的设计应该是

    HASHTAG (ID, HASTAG_TEXT)ID为PK

    MESSAGE (ID, MESSAGE_TEXT)ID为PK

    HASTAG_TO_MESSAGE(HASHTAG_ID, MESSAGE_ID)两者都是PK

    您可能还需要一个“序列号”,在这种情况下,您需要在所有列上都有一个 PK,并在两个 ID 上都有一个唯一约束。

    【讨论】:

    • 感谢您的回答。 对 ID/消息 ID 的约束 是什么意思?我对hashtagmessage_id 有唯一的约束。 :) 根据 DB 的设计,我显示 message 表是重要的表,如果没有消息就没有主题标签,如果我删除消息,它将通过级联删除所有相关的主题标签。
    • 对两个 ID 的唯一限制是,您在同一条消息上不能多次使用相同的主题标签。如果您遵循我的设计,请执行级联删除,以便在您删除消息时删除 HASHTAG_TO_MESSAGE。如果您不遵循此设计,则意味着必须针对其出现的每条消息重复每个主题标签。这可能是您想要的,也可能不是。这也意味着您可能还没有主题标签 ID。我的方式更传统。
    • 是的,同意你的方式传统而清晰。但请考虑我的桌子设计。 是的,我想为它出现的每条消息重复标签。如果我有 (hashtag, message_id) 的唯一键,我是否需要在 hashtag 表中进行 PK?如果没有,唯一密钥解决方案是否存在一些性能问题或其他缺点?
    • 在这种情况下 a) 您的主题标签和消息 ID 是根据定义唯一的 PK,并且 b) 您不需要该 ID。我不担心性能。不确定我是否 100% 理解...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多