当前位置:  开发笔记 > 数据库 > 正文

为什么在列名中指定主键/外键属性

如何解决《为什么在列名中指定主键/外键属性》经验,为你挑选了3个好方法。

最近几个问题讨论了命名列的策略,我很惊讶地发现了在列名中嵌入外键和主键概念的概念.那是

select t1.col_a, t1.col_b, t2.col_z
from t1 inner join t2 on t1.id_foo_pk = t2.id_foo_fk

我必须承认我从来没有使用任何使用这种方案的数据库系统,我想知道它有什么好处.我看到它的方式,一旦你学会了系统的N个主表,你就会用这些表写出几个数量级的请求.

为了提高开发效率,您需要了解哪些表是重要的表,哪些表是简单的支流.您需要向内存提交大量列名.其中一个基本任务是将两个表连接在一起.为了减少学习工作,最简单的方法是确保两个表中的列名相同:

select t1.col_a, t1.col_b, t2.col_z
from t1 inner join t2 on t1.id_foo = t2.id_foo

我认为,作为一个开发人员,你不需要提醒那些关于哪些列是主键,哪些列是外键而哪些列什么都没有.如果你很好奇的话,很容易看到架构.当看着一个随机的

tx inner join ty on tx.id_bar = ty.id_bar

......知道哪一个是外键是非常重要的吗?外键仅对数据库引擎本身很重要,以允许它确保引用完整性并在更新和删除期间执行正确的操作.

这里有什么问题要解决?(我知道这是一个讨论的邀请,并随时可以这样做.但与此同时,我正在寻找答案,因为我可能真的错过了一些东西).



1> Paul Tomblin..:

我同意你的看法.将这些信息放在列名称中,就像早期Windows时代那种蹩脚的匈牙利符号愚蠢.



2> Bill Karwin..:

我同意您,子表中的外键列应与父表中的主键列具有相同的名称.请注意,这允许语法如下:

SELECT * FROM foo JOIN bar USING (foo_id);

USING关键字假定两个表中的列都以相同的名称存在,并且您希望使用等连接.很高兴将它作为更详细的简写提供:

SELECT * FROM foo JOIN bar ON (foo.foo_id = bar.foo_id);

但请注意,有些情况下,您无法将外键命名为与其引用的主键相同.例如,在具有自引用的表中:

CREATE TABLE Employees (
  emp_id INT PRIMARY KEY,
  manager_id INT REFERENCES Employees(emp_id)
);

表也​​可以有多个外键到同一个父表.使用列的名称来描述关系的性质是有用的:

CREATE TABLE Bugs (
  ...
  reported_by INT REFERENCES Accounts(account_id),
  assigned_to INT REFERENCES Accounts(account_id),
  ...
);

我不想在列名中包含表的名称.我还避免将强制性"id"作为每个表中主键列的名称.



3> Mike Woodhou..:

我一直支持在这里提出的大多数想法,我已经用SQL数据库开发了20多年,我很尴尬地说.他们中的大多数提供了很少或没有预期的好处,并且后见之明,颈部疼痛.

每当我花了几个多小时使用模式时,我就会很快熟悉最重要的表格和列.一旦它达到几个月,我几乎已经掌握了整个事情.

这是什么解释?只花几分钟完成设计的人无论如何都不会做任何严肃的事情.如果你用梵语命名你的专栏,那么计划长时间使用它的人会学习它.

忽略复合主键,我不明白为什么像"id"这样简单的东西不足以满足主键,而"_id"则不适用于外键.

因此,典型的连接条件变为customer.id = order.customer_id.

如果两个表之间存在多个关联,我倾向于使用关联而不是表名,因此可能使用"parent_id"和"child_id"而不是"parent_person_id"等

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有