我一直想知道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”,有些前缀是表名的一个字母或整个表名以及一个下划线?
答案 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的工具驱动的:
如果您使用的是需要'id'的ORM,第二个决定是:
或者第二个决定,如果你没有使用'id',那么 - 如何在关系数据库中建立名称:
答案 6 :(得分:0)
正如其他一些人已经指出的那样:这真的是个人偏好。
我或多或少坚持第三种方法(表foo会得到id列“foo_id”)但不能真正告诉你原因; - )
第一个approch的一个优点是,您可以重命名您的表,而无需重命名您的id列以反映更改。但这并不是使其成为学说的理由。