在数据库列中,您更喜欢详细命名吗?

时间:2009-02-09 20:47:44

标签: sql database-design naming-conventions naming

您的偏好是什么?

假设我们有一个通用的Product表,它有一个ID,一个名称和一个类别的外键引用。您是否愿意将您的桌子命名为:

CREATE TABLE Products
(
    ProductID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    CategoryID int NOT NULL FOREIGN KEY REFERENCES Categories(CategoryID),
    ProductName varchar(200) NOT NULL
)

使用列的显式命名(例如产品名称,产品 ID)或类似的内容:

CREATE TABLE Products
(
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    CategoryID int NOT NULL FOREIGN KEY REFERENCES Categories(ID),
    Name varchar(200) NOT NULL
)

从我所看到的,.NET世界中的约定是明确的 - 样本倾向于使用第一个示例,而开源和RoR世界倾向于第二个示例。就个人而言,我发现第一眼看上去更容易阅读和理解:select p.ProductID, p.ProductName, c.CategoryName from Categories c inner join Products p on c.CategoryID = p.CategoryID对我来说似乎比select p.ID AS ProductID, p.Name AS ProductName, c.Name AS CategoryName from Categories c inner join Products p on c.ID = p.CategoryID更自然

我认为,鉴于我提供的基本示例并不是什么大问题,但是当你处理大量数据和表格时呢?我仍然会发现第一个例子比第二个更好,尽管两者的某些组合可能值得研究(<Table>ID用于ID,但只有Name用于名称?)。显然,在现有项目中,您应该遵循已经建立的惯例,但是对于新开发呢?

您的偏好是什么?

12 个答案:

答案 0 :(得分:26)

表名已经给出了上下文。 无需为列名添加前缀。 连接表时使用table.column语法。

答案 1 :(得分:11)

我是选项3的粉丝:

CREATE TABLE Products
(
    ProductId int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    CategoryId int NOT NULL FOREIGN KEY REFERENCES Categories(CategoryId),
    Name varchar(200) NOT NULL
)

因此,主键是唯一可以将表名称作为前缀的列 - 恕我直言,它可以更容易地查看连接何时出错。然后,如果有可能在将来的任何时候处理合并复制情况,我也喜欢使用GUID作为主键...

答案 2 :(得分:3)

检查相关问题:Is prefixing each field name in a table with abbreviated table name a good practice?

作为I mentioned in my answer;当整个数据库中的每个字段都必须是唯一的时,带有表名称的字段名称前缀的概念来自遗留系统的旧时代。现代系统不再需要这样,因此它不再是必需的惯例。正如Think Before Coding所提到的那样“表名已经给出了上下文。不需要在列名前加上

答案 3 :(得分:2)

我坚持尽可能短的名字。在每列上为表名添加前缀的人使我变得暴力。 PERSON.first_name,而不是PERSON.person_first_name。我们知道它是一个人,它在人员表中......还有什么呢?

我反对此规则的唯一时间是id colums,例如:PERSON.personID。

规则是向爱因斯坦道歉;尽可能地冗长,但不再冗长。

答案 4 :(得分:1)

我通常给每个表一个唯一的前缀。所以你的例子就像是

CREATE TABLE Products
(
    PROD_ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    PROD_CAT_ID int NOT NULL FOREIGN KEY REFERENCES Categories(CAT_ID),
    PROD_NAME varchar(200) NOT NULL
)

这使得加入和选择列更容易,因为您没有名称冲突。除非您多次引用同一个表,否则您甚至不需要表名别名(最有可能)。

然而,最近我开始认为(2)可能更好,因为它更接近我在编写代码时使用的命名约定(在我的情况下是C#)。

答案 5 :(得分:1)

当你有很多连接时,ID非常混乱。我更喜欢显示与foregin键中id的名称匹配的id的名称。这样,您始终知道customerid将与具有该列的任何其他表中的customerid连接。

切勿将名称用作字段名称。这是一个保留字,因此应该避免。数据库以某种方式使用保留的keyworsd,使用它们作为字段名称只是糟糕的说法,并且比使用正确的描述性名称形成更多错误。

答案 6 :(得分:0)

有一种观点认为,列名应该代表整个数据库中的单个域空间。例如,产品名称与公司名称完全不同。一个可能比另一个更长,等等。在这方面你应该使用第一种方法,因为它区分了两者。

另一方面,我在某种程度上同意Think Before Coding的逻辑。我总是使用table.column语法,所以上下文应该清楚。

使用更详细的列名通常可以避免与保留字冲突。

然后,如果产品表中的每一列都是ProductXxxx,那么它可能会非常多余。

换句话说,我没有绝对的偏好,但我更倾向于使用详细的命名约定。

答案 7 :(得分:0)

我更喜欢坚持使用短版“ID”。这是一个易于理解和遵循的惯例,表的记录标识符将被称为“ID”,它将引用其“自己的”表而不是其他东西(尽管有时不需要“自己的”标识符一些表格,如映射)。

它给出的另一个结果是,无论何时编写查询,您都不需要思考并记住确切的列名。您知道,只要表有记录标识符,就可以通过“ID”引用它。

它简化了事情。

答案 8 :(得分:0)

我更喜欢uid,gid,pid,wid,lid等。

答案 9 :(得分:0)

我认为如果列名在数据库中不唯一,则应在其前面加上tablename。比如,ProductId,ProductName。对于与其他表中的列不冲突的列,请不要为其添加前缀。

答案 10 :(得分:0)

选项2是最好的(当然对我来说:)),
我是PHP程序员而不是.NET程序员。

答案 11 :(得分:0)

我更喜欢第二个选项,因为对我来说第一个选项似乎是不必要的重复。当然,我主要是Ruby on Rails程序员,所以我喜欢DRY principle。 :)我发现C#编程很烦人,因为一切都使用了第一个显式但重复的版本。