我有两张表message
和hashtag
:
一条消息可以有多个主题标签。但是没有重复的一条消息的主题标签。
在表格hashtag
中,我们必须使用密钥,一个id
PRIMARY和另一个UNIQUE密钥(hashtag
,message_id
)。
问题:
如果我们有唯一的(id
hashtag
)对,那么hashtag
表中的message_id
列是否合理?
如果id
没有必要,是否存在性能问题或其他缺点?
答案 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上使用唯一约束。