sql - 主键/外键命名约定

在我们的开发组中,我们就主键和外键的命名约定进行了激烈辩论。 我们小组基本上有两种思想流派:

1:

Primary Table (Employee)   
Primary Key is called ID

Foreign table (Event)  
Foreign key is called EmployeeID

要么

2:

Primary Table (Employee)  
Primary Key is called EmployeeID

Foreign table (Event)  
Foreign key is called EmployeeID

我不想在任何列中复制表的名称(所以我更喜欢上面的选项1)。 从概念上讲,它与其他语言中的许多推荐实践一致,在这些实践中,您不在其属性名称中使用对象的名称。 我认为命名外键Employee(或EmployeeID可能更好)告诉读者它是PersonAge表的PersonAge列。

其他一些人更喜欢选项2,您可以在其中命名前缀为表名的主键,以便整个数据库中的列名相同。 我明白了这一点,但你现在无法在视觉上区分主键和外键。

此外,我认为在列名中包含表名是多余的,因为如果您将表视为实体而将列视为该实体的属性或属性,则将其视为Employee的ID属性, 不是员工的EmployeeID属性。 我不去问我的同事他的PersonAgePersonGender是什么。 我问他的年龄是多少。

就像我说的那样,这是一场激烈的争论,我们继续谈论它。 我有兴趣获得一些新的观点。

Jeremy asked 2019-09-11T00:23:25Z
13个解决方案
68 votes

如果两个表中的两列具有相同的名称(约定#2),则可以使用SQL中的USING语法来保存一些键入和一些样板噪声:

SELECT name, address, amount
  FROM employees JOIN payroll USING (employee_id)

支持约定#2的另一个论点是它是关系模型的设计方式。

每列的意义是   通过标记来部分传达   相应域的名称。

Steven Huwig answered 2019-09-11T00:24:36Z
45 votes

这并不重要。 我从未遇到过选择1和选择2之间存在真正差异的系统。

杰夫阿特伍德在这个话题上有一篇很棒的文章。 基本上人们争论并最激烈地争论那些他们无法证明错误的主题。 或者从不同的角度来看,这些话题只能通过基于最后一个人论点的阻挠风格耐力来赢得。

选择一个并告诉他们关注实际影响代码的问题。

编辑:如果你想玩得开心,请让他们详细说明为什么他们的方法优于递归表引用。

Russell Steen answered 2019-09-11T00:23:59Z
12 votes

我认为这取决于您的应用程序如何组合在一起。 如果您使用ORM或设计表来表示对象,那么选项1可能适合您。

我喜欢将数据库编码为自己的图层。 我控制一切,应用程序只调用存储过程。 结果集具有完整的列名称是很好的,特别是当连接了许多表并返回了许多列时。 有了这个应用程序,我喜欢选项2.我真的很想看到列名在连接上匹配。 我曾经在他们不匹配的旧系统上工作,这是一场噩梦,

KM. answered 2019-09-11T00:25:08Z
3 votes

这两种惯例都不适用于所有情况,为什么要有一个呢? 使用常识......

例如,对于自引用表,当有多个FK列自引用同一个表的PK时,您必须违反这两个“标准”,因为两个FK列的名称不能相同......例如 ,EmployeeTable与EmployeeId PK,SupervisorId FK,MentorId Fk,PartnerId FK,......

Charles Bretana answered 2019-09-11T00:25:40Z
3 votes

我同意他们之间几乎没有选择。 对我来说,关于任一标准的更重要的是“标准”部分。

如果人们开始“做自己的事情”,他们应该被他们的仆人串起来。 恕我直言 :)

MatBailie answered 2019-09-11T00:26:10Z
2 votes

我工作的惯例非常接近A,除了我们以复数形式命名表(即“employees”)并在表名和列名之间使用下划线。 它的好处是,要引用一个列,它可以是“employees _ id”或“employees.id”,具体取决于您希望如何访问它。 如果您需要指定列来自哪个表,“employees.employees _ id”肯定是多余的。

Jarett Millard answered 2019-09-11T00:26:35Z
2 votes

