SQL - ID列的命名

时间:2010-01-08 14:23:53

标签: database-design naming-conventions

我一直想知道SQL中这些ID命名样式的优点和缺点是什么:

CREATE TABLE cache (
id INT AUTO_INCREMENT,
PRIMARY KEY(id)
);

CREATE TABLE cache (
cid INT AUTO_INCREMENT,
PRIMARY KEY(id)
);

CREATE TABLE cache (
cache_id INT AUTO_INCREMENT,
PRIMARY KEY(id)
);

为什么有些开发人员在每个表中都使用“id”,有些前缀是表名的一个字母或整个表名以及一个下划线?

7 个答案:

答案 0 :(得分:11)

主观,但我喜欢使用命名的ID(例如customer_id,item_id等)

我的理由是,如果你一致地命名你的外键,它会使连接更容易理解 - 它始终是a.customer_id = b.customer_id。否则,对于使用大量连接的复杂查询,您会有大量的“id”列,并且不会立即明白什么是什么。

ETA:

此外,如果您使用的是MySQL,则可以使用更简单的连接语法,例如:

FROM customers INNER JOIN orders USING customer_id

答案 1 :(得分:7)

这都是个人喜好。我个人使用Id只是因为我认为每个表都是它自己的实体......然后当我用一个键引用时,它会变成CustomerId或OrderId,具体取决于表的名称。

答案 2 :(得分:2)

使用'id'的优点是你有一个统一的字段,它很容易记住和输入。

使用表名为id添加前缀的优点是,在经常使用多个表时可以更轻松地使用它。

cid似乎是三个选项中最差的选项,没有其他两个选项带来的好处。

答案 3 :(得分:2)

  
    

Native SQL:最好使用比id更具体的东西,这样编写sql的人不必总是用表别名作为前缀。通过消除对别名的需要,您可以显着缩小SQL的大小并同时消除大量错误。

  

即使使用表名,前缀也不再是更具体的列名称:

 
customer.id
customer_id

另外注意,由于外键列引用了一个表,为什么不使用该表的名称作为外键?

table order (
     id        SERIAL PRIMARY KEY,
     customer  INTEGER NOT NULL REFERENCES (customer)
...

然后我们有:

FROM customer INNER JOIN order ON customer.id = order.customer

答案 4 :(得分:1)

当您将每个表的主键命名为“id”时,某些ORM会“更好”。

答案 5 :(得分:1)

第一个决定是'id'还是没有,它是由处理SQL的工具驱动的:

  • ORM:有些人更喜欢'id'
  • Native SQL:最好使用比id更具体的东西,这样编写sql的人不必总是用表别名作为前缀。通过消除对别名的需求,您可以显着缩小SQL的大小并同时消除大量错误。

如果您使用的是需要'id'的ORM,第二个决定是:

  • 您可以对所有列名称使用ORM约束
  • 或者您可以为人类命名列,并创建一个单独的视图,将列重命名为ORM想要的列。这是一项工作,但如果您不仅仅是ORM查看表格(报告工具,其他ORM等),那么它可能是值得的。

或者第二个决定,如果你没有使用'id',那么 - 如何在关系数据库中建立名称:

  • 您通常没有案例可供使用 - 所以camelcase等不起作用
  • 您希望避免命名冲突
  • 如果不知道表名
  • ,您希望名称有点直观
  • 您希望名称格式一致
  • 所以,cid不是很好。最好使用cache_id。

答案 6 :(得分:0)

正如其他一些人已经指出的那样:这真的是个人偏好。

我或多或少坚持第三种方法(表foo会得到id列“foo_id”)但不能真正告诉你原因; - )

第一个approch的一个优点是,您可以重命名您的表,而无需重命名您的id列以反映更改。但这并不是使其成为学说的理由。