主键/外键命名约定[关闭]主键/外键命名约定[关闭](Primary key/foreign Key

2019-05-12 23:40发布

在我们的开发组,我们有关于小学和外键的命名约定激烈争论。 有基本上我们组两个思想流派:

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)。 从概念上讲,它是一个有很多其他语言中的建议的做法,在那里你不其属性名称使用对象的名称一致。 我认为,命名外键EmployeeID (或Employee_ID可能会更好),告诉读者,这是该ID的列Employee表。

有些人喜欢选择2,你使列名在整个数据库中的同名表名作为前缀的主键。 我看到这一点,但你现在不能在视觉上区分外键的主键。

另外,我觉得它是多余的列名有表名,因为,如果你认为该表作为一个实体和该实体的属性或属性的列的,你认为它的的ID属性Employee ,不是EmployeeID雇员的属性。 我不走了问我的同事他有什么PersonAgePersonGender是。 我问了他的年龄是什么。

所以,就像我说的,这是一个激烈争论,我们去和和了。 我很想得到一些新的观点。

Answer 1:

这其实并不重要。 那里是选择1和选择2之间的真正区别我从来没有碰到的系统。

杰夫阿特伍德有一个伟大的文章,关于这一主题而回。 基本上,人们讨论和争论最疯狂,他们不能错了就证明这些主题。 或从不同的角度,那些只能通过基于阻挠风格耐力最后一名站立的论点赢得主题。

选择一个,并告诉他们把重点放在真正影响你的代码问题。

编辑:如果你想玩得开心,让他们在长度指定为什么他们的方法是优越的递归表的引用。



Answer 2:

如果两列两个表中具有相同的名称(约定#2),可以使用using语法SQL节省一些打字和一些样板噪音:

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

赞成约定#2另一种说法是,它就是这样的关系模型的设计。

每一列的意义部分地由与相应的域的名称标记它输送。



Answer 3:

我认为这取决于你的,你的应用程序是如何放在一起。 如果你使用ORM或设计自己的表来表示的对象,然后选择1可能适合你。

我喜欢写代码数据库作为其自身的层。 我控制一切和应用程序只是调用存储过程。 这是不错的结果集完整的列名,尤其是当有很多表连接和多列返回。 有了这个S型的应用,我喜欢选择2。我真的想看到的列名匹配连接。 我对老制度,因为它们不匹配的工作,这是一个噩梦,



Answer 4:

无论是约定适用于所有的情况下,为什么有一个呢? 使用常识...

例如,对于自我引用表中,当有一个以上的FK列,自我引用同一个表的PK,你必须侵犯了“标准”,因为这两个FK列名不能是相同的......如,EmployeeTable中与雇员PK,SupervisorId FK,MentorId FK,FK PARTNERID,...



Answer 5:

我认为,有一点他们之间做出选择。 对我来说,无论是有关标准更加显著的是“标准”的一部分。

如果人们开始“做自己的事”,他们应该由他们的虚空被绞死。 恕我直言 :)



Answer 6:

我们用在我工作的惯例是相当接近A,与我们的名字的复数形式(即“员工”),并使用表和列名之间凸显表除外。 它的好处是指一列,它要么“员工_ ID”或“employees.id”,这取决于你想如何访问它。 如果你需要指定列从,将在什么表“employees.employees _ ID”绝对是多余的。



Answer 7:

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

  1. 表定义通常直接映射到描述一个对象的类,所以它们应该是单数。 为了描述一个对象的集合,我通常是“阵列”或“列表”或“收藏”追加到奇异的名字,因为它比使用复数的更清楚地表明,不仅在于它是一个集合,但什么样的集合它是。 在该视图中,我看到一个表名作为集合的不是名称,而是对象的类型,其中它是一个集合的名称。 谁不写应用程序代码DBA可能会错过了这一点。

  2. 我处理的数据通常用于非关键识别目的“ID”。 为了消除键“ID” S及非关键“ID”之间的混淆,主键的名称,我们使用“钥匙”(这是它是什么,不是吗?)与表名称或缩写的前缀表名。 这个前缀(我保留这个只针对主键)的独特之处键名,因为我们使用的变量名是相同的数据库列名,和大多数类有一个家长,由名称标识这一点特别重要父项。 这也需要确保它不是一个保留关键字,其中“关键”单是。 为了方便保持关键变量的名称一致,并提供该做自然连接方案,外键具有相同的名称,在其是主键的表使用。 我有比工作更好地使用自然连接这样一旦碰到程序的更多。 关于最后一点,我承认有自引用表,这是我使用的问题。 在这种情况下,我会破例外键的命名规则。 例如,我会用ManagerKey作为Employee表的外键指向该表的另一个记录。



Answer 8:

我喜欢约定#2 - 在研究这个课题,并张贴我自己之前发现了这个问题,我跑进了问题,即:

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

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

虽然使用约定#2意味着我仍然有相同名称的结果某些列,我现在可以指定我需要(父母或子女) ID,正如史蒂芬Huwig建议的, USING的语句简化的东西进一步。



Answer 9:

我一直使用的userid另一台作为FK在一个桌子和一个userId的 PK。 “M认真考虑使用userIdPKuserIdFK作为名称来标识一个从其他。 这会帮助我快速识别PK和FK看表时,它看起来像它使用PHP / SQL来访问数据更容易理解,当将清理代码。 尤其是当别人看我的代码。



Answer 10:

你有没有考虑以下?

Primary Table (Employee)   
Primary Key is PK_Employee

Foreign table (Event)  
Foreign key is called FK_Employee


Answer 11:

我使用的约定#2。 我现在与传统的数据模型的工作,我不知道什么代表在给定的表。 哪里是在伤害被长篇大论?



Answer 12:

如何命名的外键

ROLE_ID

其中,角色是角色引用的实体已经在手relativ表。 这解决了递归引用和多FKS到同一个表的问题。

在许多情况下,将等同于被引用的表名。 在这种情况下,它同样成为给你的建议之一。

在任何情况下就吃长参数是一个坏主意



Answer 13:

“凡在‘员工INNER JOIN量级order.employee_id = employee.id’有没有需要额外的资格?”。

有没有需要额外的资格,因为我谈到的资质已经存在。

“的原因,企业用户是指订单ID或员工ID是提供上下文,但在dabase水平,你已经有了上下文,因为你refereing表”。

祈祷,告诉我,如果列被命名为“ID”,那怎么是“refereing [原文]表”究竟做了,除非正好在我讲过的方式出线这个参考ID列?



文章来源: Primary key/foreign Key naming convention [closed]