如果您正在查看应用程序代码,而不仅仅是数据库查询,有些事情对我来说似乎很清楚:

  1. 表定义通常直接映射到描述一个对象的类,因此它们应该是单数的。 为了描述一个对象的集合,我通常将“数组”或“列表”或“集合”附加到单数名称,因为它比使用复数更清楚地表明它不仅是一个集合,而且是一个什么样的集合 它是。 在该视图中,我看到一个表名不是集合的名称,而是一个集合的对象类型的名称。 不编写应用程序代码的DBA可能会忽略这一点。

  2. 我处理的数据通常使用“ID”进行非密钥识别。为了消除关键“ID”和非关键“ID”之间的混淆,对于主键名,我们使用“Key”(即它是什么,不是吗?)前缀为表名或缩写表名。这个前缀(我只为主键保留这个)使得键名称唯一,这一点尤为重要,因为我们使用与数据库列名相同的变量名,并且大多数类都有一个父类,由名称标识父键。这也需要确保它不是保留关键字,单独使用“密钥”。为了便于保持关键变量名一致,并提供进行自然连接的程序,外键与它们作为主键的表中使用的名称相同。我不止一次遇到过使用自然连接以这种方式工作得更好的程序。在最后一点,我承认我使用的自引用表有问题。在这种情况下,我会对外键命名规则进行例外处理。例如,我将使用ManagerKey作为Employee表中的外键指向该表中的另一条记录。

Bruce Patin answered 2019-09-11T00:27:17Z
2 votes

我喜欢习俗#2 - 在研究这个主题时,在发布我自己的问题之前找到这个问题,我遇到了以下问题:

我从具有大量列的表中选择*并将其连接到具有大量列的第二个表。 两个表都有一个“id”列作为主键,这意味着我必须专门挑选每一列(据我所知),以便在结果中使这两个值唯一,即:

SELECT table1.id AS parent_id, table2.id AS child_id

虽然使用约定#2意味着我仍然会在结果中使用相同名称的某些列,但我现在可以指定我需要哪个ID(父或子),并且正如Steven Huwig建议的那样,USING语句进一步简化了事情。

JYelton answered 2019-09-11T00:27:56Z
2 votes

我总是在一个表上使用userId作为PK,在另一个表上使用userId作为FK。 我正在认真考虑使用userIdPK和userIdFK作为名称来识别另一个。 在查看表时,它将帮助我快速识别PK和FK,并且在使用PHP / SQL访问数据时,它似乎会清除代码,使其更容易理解。 特别是当别人看我的代码时。

Ross answered 2019-09-11T00:28:21Z
2 votes

你考虑过以下几点吗?

Primary Table (Employee)   
Primary Key is PK_Employee

Foreign table (Event)  
Foreign key is called FK_Employee
Wouter answered 2019-09-11T00:28:45Z
1 votes

我使用约定#2。 我正在使用遗留数据模型,我不知道在给定的表中代表什么。 啰嗦的伤害在哪里?

OMG Ponies answered 2019-09-11T00:29:11Z
1 votes

如何命名外键

ROLE_ID

其中role是被引用实体相对于手头表的角色。 这解决了递归引用和多个fks到同一个表的问题。

在许多情况下,它将与引用的表名相同。 在这种情况下,它与您的一个提案完全相同。

无论如何,长篇大论是一个坏主意

Jens Schauder answered 2019-09-11T00:30:01Z
0 votes

“在哪里”员工INNER JOIN命令ON order.employee_id = employee.id“是否需要额外的资格?”。

没有必要获得额外的资格,因为我所谈到的资格已经存在。

“业务用户引用订单ID或员工ID的原因是提供上下文,但在dabase级别,您已经拥有上下文,因为您正在引用该表”。

祈祷,告诉我,如果该列被命名为“ID”,那么“对表格的引用[原文如何”完全是如何完成的,除非通过我所谈到的方式完全符合ID列的引用?

answered 2019-09-11T00:30:45Z
translate from https://stackoverflow.com:/questions/1369593/primary-key-foreign-key-naming-convention