列命名建议

时间:2009-07-07 17:26:23

标签: sql database-design naming-conventions

我知道还有其他的命名约定讨论,但我看到的都是一般指导原则,我要求更多关于我的具体案例的良好做法的建议。但是,如果还有其他问题直接涵盖我的案例,请将其链接,我很乐意删除此问题。

我有一个用于建模电子设备的数据库,其中包含模型,单位,品牌,制造商等表格。我想知道如何调用代表该实体实例的实际文本名称的列 - 如在“佳能”或“惠普”品牌。显然,我可以采用惯例来简单地调用我最初做过的“名称”一栏。但是在选择期间,您被迫引用表名来获取列,因为“name”在所选列中不是唯一的:

SELECT Model.name, Brand.name, FROM Model, Brand

哪个好,但后来我找到了MobilePhoneFormFactor表和Year表,后者用于存储特定年份的累积数据。如果我强迫自己对这些表使用相同的约定,我得到:

SELECT Model.name, Brand.name, Year.name, MobilePhoneFormFactor.name FROM Model, Brand, MobilePhoneFormFactor, Year

将年份称为“Year.name”而不仅仅是“year”似乎有点奇怪。我可以使这个例子成为一个例外,但是我已经打破了我刚才提到的命名约定。所以我考虑了这个替代的命名约定:

SELECT model, brand, formFactor, year FROM Model, Brand, MobilePhoneFormFactor, Year

此处,Brand表格中有一个“品牌”列,它是品牌的文字名称,Model表格中有一个“model”列,它是模型的文本名称...等。如此select语句所示,这种方法还允许我在大多数情况下方便地删除列的表名前缀(如果保留了表名,则会得到相当多余的“SELECT Model.model, Brand.brand, ...”)。

但是如果我想为每个表都有一个描述字段呢?显而易见的实现再次是Brand.desc,Year.desc,就像我最初的名字方法一样。所以这让我认为最简单的回归到Brand.name,Year.name方案是最安全和最一致的,即使在某些情况下它有点奇怪。

第三个选项是将列命名为“brandName,modelName”等,但您也可以简单地使用“name”,并且在这种情况下始终引用带有“Brand.name,Model.name”的查询中的表名称

您认为对我的案例最好的是什么?我不是数据库老手,所以我想知道未来的事情会让我回头看看,“如果我刚刚使用Brand.name,Year.name”,那将会更加直观。实例

注意:无论我最终调用它,文本名称列(自然键)都被用作具有unqiue约束的备用键;我正在使用IDENTITY列作为主键。

8 个答案:

答案 0 :(得分:4)

我会选择name。我并不反对Year.name有点奇怪,但IMAO总是知道这个专栏是什么而且不必记住任何东西是值得的。

虽然我们正在探索各种选择,但有些人喜欢这样做Model.ModelNameBrand.BrandName等。

我当然认为他们疯了。

答案 1 :(得分:2)

这是一个灰色的话题,你会发现没有正确或错误的答案,但每个人都有自己的观点和命名惯例。

一些一般规则。

  1. 保持一致。

  2. 避免在列中重复表名。

  3. 避免使用SQL Server密钥或保留字。

  4. 具有描述性。如果您和/或其他人无法确切地确定基于名称在列中存储了哪些数据,则表明其名称不正确。

答案 2 :(得分:2)

我不喜欢重复的事情,因此我不会使用Product.ProductName(也不要使用Product.ProductId。)

就像表格一样命名列似乎也对我有害 - Product.Product?!?如果表中的一行代表产品,那么产品如何由单个列表示?所以我绝对地建议Product.Name

在表格Year的情况下,我倾向于说名称不是很好选择 - 你不是存储大约一年的信息,而是存储积累间隔。也许称之为ReportingInterval然后调用列Year没有问题。我不认为这违反了命名惯例 - 它只是一个列名Name。如果您确实想要一个具有相同名称的键列,那么您应该将其命名为NaturalKey,因为您需要一个具有特定功能的列,而不是描述所有表的公共属性。

顺便说一下,表名必须多元化......:D

答案 3 :(得分:1)

我通常在查询中对我的表进行别名,例如:

SELECT b.Name, m.Name, mpff.Name 
FROM Brands b, Manufacturers m, MobilePhoneFormFactor f  etc...

但是我认为MobilePhoneFormFactor名字太长了;我只称它为FormFactor。

答案 4 :(得分:1)

我通常会使用对表格有意义的最清晰的列名称,无论是否存在名称冲突;当您这样做时,请确保在任何select语句中的列名前明确声明表名。

如:

SELECT Model.name, Brand.Name, mff.Name from Model, Brand, MobileFormFactor as mff...

答案 5 :(得分:1)

我同意Neil N,在进行多表连接以消除歧义时,在任何情况下使用表名或别名都是个好主意。使用有意义的名称命名列,然后在执行多表连接时对表进行别名并使用别名。

您的表名应尽可能明确。较短的名称是理想的,但如果需要更长的名称来减少歧义,则使用更长的名称。

答案 6 :(得分:1)

我总是使用:

SELECT ModelName, BrandName, FROM Model, Brand

如果您使用

SELECT Model.name, Brand.name, FROM Model, Brand

然后,当您在视图中连接表时,您需要为每列添加别名,例如

SELECT Model.name AS ModelName, Brand.name AS BrandName, FROM Model, Brand

如果您使用ModelID,ModelName,ModelDescription等字段,那么当您加入表时,您总是知道自己在处理什么 - 特别是当您使用别名(您应该使用),然后使用m.ModelName而不是Model时。 MODELNAME。

答案 7 :(得分:0)

我会坚持使用最简单的方案。所有方案都会在一段时间后崩溃,并且很难记住您使用除名称和ID之外的其他内容或原因。

我总是将表格别名并在选择列时使用这些别名。我的别名约定(是的,这个方案也有它的限制)是表名中每个单词的第一个首字母。所以

SELECT m.name, b.name, FROM Model AS m, Brand AS b ...

SELECT m.name, b.name, y.name, mpff.name FROM Model AS m, Brand AS b, MobilePhoneFormFactor AS mpff, Year AS y ...

这使命名模式简单易记,并使SQL更具可读性。我还使用显式JOIN语句来区分表连接和WHERE子句中的过滤子句,但这可能超出了问题的范围。