使用包含具有相同名称的列的SQL表是不是很差的编码实践?

时间:2009-05-14 19:38:56

标签: sql coding-style conventions readability

示例:

CREATE TABLE ErrorNumber
(
     ErrorNumber int,
     ErrorText varchar(255),
)

这可能导致查询看起来像:

SELECT ErrorNumber FROM ErrorNumber WHERE ErrorNumber=10

12 个答案:

答案 0 :(得分:10)

我假设ErrorNumber作为表中的列是主键吗?在这种情况下,您可以将表列命名为ErrorNumberID。

我不知道这是一个糟糕的编码习惯,但我无法想象它为了可读性而做了什么。您提供的示例很好地展示了查询最终会让您感到困惑。

我不确定的另一件事是(列名与表名相同)是否会导致错误?我确定它因供应商而异。

答案 1 :(得分:5)

CREATE TABLE Errors (
    Number int,
    Description varchar(255)
)

我觉得上面是一个更好的命名方案,因为:

  • 表名现在代表了它 是
  • 这些列不需要这个词 因为表格中的“错误” 他们在。

答案 2 :(得分:4)

您可以坚持使用默认值并命名主键ID。

答案 3 :(得分:3)

我认为让一个与其表共享相同名称的列不是一个好主意。即使它有效,它也很混乱。尝试将表重命名为Error或将列重命名为ErrorNum,甚至只重命名为Num

答案 4 :(得分:2)

是的,确实如此。简单数据模型中的绝大多数简单表应该是复数名词。在您的示例中,该表应称为“errors”,包含两列“id”和“description”。

答案 5 :(得分:2)

我同意DWC,并且会更进一步地将表格命名为更具描述性的表格,就像在什么类型的错误表中一样。如果它用于存储您将在代码中使用的错误是一回事,并且如果其记录错误的表是另一个。不知道你用它是什么,所以你真的要把它命名为对它所用的上下文有意义的东西。当我看到一个名为“Errors”的表时,我不确定它是用于查找错误代码的日志表还是查找表。如果是后者,那么像ErrorCodes这样的东西就是个好名字。

CREATE TABLE ErrorCodes
(
Id int,
Number int,
Description varchar(255)
)

答案 6 :(得分:0)

可怜吗?也许稍微但没什么大不了的。

答案 7 :(得分:0)

我同意这不重要。

我们在应用程序中有一些表,它们只有id和“name”字段。它们用于下拉列表。

所以我把它们设置成这样:

列表名称为:State

表名是:State

ID为:StateID

实际的状态值列是:StateName

它对我们有用。

在您的具体情况下,我会按照上面的建议进行操作,并将表命名为Error。

答案 8 :(得分:0)

如果任何数据库供应商对此感到困惑,请使用其他数据库供应商。任何数据库都应该轻松地解析它。

我同意这可能是出于可读性的原因。

答案 9 :(得分:0)

这是形式问题。就个人而言,我使大多数表名复数,然后它永远不会发生。在这种特殊情况下,我的表将是ErrorNumbers,表字段将是ErrorNumber(实际上我会使用ErrorNumberID)

但是,它取决于您或您公司的编码标准。如果是不好的形式,这是一个非常小的违规行为。如果有的话,它是变量名称上缺少的更多违规的ID。

答案 10 :(得分:0)

如果一个表预计包含多行,那么我的首选是使用一个集合术语作为名称。请注意,这与单数羚牛和附加's'不同。我更喜欢'人员'和'薪资'分别超过'员工'和'员工薪资'。并且应该取出诸如“实体”之类的名称并拍摄:)

鉴于此,考虑到设计中的列,我会将表格命名为“错误”。现在,我知道许多程序员更喜欢表名的单数术语,但这只是一种不同的风格而不是“糟糕的编码实践”。

偶尔需要单行表,例如表'Constants'包含使用DBMS的应用程序使用的pi的共享近似值...但是我想到的'常量'表有多个列,每个列用于不同的常量,因此它获得一个集合术语作为名称。

也许如果你的应用程序只使用过一个常量,那么也许你最终会得到一个名为'Pi'的表?好吧,我做的另一个样式选择是使用UpperCamelCase作为表名,使用lower_case_separated_by_underscores作为列名。因此,我仍然能够从列中区分(几乎)表格,即

SELECT pi FROM Pi;

[而且像SO这样的代码解析器也使工作变得更容易!]

实际上,我倾向于几乎完全使用表格相关名称,所以我更有可能写:

SELECT P1.pi 
  FROM Pi AS P1;

还要考虑一些集体术语拼写与单数术语相同,例如'物种','鹿','绵羊','鱼'以及许多其他与动物王国无关但我刚才有精神障碍的人:)

因此,虽然我可以设想一个包含具有相同名称的列的SQL表,即使使用我的首选数据元素命名约定,但它确实很少见。

答案 11 :(得分:0)

+1 dwc的succint名称。

“列名称应表示值域”的问题在于它忽略了上下文。列名在表的上下文中仅存在 。它永远不会模棱两可。其域名独立于其名称进行控制。

此人是否存在,无法区分Errors.DescriptionParts.Description以及Problems.Description,或者谁会假设所有列为DescriptionName的列都已绘制来自同一个神圣的井?

也就是说,我没有为主键列使用诸如 Number ID 之类的通用术语,原因完全不同:列需要一个新名称它看起来像一把外键。

假设错误号必须记录在Actions表中。 Actions.Number不可能引用错误号,因此我们不得不发明类似Actions.ErrorNumber的内容。如果它在其他任何地方都是ErrorNumber,那么它可能在它作为密钥的地方具有相同的名称!