主键/外键命名约定

Jer*_*emy 90 sql database-design naming-conventions

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

1:

Primary Table (Employee)   
Primary Key is called ID

Foreign table (Event)  
Foreign key is called EmployeeID
Run Code Online (Sandbox Code Playgroud)

要么

2:

Primary Table (Employee)  
Primary Key is called EmployeeID

Foreign table (Event)  
Foreign key is called EmployeeID
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ste*_*wig 71

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

SELECT name, address, amount
  FROM employees JOIN payroll USING (employee_id)
Run Code Online (Sandbox Code Playgroud)

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

通过使用相应域的名称标记每列的重要性来部分地传达.

  • 更好的是,它允许这样:`SELECT姓名,地址,金额FROM员工NATURAL JOIN payroll`. (6认同)
  • 我不会在部署的代码中使用自然连接,因为在添加模式的情况下它更加轻松.但对于交互式查询,它很棒. (5认同)
  • SQL语法和语义实际上给出了如何使用它的相当好的线索.例如,USING语法意味着具有相同域的列应具有相同的名称,NULL = NULL - > NULL表示NULL是"未知"而不是"不适用",而ON UPDATE CASCADE表示密钥只需要是唯一的,而不是不可变的. (4认同)
  • +1但总有例外.例如,如果工资核算中有两列,它们都是员工的外键(例如,一个对正在支付的人的引用,第二个对具有预算权限的管理员).但我们不能将*两个*外键命名为"employee_id". (3认同)

Rus*_*een 51

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

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

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

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

  • +1,对于常识......有更重要的事情需要争论..所以,按我的方式去做(选择2) (24认同)
  • 并且,对于自引用DRI,当有多个FK自引用相同的PK时,您必须违反这两个"标准",因为两个FK列的名称不能相同...例如,EmployeeTable与EmployeeId PK,SupervisorId FK,MentorId Fk,PartnerId FK等等...... (5认同)

KM.*_*KM. 12

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

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

  • 必须使用不匹配的列名来计算联接的+1 (4认同)
  • 在"旧系统"中,8个字符长名称的障碍比这更痛.我愿意走出困境,推测PK命名ID不是你正在处理的旧系统中噩梦的主要原因.在软件开发中,尤其是数据库中也经常使用"它在旧系统中被吸入".我经常看到人们根据他们在10年前发布的数据库系统上的工作方式,对任何给定的练习A进行辩护. (4认同)
  • 几年后,今天的艺术_应用程序将会出现问题.您甚至可以重写界面,或者使用其他平台中的数据,但您的数据(包括列名)需要经得起时间的考验. (2认同)
  • 那么20年前人们应该以某种方式使用今天有意义的列名,即使它们只有8个字符?数据存储格式在过去20年中发生了巨大变化,并将在接下来的20年内再次发生变化.没有办法证明您的偏好比所列出的其他方法更能经得起时间的考验.当人们在20年内进行讨论时,"列名"本身可能是"旧的废话",因为我们存储和操纵数据的能力有所提高.表是一种不完美代表数据关系的人类构造...... (2认同)

Wou*_*ter 7

您考虑过以下事项吗?

Primary Table (Employee)   
Primary Key is PK_Employee

Foreign table (Event)  
Foreign key is called FK_Employee
Run Code Online (Sandbox Code Playgroud)

  • 我无法忍受人们投反对票而不给出理由。这是一个完全有效的答案,对于某些人来说是否可接受是另一个问题,但这是主观的,不需要投反对票。 (6认同)