SQL命名最佳实践

10

我不确定是否有行业标准,所以在这里询问。

我正在命名一个用户表格,我不确定该如何命名成员。

user_id是显而易见的,但我想知道是否应该给所有其他字段加上"user_"前缀。

user_name user_age

还是只用名称和年龄等...

12个回答

10

这样的前缀是毫无意义的,除非你有更加随意的需求;比如两个地址。那么你可能会使用address_1、address_2、address_home等。

电话号码也是同样的道理。

但对于像年龄、性别、用户名等这类静态内容,我建议保留原样。

只是为了给你展示一下,如果你确实需要为所有字段都添加前缀,你的查询可能会变成这样:

SELECT users.user_id FROM users WHERE users.user_name = "Jim"

当它很容易时

SELECT id FROM users WHERE username = "Jim"

2
大部分都是这样,但有一个小变化。对于ID(例如user_id),我们总是拼写全名,而对于其他所有内容,我们不会在表名前加前缀。这使得连接更容易阅读。 - NotMe
1
“性别...我会保留它们的原样”,更可能是指男性和女性,对于这些有一个行业标准代码[ISO 5218](http://en.wikipedia.org/wiki/ISO_5218),而不是性别(阳性、阴性以及其他)。 - onedaywhen

6

我同意其他答案中建议不要在属性前缀表名的做法。

然而,我支持使用匹配的名称来表示外键和它们所引用的主键1,为了实现这一点,通常需要在从属表中为id属性添加前缀。

SQL支持使用USING关键字进行简洁的连接语法,这是不太为人所知的:

CREATE TABLE users (user_id int, first_name varchar(50), last_name varchar(50));
CREATE TABLE sales (sale_id int, purchase_date datetime, user_id int);

接下来是以下查询语句:

SELECT s.*, u.last_name FROM sales s JOIN users u USING (user_id);

等价于更冗长且常用的连接语法:

SELECT s.*, u.last_name FROM sales s JOIN users u ON (u.user_id = s.user_id);

1这并非总是可行的。一个典型的例子是在users表中的user_id字段,以及在引用表中引用users表的reported_byassigned_to字段。在这种情况下使用user_id字段既不明确,也无法应用于其中一个字段。


虽然我认为使用“reported_by”和“assigned_to”这样的列名没有问题,但如果您想更明确地指出它们所引用的列,可以将它们命名为“reported_by_user_id”和“assigned_to_user_id”。 - ObiWanKenobi
@Obi:是的,但我的观点是,在这种情况下仍然无法使用“USING”语法。 - Daniel Vassallo

5
正如其他答案所建议的那样,这是个人偏好-选择一定的命名方案并坚持使用。大约10年前,我使用过Oracle Designer,它使用了我喜欢并自此以后一直使用的命名方案:
  • 表名是复数形式 - USERS
  • 替代主键的名称为表名的单数形式加上“_id” - 表USERS的主键将是“USER_ID”。这样,当您在其他表中使用“USER_ID”字段作为外键时,您就有了一致的命名方式。
  • 列名不需要带有表名前缀。

可选:

  • 对于具有大量表格(根据您的看法解释“大量”)的数据库,请使用2-3个字符的表格前缀,以便您可以逻辑地将表格分成区域。例如:所有包含销售数据(发票、发票项目、文章)的表都具有前缀“INV_”,所有包含人力资源数据的表都具有前缀“HR_”。这样,查找和排序包含相关数据的表格更容易(这也可以通过将表格放置在不同的模式中并设置适当的访问权限来完成,但当您需要在一个服务器上创建多个数据库时,情况会变得复杂)。

再次强调,选择您喜欢的命名方案并保持一致。


2

仅需要姓名和年龄,当您想知道正在使用的名称类型时,表格应提供必要的上下文。


2
将其视为一个实体,并相应命名字段。
我建议使用一个“用户”表,其中包括id、姓名、年龄等字段。
一组“记录”是一组用户,但一组“字段”表示一个用户。
因此,您最终会引用“user.id”、“user.name”、“user.age”(根据查询不同,您不总是需要包括表名)。

2
对于表名,我通常使用复数名词(或名词短语),和你一样。
对于列名,我不会使用表名作为前缀。表本身就说明了列的上下文。

1

首先,我建议使用单数名词,即用户而不是用户们,尽管这更多是个人偏好。

其次,有些人喜欢始终将主键列命名为id,而不是user_id(即表名+id),例如将姓名命名为employee_name。我认为这是一个不好的想法,原因如下:

-- when every table has an "id" (or "name") column, you get duplicate column names in the output:
select e.id, e.name, d.id, d.name
from employee e, department d
where e.department_id = d.id

-- to avoid this, you need to specify column aliases every time you query:
select e.id employee_id, e.name employee_name, d.id department_id, d.name department_name
from employee e, department d
where e.department_id = d.id

-- if the column name includes the table, there are no conflicts, and the join condition is very clear
select e.employee_id, e.employee_name, d.department_id, d.department_name
from employee e, department d
where e.department_id = d.department_id

我并不是说你应该在表中的每一列都包含表名,但是对于关键字(id)列和其他“通用”列,例如名称、描述、备注等,在查询中可能会被包含,建议加上表名。


1

这是个人偏好。我们能给你的最佳建议是保持一致性、易读性,并确保关系名称正确。

使用有意义的名称,如果可能的话不要使用缩写,除非你使用的存储机制无法很好地处理它们。

在关系中,我喜欢在主键上使用Id,在外键上使用[table_name]_Id。例如,Order.Id和OrderItem.Order_Id。

如果使用代理键作为主键,这种方式效果不错。

你的存储机制可能对大小写敏感,所以请考虑这一点。

编辑:另外,有一些理论认为表应该以单个记录在该表中所代表的内容命名。因此,表名应为"User"而不是"Users" - 就个人而言,复数形式更有意义,只需保持一致即可。


1

用户表(复数):

  • id
  • 姓名
  • 年龄

简单明了。


同意。除了iduser_id是需要讨论的主题。因为如果您有很多连接查询,并且每个表都有ID列,您很容易会感到困惑。 - abatishchev
1
@abatishchev "As" 是单数还是复数。许多数据建模者会说应该用单数形式,因为字段集合代表一个实体。也就是说,在用户记录表中的 1 行表示什么?它代表 1 个用户。 - George Marian
@George Marian:是的,这个表格代表了所有用户。 - abatishchev
1
@abatishchev 正确,这就是为什么这场辩论会继续下去,可能永远不会解决。如果您将表格视为一组行的集合--通常是正确的--您可能更喜欢使用复数形式的名称。另一方面,如果您将表格视为实体属性集合,并将该表中的行集合视为具有该属性的实体组,则可以理解我的观点。另一种看待它的方式:当您将用户表与其他表连接在一起时,您正在将一次表示一个用户的表示与由另一个表(s)表示的一个或多个实体相关联。 - George Marian
最终,将表名变成复数形式是多余的。如果你了解如何使用数据库,你就会知道一个表通常会有多条记录。但是,如果每条记录只代表一个实体,那么通过将表名变成复数形式来再次说明这一点是没有必要的。基本上,你应该关注实现而不是表示。 - George Marian
@George Marian:同意!:) 就我的个人习惯,我在使用基于存储过程的 SQL 解决方案时会使用复数形式,而在使用 ORM 时则使用单数形式。 - abatishchev

1

我认为表名和列名应该是这样的。

表名:
User --> 每个单词首字母大写,不要用复数形式。

列名:
Id --> 如果我看到 "Id",我就知道这是主键列。
GroupId --> 我理解有一个名为 Group 的表,这个列是与 Group 表相关的列。
Name --> 如果在 User 表中有一个名为 "Name" 的列,这意味着用户的姓名。这已经足够清楚了。

特别是如果您正在使用 Entity Framework,我认为这更重要。

注意:对于我的糟糕英语,我很抱歉。如果有人能纠正我的糟糕英语,我会很高兴。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接