SQL表中的ID字段:规则还是法律?

SQL表中的ID字段:规则还是法律?,sql,Sql,只是一个快速的数据库设计问题:您总是在每个表中使用一个ID字段,还是只在大多数表中使用?显然,您的大多数表都会受益,但是否有一些表您可能不想使用ID字段 例如,我想添加向另一个表foo中的对象添加标记的功能。所以我有一个table FooTag,其中一个varchar字段用于保存标记,另一个fooID字段用于引用foo中的行。我真的需要围绕一个基本上任意的ID字段创建聚集索引吗?使用fooID和我的文本字段作为聚集索引不是更有效吗,因为我几乎总是按fooID进行搜索?另外,在聚集索引中使用我的文

只是一个快速的数据库设计问题:您总是在每个表中使用一个ID字段,还是只在大多数表中使用?显然,您的大多数表都会受益,但是否有一些表您可能不想使用ID字段

例如,我想添加向另一个表foo中的对象添加标记的功能。所以我有一个table FooTag,其中一个varchar字段用于保存标记,另一个fooID字段用于引用foo中的行。我真的需要围绕一个基本上任意的ID字段创建聚集索引吗?使用fooID和我的文本字段作为聚集索引不是更有效吗,因为我几乎总是按fooID进行搜索?另外,在聚集索引中使用我的文本将保持数据的排序,当我必须查询数据时,排序会更容易。缺点是插入需要更长的时间,但这不会被选择过程中的收益抵消吗?选择过程中的收益会发生得更频繁

你对ID字段有什么看法?可弯曲的规则,还是牢不可破的法律


编辑:我知道提供的示例没有规范化。如果标记是项目的一个主要部分,多个表被标记,以及其他“附加”,那么两个表的解决方案将是一个明确的答案。然而,在这种最简单的情况下,规范化是否值得?这将节省一些空间,但在运行查询时需要额外的联接

如果需要从该表中检索具有唯一id的记录,则选择“是”。如果您将通过由外键组成的其他复合键检索它们,则为否。您最不需要的是不使用的字段、数据和索引。

如果您需要从该表中检索具有唯一id的记录,则为是。如果您将通过其他由外键组成的复合键来检索它们,则不会。您最不需要的是您不使用的字段、数据和索引。

就像许多编程一样:规则,而不是法律


例外证明:某些两列表的存在只是为了在其他更有意义的表之间形成关系。

就像许多编程一样:规则,而不是法律


例外证明:某些两列表的存在只是为了在其他更有意义的表之间形成关系。

聚集索引也不需要位于主键或代理标识列上

但是,您的设计没有规范化。通常,对于标记,我使用两个表,一个是带有代理键的标记表,另一个是使用标记表中的代理键和主题表中的主键从标记到主题表的链接表。这允许您的标签应用于不同的实体照片、文章、员工、地点、产品等。它允许您对多个表强制执行外键关系,还允许您创建标记层次结构和关于标记表的其他内容


至于此设计中的索引,它将由使用模式决定。

聚集索引也不需要位于主键或代理标识列上

但是,您的设计没有规范化。通常,对于标记,我使用两个表,一个是带有代理键的标记表,另一个是使用标记表中的代理键和主题表中的主键从标记到主题表的链接表。这允许您的标签应用于不同的实体照片、文章、员工、地点、产品等。它允许您对多个表强制执行外键关系,还允许您创建标记层次结构和关于标记表的其他内容


至于此设计中的索引,它将由使用模式决定。

如果您正在制作连接两个或多个其他表的表,并且您只需要双PK/FK字段,那么我不知道为什么您也需要ID列


ID列通常是非常有用的,但这并不意味着你应该在每一个场合都添加它们。

如果你正在制作两个或多个其他表之间的表格,并且你只需要双PK/FK字段,那么我不知道为什么你也需要ID列


ID列通常是非常有用的,但这并不意味着你应该在每一个场合都添加它们。

正如其他人所说,这是一个通用的规则,而不是绝对的规则,例如,有很多带有复合键的异常表


有时,您可能希望在已经具有通常为复合唯一标识符的表中创建一个人工ID,但这是非常有用的。例如,在一个系统中,我创建了一个表来存储零件号;虽然零件号是唯一的,但它们实际上可能会改变-我们添加了一个任意整数PartID。不太常见,但这是一个典型的现实世界的例子。

正如其他人所说,这是一个一般的规则,而不是绝对的规则,例如,有很多带有复合键的异常表

那里
有时,您可能需要在已经具有通常复合唯一标识符的表中创建一个人工ID。例如,在一个系统中,我创建了一个表来存储零件号;虽然零件号是唯一的,但它们实际上可能会改变-我们添加了一个任意整数PartID。不太常见,但这是一个典型的现实例子。

一般来说,如果可能的话,您真正想要的是能够以某种方式唯一地标识记录。它可以是一个id字段,也可以是一个唯一的索引,不必只在一个字段上。任何时候,我认为我可以逃脱而不创造一种方法来唯一地识别一个记录,我被证明是错误的。不过,并非所有表都有一个自然键,如果没有,则确实需要有某种id文件。如果你有一个自然键,你可以用它来代替,但是我发现即使这样,在大多数情况下我也需要一个id字段,以防止在自然键改变时需要做太多的更新,因为它看起来总是在改变。再加上已经处理了数百个数据库,涉及许多不同的主题,我可以告诉你,真正的自然密钥是罕见的。正如其他人所提到的,表中不需要id字段来连接两个具有多对多关系的表,但即使这样,也应该有一个唯一的索引。

通常,您真正想要的是能够以某种方式唯一地标识记录。它可以是一个id字段,也可以是一个唯一的索引,不必只在一个字段上。任何时候,我认为我可以逃脱而不创造一种方法来唯一地识别一个记录,我被证明是错误的。不过,并非所有表都有一个自然键,如果没有,则确实需要有某种id文件。如果你有一个自然键,你可以用它来代替,但是我发现即使这样,在大多数情况下我也需要一个id字段,以防止在自然键改变时需要做太多的更新,因为它看起来总是在改变。再加上已经处理了数百个数据库,涉及许多不同的主题,我可以告诉你,真正的自然密钥是罕见的。正如其他人所提到的,在一个表中不需要一个id字段来连接两个具有多对多关系的表,但即使这样也应该有一个唯一的索引。

一般来说,开发人员喜欢在除“链接”表之外的所有表上都有一个id字段,因为这使开发更加容易,我也不例外。另一方面,DBA认为制作由3列或4列组成的自然主键没有问题。要想获得一个好的数据库设计,这可能是一件非常困难的事情。

一般来说,除了“链接”表之外,开发人员喜欢在所有表上都有一个ID字段,因为它使开发更加容易,我也不例外。另一方面,DBA认为制作由3列或4列组成的自然主键没有问题。为了得到一个好的数据库设计,这可能是一场激烈的较量