更具体地说,我创建了一个带有标签系统的新闻模块。由于每个标记都是唯一的(作为管理员,您不允许创建两个相同的标记),id列仍然有用吗?我想没有,但我想知道演出的情况。id | mews_title |日期…<---------->新闻id |标签id<---------->id |标签名称与id | mews_title |日期…<---------------->新闻id |标记名<------------->标记名谢谢!
n8ghc7c11#
性能差异不大。在示例中使用数字id作为标记的优点是:
id
对于您的案例,这些可能不是重要的考虑因素。因此,不需要使用数字id。我在我的书《SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming》中题为“需要ID”的一章中也提到了这一点。
iklwldmw2#
你甚至不需要一个标签表。只是一张table
news_id | tag_name
这是news_id和标记之间的多对多Map。由于没有标记表,重复的问题就消失了。同一个标记(tag_name)可以与许多新闻文章相关联,但这正是您想要的。INSERT INTO Tags (news_id, tag_name)——将其更改为INSERT IGNORE INTO Tags (news_id, tag_name),这样您就不必担心同一篇新闻文章会以相同的方式标记两次。并且有
tag_name
INSERT INTO Tags (news_id, tag_name)
INSERT IGNORE INTO Tags (news_id, tag_name)
PRIMARY KEY(news_id, tag_name), -- uniqueness and lookup tags for one article INDEX(tag_name, news_id) -- For finding all articles for one tag
kgsdhlau3#
数字ID不是必需的(您可以有一个没有主键的表),但它们很有用:
您可以将tag_name指定为唯一的,因此无法插入两个相等的tag_name。
3条答案
按热度按时间n8ghc7c11#
性能差异不大。
在示例中使用数字
id
作为标记的优点是:对于您的案例,这些可能不是重要的考虑因素。因此,不需要使用数字
id
。我在我的书《SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming》中题为“需要ID”的一章中也提到了这一点。
iklwldmw2#
你甚至不需要一个标签表。只是一张table
这是news_id和标记之间的多对多Map。由于没有标记表,重复的问题就消失了。同一个标记(
tag_name
)可以与许多新闻文章相关联,但这正是您想要的。INSERT INTO Tags (news_id, tag_name)
——将其更改为INSERT IGNORE INTO Tags (news_id, tag_name)
,这样您就不必担心同一篇新闻文章会以相同的方式标记两次。并且有kgsdhlau3#
数字ID不是必需的(您可以有一个没有主键的表),但它们很有用:
您可以将tag_name指定为唯一的,因此无法插入两个相等的tag_name。