命名主键列id或* _id是否更好?

时间:2011-06-24 15:06:04

标签: sql

我已经使用Rails几年了,我已经习惯了命名主键列id的惯例。但是我在SQL书籍中遇到了很多例子,这些例子将主键列命名为employee_id表格employeesfeed_id表格feeds

第二个系统的一个优点似乎是你可以使用USING()来产生更简洁的SQL查询:

select feeds.title, items.title from items inner join feeds USING(feed_id);

相反
select feeds.title, items.title from items inner join feeds on feeds.id = items.feed_id;

哪种命名惯例更好?哪个受到有经验的数据库管理员的青睐?

另外,复数表的名称是否更好?

7 个答案:

答案 0 :(得分:6)

我总是使用详细形式(即'employee_id'而不是'id'),因为它更具描述性。如果您要加入多个表并且两个都有'id'列,那么如果需要选择两个ID,则必须使用别名'id'。另外,正如您所提到的,您可以获得USING子句的优势。在宏观方案中,它不是一个重要的因素,但是更冗长的形式给你带来了好处。

答案 1 :(得分:4)

两个选项都有效,但纯粹主义者会说使用id作为其名称由表指定。

我使用table_id因为我发现它更具描述性并且使调试更容易。它更实用。

Re:表名。数据库书呆子中另一个激烈争论的话题,但我说Singular。

答案 2 :(得分:2)

这是用户首选项,但我总是命名表Id的主键。我总是在其他表中将该Id的引用命名为[SingularEntityName] [Id],例如。

Credentials
Id    Password

Users
Id    Name  CredentialId

Descriptions
Id  UserId

保持我的参考清洁。但是,只要在命名方面保持一致,那么设置模式的方式确实无关紧要。

答案 3 :(得分:2)

Tablename_Id是我的强烈偏好。当你加入Fks时,你确切地知道在你加入表a中的ID的时候加入什么并且不会犯错,当你的意思是下面的表格是一个例子,说明这是多么容易做,特别是如果你复制on子句来自其他地方

FROM tablea a
JOIN tableb b
  ON a.ID = b.tableaid
JOIN tablec c
  ON a.ID = c.tablebid

在上面的例子中,你真的想加入B.Id,但是忘了在你复制的时候改变它。它会工作并给你一个不正确的结果集。如果使用table_id,查询将无法进行语法检查。

使用Id的另一个问题是当您执行复杂的报告时。由于支持查询必须包含具有单独名称的字段,因此如果您使用tablename命名了id,则最终会浪费时间编写一堆您不需要的别名。

现在使用ORM的人不会编写大量的SQl,但是他们写的内容和编写的报告通常都是复杂而复杂的语句。您需要设计数据库,以便比简单查询更容易做到这些。

使用ID作为标识字段的名称被视为SQl反模式。 http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/ref=sr_1_1?s=books&ie=UTF8&qid=1308929815&sr=1-1

答案 4 :(得分:2)

再次打开虫子, 我愿意打赌那些选择tablename_id的人是年纪较大,经验更丰富的程序员。 那些使用id的人更年轻。

为什么?因为你学习冗余并且坚持并不总是坏事。 我要添加到#1答案的一件事,使用“_”有助于更容易在代码中,在表中选择变量等...我对外键做同样的事情。 TableName_FK有些人会争论,但它对我有用,而且很明显它是什么。

多年来,我不得不多次处理其他代码。一致性是至关重要的,混淆是毫无价值的,有意义的变量名称非常有用。 有些人认为冗长会使代码难以阅读。我不认为这个论点在今天的物体世界中飞逝。来自.derive.from.some.microsoft.class.twenty.layers.deep.that.you.have.to.fully.reference。

BTW - 正如许多人所说,这是你的选择。那些花时间争论编码语法的人没有足够的工作要做。学会灵活并使用您工作的工作场所的标准。如果你足够幸运地设定自己的标准,那就去做吧。你想知道的事实很棒。但是选择一个然后保持一致(直到你换工作或决定你有一个范式转换,这意味着你想改变你的风格。)

你经常可以选择一个人开始学习按个人喜好和风格编码的时代。编写非常紧凑,最简单,难以阅读的代码的人,在内存非常有限(DOS)时开始回来,可能写了很多汇编程序,那些使用匈牙利语的人开始使用Win SDK等等......

这个讨论已经发展了几十年。我得到的越多,我记录的代码越多,我的变量名称就越有意义等等......因为在一周内我会忘记我写的内容,我需要路线图来理解它。并不是说我很健忘,虽然这是方程式的一部分,但更重要的是因为我在很多不同的项目上编写代码。

答案 5 :(得分:0)

这完全是你的选择。但我个人更喜欢第二个,因为当我遇到id时,我不需要在代码中查找表名。我认为tablename_id更好。

答案 6 :(得分:0)

给出该表唯一的主键名称的另一个好处是,当引用不同表中的那些键时,它更容易有一个命名约定,表示相应的键。

例如,假设alpha表中的所有内容都以alpha_开头,因此您将alpha_id作为主键。在您的测试版表格中 - 所有内容都将开始测试 - 您可以使用beta_alpha_id在该表格中为alpha表格中的键提供参考。