Ker*_* SB 19 join database-design naming-convention
当涉及到列命名时,我想要一些关于最佳实践的专家意见。
背景是,根据维基百科,以下语法,
SELECT ... FROM Employees JOIN Timesheets USING (EmployeeID);
Run Code Online (Sandbox Code Playgroud)
比
SELECT ... FROM Employees JOIN Timesheets ON (Employees.EmployeeID = Timesheets.EmployeeID);
Run Code Online (Sandbox Code Playgroud)
但是,该JOIN ... USING语法仅适用于所有具有全局唯一名称的主键列。因此,我想知道这是否被认为是正确的做法。
就个人而言,我总是使用 PK columnid和外键 column来创建表othertable_id。但那样就不可能使用USINGor 了NATURAL JOIN。
任何指向设计风格或表格设计最佳实践指南的链接也将不胜感激!
gbn*_*gbn 13
之前已经在 SO 上问过这个问题。
如果您有常见且非常含糊的名称,则使用表名作为前缀。也就是说,您在几乎每个查询中都可能需要别名的任何内容。
所以对于 Employee 表,我有
EmployeeID
EmployeeName
Comment
Salary
StartDate
EndDate
InsertedDateTime
...
Run Code Online (Sandbox Code Playgroud)
维基百科实际上说:
然而,USING 构造不仅仅是语法糖,因为结果集不同于具有显式谓词的版本的结果集。具体来说,USING 列表中提到的任何列将只出现一次,并且名称不合格,而不是对于连接中的每个表出现一次。
那是少一列。SELECT *无论如何你永远不会使用所以这一点没有实际意义......
下面的书讨论了使用 ID 作为 SQL 反模式,我同意作者的观点。 http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/ref=sr_1_1?s=books&ie=UTF8&qid=1330025134&sr=1-1
当您进行复杂的报告并且需要多个 id 时,这是一个特殊的问题,因为您必须使用别名。使用表名 ID 还可以更轻松地识别要加入的正确 FK(因为它们具有相同的名称),并且不太可能因加入错误的事物而出错。
也就是说,许多数据库不支持 USING 语法,这使得您提出的问题对于这些数据库来说不是问题。许多数据库也不支持使用自然连接,我不建议在任何情况下使用自然连接,因为它们连接可能会改变如果表结构发生变化。因此,假设您向两个表添加了一个名为 modifieddate 的字段,您不希望在该字段上进行连接,但自然连接会这样做。