在我们的开发组,我们有关于小学和外键的命名约定激烈争论。 有基本上我们组两个思想流派:
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
雇员的属性。 我不走了问我的同事他有什么PersonAge
或PersonGender
是。 我问了他的年龄是什么。
所以,就像我说的,这是一个激烈争论,我们去和和了。 我很想得到一些新的观点。
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:
如果您正在寻找在应用程序代码,而不仅仅是数据库查询,有些事情似乎是清楚的对我说:
表定义通常直接映射到描述一个对象的类,所以它们应该是单数。 为了描述一个对象的集合,我通常是“阵列”或“列表”或“收藏”追加到奇异的名字,因为它比使用复数的更清楚地表明,不仅在于它是一个集合,但什么样的集合它是。 在该视图中,我看到一个表名作为集合的不是名称,而是对象的类型,其中它是一个集合的名称。 谁不写应用程序代码DBA可能会错过了这一点。
我处理的数据通常用于非关键识别目的“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认真考虑使用userIdPK和userIdFK作为名称来标识一个从其他。 这会帮助我快速识别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]