SQL中是否始终需要ID列?

1l5u6lss  于 2022-10-22  发布在  Mysql
关注(0)|答案(3)|浏览(148)

更具体地说,我创建了一个带有标签系统的新闻模块。由于每个标记都是唯一的(作为管理员,您不允许创建两个相同的标记),id列仍然有用吗?我想没有,但我想知道演出的情况。
id | mews_title |日期…<---------->新闻id |标签id<---------->id |标签名称

id | mews_title |日期…<---------------->新闻id |标记名<------------->标记名
谢谢!

n8ghc7c1

n8ghc7c11#

性能差异不大。
在示例中使用数字id作为标记的优点是:

  • 使交集表稍微小一些,因为整数平均比字符串小
  • 允许通过更新一行而不是多行来更改标记名的拼写

对于您的案例,这些可能不是重要的考虑因素。因此,不需要使用数字id
我在我的书《SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming》中题为“需要ID”的一章中也提到了这一点。

iklwldmw

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),这样您就不必担心同一篇新闻文章会以相同的方式标记两次。并且有

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
kgsdhlau

kgsdhlau3#

数字ID不是必需的(您可以有一个没有主键的表),但它们很有用:

  • 如果没有和ID列,如果您想在将来更改标记名(例如,因为它拼写错误),则必须更新具有此外键(tag_tag_name)的所有表。如果您有ID列,则只需在一个位置更改标记名。
  • 它们可以自动生成(自动增量)。
  • 它可以占用更少的空间。例如,当自然主键是复合的并且是另一个表中的外键时,id(一个整数列)主键占用的空间更少。
  • 与其他表进行连接更容易(如果主键只有一列,而不是有多个)。
  • 如果表的主键都是ID字段,那么在进行连接时不必记住其他字段的名称,那么数据模式语法将保持一致。

您可以将tag_name指定为唯一的,因此无法插入两个相等的tag_name。

相关问题