数据库设计中用table_id还是id更常见

Is it more common to use table_id or id in database design

我有一种情况想知道使用 table_id 还是只使用 id 更常见? (在我看来,如果它是外键,使用 table_ 会引起轻微的混淆)。人们更喜欢哪一个,两者之间真的有什么区别吗?还是应该只选择一个并保持一致?

tables 中的列命名有两个主流:

架构命名空间

该策略是 70 年代记录数据库“数据字典”的团队构想的传统策略。这个想法是列的名称本身告诉您它在整个模式或数据库中属于哪个 table。例如,CLIENT_NAME 将代表 CLIENT table.

中的客户名称

此策略有多种变体,其中将有限数量的字母指定为前缀(特别是 M:N 关系 tables),因为当时列名被限制为 6 或 8 个字符在许多数据库中。例如,客户购买汽车的日期可以采用 CLI_CAR_DATECLICAR_DATE 甚至 CLCADT.

的形式

示例:

  • 实体table“汽车”的主键“id”列将被命名为CAR_ID
  • table 指向 到“汽车”的子 table“文档”的外键将采用相同的形式:CAR_ID。这允许使用自然连接;但是,应该指出,有令人信服的理由不惜一切代价避免自然连接,此处不予讨论。
  • 与“人”有多个(两个)关系(卖方和买方)的 table“转让”上的外键会污染此策略。它们可以命名为:PERSON_BUYER_IDPERSON_SELLER_ID 因为两者不能重名 PERSON_ID;它不再允许自然连接(好)。

Table 命名空间

在这个策略(即较新的)中,列名不包括它们所属实体的名称,而只包括它们的 属性 名称。这种策略更符合对象设计,并产生更短的名称(即更少的输入)。提及栏目时必须注明table的名称。例如,您需要在 table CLIENT.

上说出列 NAME

示例:

  • 实体table“car”的主键“id”列将被命名为ID
  • table 指向 到“汽车”的子 table“文档”的外键将采用以下形式:CAR_ID;这与之前的策略相同。
  • 与“人”有多个(两个)关系(卖方和买方)的 table“转让”上的外键可以命名为:BUYER_IDSELLER_ID。他们可以像以前的策略一样遵循较长的名称,但这里的目标通常是使用较短的名称,以便应用程序源代码更易于编写和调试。

总结

我个人比较喜欢第二种,但是也有队伍同时坚持这两种策略,没有明显的赢家。我倾向于第二个 [我认为] 第一个的缺点是名称更长(输入更多)、更长 SQL(更多错误)、名称神秘(它们不能很好地与 ORM 和应用程序对象一起使用),以及不能很好遵循策略的外键。事实上,无论具体实体如何,我数据库中的几乎所有主键都被命名为 ID

但另一方面,一些团队非常重视仅通过查看就知道列的 table 名称的想法。这对于可能变得相当复杂的大型数据库(具有 200-1000 个关系 fact tables)非常有用,特别是对于团队的新成员。

但最重要的是,选择一个并保持一致。