MySQL Unique Key而不是PK

时间:2017-06-01 11:51:22

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

我有两张表messagehashtag

enter image description here

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

message表: enter image description here

hashtag表: enter image description here

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

问题:

如果我们有唯一的(id hashtag)对,那么hashtag表中的message_id列是否合理?

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

2 个答案:

答案 0 :(得分:1)

如果你有一个"自然" PRIMARY KEY,可以避免添加AUTO_INCREMENT(或'序列'),这是好的(通常是有利的)。

如果1:多:

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可能会浪费!

答案 1 :(得分:0)

您可能是正确的,因为您希望对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上使用唯一约束。