Mysql SQL表是否受益或需要具有唯一的ID列?

Mysql SQL表是否受益或需要具有唯一的ID列?,mysql,sql-server,Mysql,Sql Server,根据我的经验,几乎所有的表都有一个名为Id的字段,该字段是唯一的主键并已编制索引。我的问题是,如果我没有在任何地方使用这个值,并且永远不会需要这个值,那么拥有它的好处是什么 我的问题是: 数据库有许多关系表(通常称为映射表),它们通过其唯一的ID将另外两个表链接在一起 前几行: Id=1机器Id=1用户Id=2 Id=2机器Id=1用户Id=3 今天,当代码更新此表时,它将删除机器的所有用户,然后继续添加所有当前用户。这就是他们选择删除旧条目的方式。问题是这会不必要地膨胀Id列,因为即使没有任何

根据我的经验,几乎所有的表都有一个名为Id的字段,该字段是唯一的主键并已编制索引。我的问题是,如果我没有在任何地方使用这个值,并且永远不会需要这个值,那么拥有它的好处是什么

我的问题是:

数据库有许多关系表(通常称为映射表),它们通过其唯一的ID将另外两个表链接在一起

前几行:

Id=1机器Id=1用户Id=2

Id=2机器Id=1用户Id=3

今天,当代码更新此表时,它将删除机器的所有用户,然后继续添加所有当前用户。这就是他们选择删除旧条目的方式。问题是这会不必要地膨胀Id列,因为即使没有任何更改,也会为每个用户删除/添加Id列。默认情况下,每90分钟发生一次

解决这个问题的一个方法是修复代码,以正确的方式进行操作。另一个解决方案是完全删除Id字段。既然我们不在其他地方链接到此表,也不在任何地方的代码中使用Id值(我们甚至不从DB中提取它),为什么我们需要它


回到我原来的问题。Id字段是否需要用于其他内容?或者它提供了一些我可能会失去的、我可能想要的好处吗?

不,这是不需要的,特别是对于那些多对多的关系,完全可以接受的就是没有它们

如果您与该表有外键关系,则这些ID特别有用,但即使如此,您也可以拥有由多个列的唯一组合组成的外键,因此即使对于外键,您也不需要它们,尽管非常推荐为此使用单值键

拥有一个你不需要的密钥的额外好处是,一旦你需要它,你就不需要添加它。几乎不是借口

如果您想在谷歌上搜索更多信息:

  • 这些多对多表通常称为“”或“交叉引用表”
  • 通常自动编号的“无意义”唯一ID也称为“”
  • 由多个字段组成的键(包括主键和外键)称为“”通常用作同义词,尽管维基百科的定义略有不同

不,不需要,特别是对于那些多对多的关系,完全可以接受不需要它们

如果您与该表有外键关系,则这些ID特别有用,但即使如此,您也可以拥有由多个列的唯一组合组成的外键,因此即使对于外键,您也不需要它们,尽管非常推荐为此使用单值键

拥有一个你不需要的密钥的额外好处是,一旦你需要它,你就不需要添加它。几乎不是借口

如果您想在谷歌上搜索更多信息:

  • 这些多对多表通常称为“”或“交叉引用表”
  • 通常自动编号的“无意义”唯一ID也称为“”
  • 由多个字段组成的键(包括主键和外键)称为“”通常用作同义词,尽管维基百科的定义略有不同

从技术上讲,你不需要有一个唯一的id,但有太多的情况下,没有一个id真的会把你搞砸。例如,考虑一本通讯录。你可能会认为“第一姓,姓,地址”足以确定某人,但考虑“约翰·史密斯,123大街”和“约翰·史密斯,123大街”(John Junior)。显而易见的解决方案:添加一个“Jr”字段,或者在密钥中添加更多内容,并一直希望您永远不会得到重复的。。。。或者,您只需添加一个自动增量ID字段,就可以使用它了。不管记录中有哪些字段是重复的,您都知道id字段是唯一的

如果愿意,可以很容易地创建一个唯一的复合键,但是如果需要设置外键关系,则必须复制外键表中所有这些键的字段

e、 g

现在,您已经在两个表中设置了pqrst字段,并且必须为每个联接操作完整地写出它们。然而,如果您有一个简单的单一ID字段:

table A (
    id -> primary key int
    p, q, r, s ,t
)

table B (
    h, i, j, k -> hwatever
    a_id -> int
    foreign key (a_id) -> A (id)
)

在两个表之间携带一个简单的int字段,v.s.
n
复合键中每个字段的字段。

从技术上讲,您不需要有唯一的id,但是有太多的情况下,没有一个会真的让您陷入困境。例如,考虑一本通讯录。你可能会认为“第一姓,姓,地址”足以确定某人,但考虑“约翰·史密斯,123大街”和“约翰·史密斯,123大街”(John Junior)。显而易见的解决方案:添加一个“Jr”字段,或者在密钥中添加更多内容,并一直希望您永远不会得到重复的。。。。或者,您只需添加一个自动增量ID字段,就可以使用它了。不管记录中有哪些字段是重复的,您都知道id字段是唯一的

如果愿意,可以很容易地创建一个唯一的复合键,但是如果需要设置外键关系,则必须复制外键表中所有这些键的字段

e、 g

现在,您已经在两个表中设置了pqrst字段,并且必须为每个联接操作完整地写出它们。然而,如果您有一个简单的单一ID字段:

table A (
    id -> primary key int
    p, q, r, s ,t
)

table B (
    h, i, j, k -> hwatever
    a_id -> int
    foreign key (a_id) -> A (id)
)

两个表之间有一个简单的int字段,v.s.
n
复合键中每个字段的字段。

简短回答:在这种情况下,您在问题中描述了,不需要ID列,如果愿意,您可以删除它,并将PK/Unique添加到使用链接表中的ID构建的表中

长答案(以我个人的观点):ID列用于加速使用大量连接的查询(比较一个整数通常比较简单)