为什么在列名称前加上表名称约定?

时间:2011-10-17 21:45:00

标签: sql database-design naming-conventions

如果这是重复的,我很抱歉,我试着看,但这是一个奇怪的问题。

我在许多数据库中看到过这种惯例,但对我来说似乎是多余的。我找到了一些答案,说它是为了减少复杂连接过程中的混乱,但这似乎不是一个充分的理由。如果要进行复杂连接,请创建别名。连接真的代表了这样一个共同的任务,我们应该使选择,插入和更新等标准任务变得多余吗?

7 个答案:

答案 0 :(得分:4)

我认为实际上并没有使用表名为列名添加前缀的约定。

正如Philippe Grondier所详述,数据建模的“正确”方法是首先创建数据元素名称字典。遵循国际标准ISO 11179指南:

[Object] [Qualifier] Property RepresentationTerm

您最终获得了完全限定的数据元素。此处,限定符元素ObjectQualifier和有时Property与您认为的“前缀”组合在一起。

在SQL中实现数据模型时,表名可以提供上下文并引导设计者从列名中删除限定条件。我认为这是你喜欢的惯例。**

换句话说,在约定中,您要质疑的是,表名不是以列名为前缀,而是保留了合格条款。​​


**无论你或其他任何人是一个好的约定是主观的,Stackoverflow不是这种讨论的地方。但是,我将顺便提一下,保留资格条款确实具有实际效益(理论上也是合理的),例如:考虑到SQL的NATURAL JOIN适用于在整个模式中一致命名的列。

答案 1 :(得分:2)

我从来没有看过前面的全表名称,但通常至少是一个缩写。你是完全正确的,这是为了简化连接之类的东西。编写ur_id比编写id更容易,有时写userdights.id,比如说。一次访问多个表并不常见。

答案 2 :(得分:2)

加入是选择的一部分,因此比较不成立。

除此之外,我不认为你应该在字段前加上表名,但主键除外。我喜欢给每张桌子一张代理钥匙,我宁愿在桌子后面说出来。所以表'Orders'将获得'OrderId'PK。订单行将具有指向订单的外键OrderId。这样,字段名称在表格中是相同的,您可以通过名称来判断它呈现的数据。您可以在所有表​​中将该字段命名为“Id”,但您必须阅读别名以查看您的ID。我写的一些查询超过400行。您不希望单独依赖表别名。 fieldname本身的一些上下文确实有帮助。

答案 3 :(得分:2)

确实,这种“开发列名”方法被广泛用于列命名,例如,Tbl_Person将具有id_Person主键列和personName文本列。

虽然编写“开发”列名称(例如“id_Person”,“personName”,“personAdress”等)起初看起来很痛苦,但是当你必须在多个表上编写SELECT时,一切都会变得清晰,这就是每次打开表单或报告时都会发生。

此“开发列名称”方法还有理论/历史维度。作为第一步,第一个关系数据库理论和方法(如MERISE)建议构建所谓的“数据字典”,即app \ database要操作的所有数据的列表。

即使在提出任何“实体 - 关系”模型之前,也必须建立该词典。 数据名称/说明必须完全开发,这个可以避免“类似”数据条目之间的混淆,例如“companyName”和“personName”。

因此,“开发的列名称”约定反映了这样的事实,在数据级别,类似的列(例如Company.name和Person.name列)不像它们似乎那样等效。虽然他们看起来都像是在这里拿一个名字,但其中一个是为了拥有公司名称,而另一个是为了拥有一个人的名字!

然后,可以将此约定视为反映每个数据库列的确切含义的方法,或反映数据字典中每个条目的确切含义

答案 4 :(得分:1)

除了其他人所说的话,它还会在存在识别关系的情况下使事情变得更简单(例如,识别FOREIGN KEYs)。

标识关系将父级主键“迁移”到子级主键的一部分。前缀确保不会发生冲突,即使存在多个级别的标识关系,也不需要重命名迁移的字段。例如:

PARENT:
    PARENT_NAME      PK

CHILD:
    PARENT_NAME      PK, FK referencing PARENT
    CHILD_NAME       PK

GRANDCHILD:
    PARENT_NAME      PK, FK referencing CHILD
    CHILD_NAME       PK, FK referencing CHILD
    GRANDCHILD_NAME  PK

在整个数据模型中保持相同的名称可以避免对字段的含义以及字段的来源产生任何混淆。

另一方面,前缀可能会影响可读性,所以我通常会采取妥协:前缀主键字段,但保留其他字段不加固定。

答案 5 :(得分:1)

这不是一个惯例;有些人这样做,有些人没有。我经常看到一个以表名为前缀的ID列,但没有其他列。一些(所有?)DB也允许在查询中使用表名前缀,但它既不是必需的,也不是实际列名的一部分。

答案 6 :(得分:0)

我不喜欢这样的命名约定。它鼓励懒惰,特别是在查询中使用不合格的引用。为查询中的每个表使用别名,并使用适当的别名限定每个列引用。

我喜欢的唯一这样的命名约定与主键/外键有关:

  • 我喜欢给主键命名一些聪明的东西,比如id
  • 我喜欢使用包含主键的表的名称为外键列的名称添加前缀。

它使得更易读的SQL,恕我直言。一个例子:

创建表foo    (      id int not null主键,      ...    )

创建表格栏    (      id int not null主键,      foo_id int not null外键引用foo(id),      ...    )

选择*    来自foo foo    在bar.foo_id = foo.id

上加入吧栏

当你进入复合键时,这个方案就会失败。但我喜欢它。 YMMV。