6

你的偏好是哪一个?

假设我们有一个通用的 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对于名称?)。显然,在现有项目上,您应该遵循已经建立的约定,但是对于新开发呢?

你的偏好是什么?

4

12 回答 12

26

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

于 2009-02-09T20:56:16.140 回答
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 用于主键......

于 2009-02-09T21:06:58.327 回答
3

还要检查相关问题:在表中使用缩写表名作为每个字段名的前缀是一种好习惯吗?

正如我在回答中提到的那样;使用表名作为字段名前缀的概念来自旧系统的旧时代,当时整个数据库中的每个字段都需要是唯一的。现代系统不再需要这一点,因此它只是一个不再需要的约定。正如在编码之前思考表名已经给出了上下文。不需要在列名前面加上前缀

于 2009-02-10T10:47:58.410 回答
2

我坚持尽可能短的名字。人们在每一列上加上表名的前缀让我很暴力。PERSON.first_name,而不是 PERSON.person_first_name。我们知道它是一个人,它在 person 表中......它还会是什么?

我唯一一次违反此规则是针对 id 列,例如:PERSON.personID。

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

于 2009-02-09T21:34:00.447 回答
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#)。

于 2009-02-09T21:33:28.950 回答
1

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

永远不要使用名称作为字段名称。它是一个保留字,因此应避免使用。数据库以某种方式使用保留的关键字,将它们也用作字段名称只是不好的做法,并且比从一开始就使用正确的描述性名称会产生更多的错误。

于 2009-02-09T22:49:57.363 回答
0

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

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

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

再说一次,如果您的产品表中的每一列都是 ProductXxxx,这可能是非常多余的。

换句话说,我没有绝对的偏好,但我确实更倾向于冗长的命名约定。

于 2009-02-09T21:19:06.893 回答
0

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

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

它简化了事情。

于 2009-02-09T21:26:09.343 回答
0

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

于 2009-02-09T21:37:50.033 回答
0

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

于 2009-02-10T11:06:17.680 回答
0

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

于 2009-10-26T14:03:17.823 回答
0

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

于 2009-10-26T14:10:43.190 回答