数据库设计中用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_DATE
、CLICAR_DATE
甚至 CLCADT
.
的形式
示例:
- 实体table“汽车”的主键“id”列将被命名为
CAR_ID
。
- table 指向 到“汽车”的子 table“文档”的外键将采用相同的形式:
CAR_ID
。这允许使用自然连接;但是,应该指出,有令人信服的理由不惜一切代价避免自然连接,此处不予讨论。
- 与“人”有多个(两个)关系(卖方和买方)的 table“转让”上的外键会污染此策略。它们可以命名为:
PERSON_BUYER_ID
和 PERSON_SELLER_ID
因为两者不能重名 PERSON_ID
;它不再允许自然连接(好)。
Table 命名空间
在这个策略(即较新的)中,列名不包括它们所属实体的名称,而只包括它们的 属性 名称。这种策略更符合对象设计,并产生更短的名称(即更少的输入)。提及栏目时必须注明table的名称。例如,您需要在 table CLIENT
.
上说出列 NAME
示例:
- 实体table“car”的主键“id”列将被命名为
ID
。
- table 指向 到“汽车”的子 table“文档”的外键将采用以下形式:
CAR_ID
;这与之前的策略相同。
- 与“人”有多个(两个)关系(卖方和买方)的 table“转让”上的外键可以命名为:
BUYER_ID
和 SELLER_ID
。他们可以像以前的策略一样遵循较长的名称,但这里的目标通常是使用较短的名称,以便应用程序源代码更易于编写和调试。
总结
我个人比较喜欢第二种,但是也有队伍同时坚持这两种策略,没有明显的赢家。我倾向于第二个 [我认为] 第一个的缺点是名称更长(输入更多)、更长 SQL(更多错误)、名称神秘(它们不能很好地与 ORM 和应用程序对象一起使用),以及不能很好遵循策略的外键。事实上,无论具体实体如何,我数据库中的几乎所有主键都被命名为 ID
。
但另一方面,一些团队非常重视仅通过查看就知道列的 table 名称的想法。这对于可能变得相当复杂的大型数据库(具有 200-1000 个关系 fact tables)非常有用,特别是对于团队的新成员。
但最重要的是,选择一个并保持一致。
我有一种情况想知道使用 table_id 还是只使用 id 更常见? (在我看来,如果它是外键,使用 table_ 会引起轻微的混淆)。人们更喜欢哪一个,两者之间真的有什么区别吗?还是应该只选择一个并保持一致?
tables 中的列命名有两个主流:
架构命名空间
该策略是 70 年代记录数据库“数据字典”的团队构想的传统策略。这个想法是列的名称本身告诉您它在整个模式或数据库中属于哪个 table。例如,CLIENT_NAME
将代表 CLIENT
table.
此策略有多种变体,其中将有限数量的字母指定为前缀(特别是 M:N 关系 tables),因为当时列名被限制为 6 或 8 个字符在许多数据库中。例如,客户购买汽车的日期可以采用 CLI_CAR_DATE
、CLICAR_DATE
甚至 CLCADT
.
示例:
- 实体table“汽车”的主键“id”列将被命名为
CAR_ID
。 - table 指向 到“汽车”的子 table“文档”的外键将采用相同的形式:
CAR_ID
。这允许使用自然连接;但是,应该指出,有令人信服的理由不惜一切代价避免自然连接,此处不予讨论。 - 与“人”有多个(两个)关系(卖方和买方)的 table“转让”上的外键会污染此策略。它们可以命名为:
PERSON_BUYER_ID
和PERSON_SELLER_ID
因为两者不能重名PERSON_ID
;它不再允许自然连接(好)。
Table 命名空间
在这个策略(即较新的)中,列名不包括它们所属实体的名称,而只包括它们的 属性 名称。这种策略更符合对象设计,并产生更短的名称(即更少的输入)。提及栏目时必须注明table的名称。例如,您需要在 table CLIENT
.
NAME
示例:
- 实体table“car”的主键“id”列将被命名为
ID
。 - table 指向 到“汽车”的子 table“文档”的外键将采用以下形式:
CAR_ID
;这与之前的策略相同。 - 与“人”有多个(两个)关系(卖方和买方)的 table“转让”上的外键可以命名为:
BUYER_ID
和SELLER_ID
。他们可以像以前的策略一样遵循较长的名称,但这里的目标通常是使用较短的名称,以便应用程序源代码更易于编写和调试。
总结
我个人比较喜欢第二种,但是也有队伍同时坚持这两种策略,没有明显的赢家。我倾向于第二个 [我认为] 第一个的缺点是名称更长(输入更多)、更长 SQL(更多错误)、名称神秘(它们不能很好地与 ORM 和应用程序对象一起使用),以及不能很好遵循策略的外键。事实上,无论具体实体如何,我数据库中的几乎所有主键都被命名为 ID
。
但另一方面,一些团队非常重视仅通过查看就知道列的 table 名称的想法。这对于可能变得相当复杂的大型数据库(具有 200-1000 个关系 fact tables)非常有用,特别是对于团队的新成员。
但最重要的是,选择一个并保持一致。