Database design SQL-ID列的命名

Database design SQL-ID列的命名,database-design,naming-conventions,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”,有些开

我一直想知道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”,有些开发人员在其前面加上表名的一个字母,或者整个表名加上一个下划线?

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

当你将每个表的主键命名为“Id”时,一些ORM工作得“更好”。

使用“Id”的好处是你有一个统一的字段,而且很容易记住和打字

使用表名作为id前缀的优点是,在频繁使用多个表时,使用id更容易


cid似乎是三个选项中最差的,没有其他两个选项的优点。

主观,但我喜欢使用命名id(例如客户id、项目id等)

我的推理是,如果您一致地命名外键,那么联接就更容易理解——它总是a.customer\u id=b.customer\u id。否则,对于使用大量联接的复杂查询,您会有大量的“id”列,并且不会立即发现与之相关的内容

预计到达时间:

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

FROM customers INNER JOIN orders USING customer_id

第一个决定是否为“id”,它由处理SQL的工具驱动:

  • ORM:有些人更喜欢“id”
  • 原生SQL:最好使用比id更具体的东西,这样编写SQL的人就不必总是使用表别名作为前缀。通过消除对别名的需要,您可以显著缩小SQL的大小,同时消除许多错误
第二个决定是,如果您正在使用需要“id”的ORM,则:

  • 您可以在所有列名上使用ORM约束
  • 或者,您可以为这些列命名为humans,并创建一个单独的视图,将这些列重命名为ORM所需的名称。这是一点工作,但是如果您有更多的ORM查看表(报告工具、其他ORM等),那么这可能是值得的
或者,如果不使用“id”,第二个决定是-如何在关系数据库中构建名称:

  • 通常情况下,您没有case可供使用-因此camelcase等不起作用
  • 您希望避免命名冲突
  • 您希望名称在不知道表名的情况下更直观
  • 您希望名称的格式一致
  • 所以,cid不是很好。最好是缓存id

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

我或多或少坚持第三种方法(table foo将获得id列“foo_id”),但无法真正告诉您原因;-)

第一种方法的优点是,您可以重命名表,而无需重命名id列以反映更改。但这并不是让它成为一种教条的理由

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

前缀,即使是表名,也不比更具体的列名多个字符:

customer.id customer_id 客户id 客户识别码 另一方面,既然外键列引用一个表,为什么不使用表名作为外键呢

table order ( id SERIAL PRIMARY KEY, customer INTEGER NOT NULL REFERENCES (customer) ... 表顺序( id串行主键, 客户整数非空引用(客户) ... 然后我们有:

FROM customer INNER JOIN order ON customer.id = order.customer 从customer.id=order.customer上的客户内部联接订单
我使用与Justin相同的方法,因此查询看起来像:Customer.ID或Order.ID。有些人喜欢使用自然连接,这与此方案不起作用。然而,由于自然连接是魔鬼的工作,因此任何使其更难使用的命名约定可能都是一件好事。IME,当您使用mu时,此约定会崩溃多个id(例如外键),因为您不知道
id
代表的是哪一个。数据类型没有帮助,因此您必须查看这些键,以了解如果表未命名为“a”和“b”,什么才不是真正的问题;Order.CustomerID=Customer.ID说的是同样的事情,冗余度也比较少…@Chris-true,但是在一个大查询中使用别名表名时,事情可能会变得混乱。它还可以作为一个健全的检查,以确保您没有加入错误的表。@EricPetroelje我在这方面只有不好的经验,因为开发人员往往使用非常糟糕的别名每当我看到这个约定在起作用时,都会使用像iis、isi这样的名称,只是为了避免这个方法造成的冗余。