数据库,表和列的命名约定?[关闭]


790

每当我设计数据库时,我总是想知道是否有最佳方式在数据库中命名项目。我经常问自己以下问题:

  1. 表名应该是复数吗?
  2. 列名应为单数吗?
  3. 我应该为表格或列添加前缀吗?
  4. 我在命名项目时应该使用大小写吗?

是否有建议的指南来命名数据库中的项目?


7
我认为我们应该为表命名为复数,为列命名为单数。
AZ_

7
我将表视为具有多个项目的“存储”,而不是单个“实体”,因此我将其命名为复数。当我将表映射到对象时,我将对象命名为单数。这只是我个人的看法。
dpp

2
@Tryinko对于在多个表中进行联接的任何人来说,使用ID遍地都是LIVING HELL。知道这是PK的微小优势是不可能的,它会在每个血腥查询中一遍又一遍地重命名dang ID列,这是令人难以置信的烦恼。如果要在表中表示PK,请使其成为第一列。而且,在我看来,在列名称中表示FK是另一个坚决邪恶的反模式。
ErikE '16

Answers:


315

我建议检查Microsoft的SQL Server示例数据库:https : //github.com/Microsoft/sql-server-samples/releases/tag/adventureworks

AdventureWorks示例使用非常清晰和一致的命名约定,该约定使用模式名称来组织数据库对象。

  1. 表的单数名称
  2. 列的单数名称
  3. 表前缀的架构名称(例如:SchemeName.TableName)
  4. Pascal机壳(又名上驼壳)

14
wilsonmar.com/sql_adventureworks.htm是对AdventureWorks模式的出色分析。
Daniel Trebbien 2011年

209
我不会依赖Microsoft的任何标准-如果查看他们的northwind数据库,您会看到他们使用复数表,奇异列名,表的模式前缀,主键列的表前缀,匈牙利式约束前缀和最差的多空格表名称中所有SPACES“”中的一个。另外,SQLServer的系统表使用复数形式,因此AdventureWorks似乎是这堆中的败笔。
Marcus Pope

63
我认为这里的主要问题是,单数表名称人群似乎将表视为实体,而不是复数人群所做的表中的行。您必须问自己是什么。如果表只是行的容器,使用复数命名是否更合逻辑?您永远不会以单数形式命名集合,那么为什么要以单数形式命名表呢?为什么不一致?我听到了所有关于它们如何在联接中排序和使用的争论,但这些争论似乎都很脆弱。如果这一切都归于偏爱,那么我将坚持一致和多元化。
杰森

4
还应考虑潮汐向哪个方向发展。似乎它朝着复数表名称的方向发展,尤其是因为SQL Server中的所有系统表都是复数形式,并且Entity Framework的默认值为开箱即用。如果那是微软的立场,我想朝着20年后的方向发展。甚至Oracle的数据库约定也使用复数表名。试想一下,有多少c#开发人员在引入“ var”关键字后就讨厌它了,而现在它已成为定义变量的广泛接受的方式。
杰森

7
@Jasmine-尽管您无意中将示例表命名为反向,但我看到了您的观点。我希望将“ TableOfInvoices”缩写为“ Invoices”。您可能改为使用“ InvoiceTable”,这可以缩短“ Invoice”。
德里克(Derek)2013年

278

这里的答案很晚,但总之:

  1. 我的偏好是复数
  2. 表格:*通常*最好没有前缀。 列数
  3. 表格和列:PascalCase。

详细说明:

(1)你必须做的。每次 您必须以某种方式执行的事情很少,但也有一些。

  • 使用“ [singularOfTableName] ID”格式命名您的主键。也就是说,无论您的表名是Customer还是Customer,主键都应该是CustomerID
  • 此外,必须在不同的表中一致地命名外键。殴打不这样做的人应该是合法的。我认为尽管定义的外键约束通常很重要,但一致的外键命名始终很重要
  • 您的数据库必须具有内部约定。即使在后面的部分中,您会看到我非常灵活,但数据库中命名必须非常一致。与您在同一数据库中以相同的方式进行操作相比,将客户的表称为“ 客户”还是“ 客户”并不那么重要。您可以掷硬币来确定如何使用下划线,但是您必须继续使用下划线。如果您不这样做,那么您就是一个自卑的坏人。

(2)您可能应该做什么。

  • 代表不同表上的同类数据的字段命名为相同的字段。不要在一个表上有Zip,在另一个表上没有ZipCode。
  • 要在表名或列名中分隔单词,请使用PascalCasing。使用camelCasing并不是本质上的问题,但这不是约定,看起来很有趣。我稍后会强调下划线。(您可能不像以前那样使用ALLCAPS。OBNOXIOUSTABLE.ANNOYING_COLUMN在20年前在DB2中还可以,但现在不行。)
  • 请勿人为地缩短或缩写单词。名字简短明了比简短而混乱更好。超短名称是对更黑暗,更野蛮的时间的保留。Cus_AddRef。那到底是什么?托管收件人参考?客户额外退款?自定义地址推荐?

(3)您应该考虑的问题。

  • 我真的认为您应该为表使用复数名称。有些人认为单数。阅读其他地方的论点。但是,列名应为单数。即使您使用复数表名,代表其他表组合的表也可能是单数。例如,如果您具有“ 促销”和“ 项目”表,则表示某个项目是促销的一部分的表可以是Promotions_Items,但也可以合法地是我认为的Promotion_Items(反映一对多关系)。
  • 为特定目的而始终使用下划线。使用PascalCasing,一般表的名称应该足够清楚;您不需要使用下划线来分隔单词。保存下划线(a)以表示关联表,或(b)作为前缀,我将在下一个项目符号中解决。
  • 前缀既不是好事也不是坏事。它通常不是最好的。在您的前一两个数据库中,我不建议对表的常规主题分组使用前缀。表格最终不容易符合您的类别,这实际上会使查找表格更加困难。凭经验,您可以计划并应用一个弊大于利的前缀方案。我曾经在db中工作过,其中数据表以tbl 开头,config表以ctbl开头vew的视图,proc的spudffn,以及其他一些;它经过精心,始终如一的应用,因此效果还不错。需要前缀的唯一时间是,由于某种原因您拥有真正独立的解决方案时,它们位于同一数据库中。给它们加上前缀对分组表非常有帮助。在特殊情况下也可以使用前缀,例如要突出显示的临时表。
  • 您很少(如果有的话)想给列加上前缀。

11
“在不同表上表示相同类型数据的字段应命名为相同。在一个表上没有Zip,在另一个表上没有ZipCode。” 是是一百万次是。您能告诉我们数据库不是那样设计的吗?可能以十二种不同的方式来引用一个人称谓,这很烦人。在我控制设计的任何数据库中,我始终遵循此规则,这使工作变得更加简单。
HLGEM 2010年

87
我认为主键应该只是“ ID”。这种简单的约定使主键可预测且可快速识别。但是,当它用作其他表中的外键时,我会在表名(“ PersonID”)之前加上前缀。此约定可以帮助区分同一表中的主键和外键。
Triynko 2010年

55
@Tryinko对于在多个表中进行联接的任何人来说,使用ID遍地都是LIVING HELL。知道这是PK的微小优势是不可能的,它会在每个血腥查询中一遍又一遍地重命名dang ID列,这是令人难以置信的烦恼。如果要在表中表示PK,请使其成为第一列。而且,在我看来,在列名称中表示FK是另一个坚决邪恶的反模式。
ErikE 2011年

18
@Triynko如果仅使用“ ID”,则在编程上也无法确定其所属的表。使用表名前缀,您可以简单地切断主键的后两位,并通过代码知道它所属的表名。很多时候,IT和DBA员工没有意识到程序员以某种方式设计数据库具有编码优势。
dallin

16
@ErikE我的意思是您不知道CustomerIDCustomer表是主键还是其他表中的外键。这是一个小问题。你为什么要使用像这样的坏名字cCustomerID = Customer.ID很明显,您会看到您正在将外键与主键连接在一起;这不是多余的,因为双方是两个不同的事物。单字符命名是IMO的不佳做法。
Dave Cousineau

100

好的,因为我们考虑了很多意见:

我认为表名应为复数。表是实体的集合(表)。每行代表一个实体,表代表集合。因此,我将称一个“人”实体“人”表(或称“人”,无论您喜欢什么)。

对于那些希望在查询中看到单数的“实体名称”的人,这就是我将表别名用于:

SELECT person.Name
FROM People person

有点像LINQ的“从人中选人”。

至于2、3和4,我同意@Lars。


17
@Emtucifor:用英语,我们不会说“看着那群人中的所有人!” 可能会有一个概念性问题,即多个事物由单数词引用。这既不正常也不适当。“数据”是例外,通常用于指代一定体积的物质,非常类似于“蛋糕”。“你要一块蛋糕吗?” 为表“ People”命名是因为它包含有关多个个人的信息,这比命名为“ Person”要有意义得多。ROW的名为“ Person”的数据类很有意义,单数列名也是如此。
Triynko 2010年

6
@Emtucifor:最终,所有语言都是任意和常规的。我只是在争辩说,按照惯例,我们将项目集合称为其中项目类型的复数形式。因此,其中每行包含有关一个人的信息的行集合将被称为“人”集合。但是,如果您要将其称为Person的集合,请继续。
Triynko 2010年

3
@Emtucifor:是的,哈哈。将表命名为“ PersonCollection”将等同于将其命名为“ People”。与命名这样的集合只是“人”相反,这没有任何意义:)
Triynko 2010年

4
@Emtucifor:然后让我们从另一个角度考虑它,以便将命名约定放在上下文中。假设您有用于表示行和表的对象类。对于表示一行数据的类,“人员”显然是有意义的。如果您的表也被命名为“ Person”,那么您可能会有命名冲突或某些困惑。我只是认为用准确的复数命名对象更有意义。有一个人应该被称为人,并与有关的人或者多个人信息的表格数据的行被称为人民,PersonCollection,人员等
Triynko

5
@Josh M.嗯,不是任何方式你走。如果按照我的方式,可以将People表别名为“ person”并具有SELECT person.Name。问题解决了。;-)
马特·汉密尔顿,2010年

73

我在具有三个DBA的数据库支持团队中工作,我们考虑的选项是:

  1. 任何命名标准都比没有标准要好。
  2. 没有“一个真实的”标准,我们都有我们的偏好
  3. 如果已经有标准,请使用它。不要创建另一个标准或混淆现有标准。

我们对表使用单数名称。表通常以系统名称(或其首字母缩写)为前缀。如果系统复杂,这很有用,因为您可以更改前缀以将表按逻辑分组(即reg_customer,reg_booking和regadmin_limits)。

对于字段,我们希望字段名称包含表的前缀/ acryonm(即cust_address1),并且我们也更喜欢使用一组标准后缀(_id表示PK,_cd表示“代码”,_nm表示“名称” ”,_nb代表“数字”,_dt代表“日期”)。

Foriegn键字段的名称应与“主键”字段相同。

SELECT cust_nm, cust_add1, booking_dt
FROM reg_customer
INNER JOIN reg_booking
ON reg_customer.cust_id = reg_booking.cust_id

在开发新项目时,建议您写出所有首选的实体名称,前缀和首字母缩写词,并将此文档提供给开发人员。然后,当他们决定创建新表时,他们可以引用文档,而不是“猜测”该表和字段应被调用的内容。


9
特别是对于第三名,我们有一群人都是从同一家公司聘用的,他们试图将自己的旧命名标准(我们其他人都没有使用过)强加于他们所做的任何事情上。很烦人。
HLGEM 2010年

40
当然会使SQL不可读;但我认为我可以翻译。cust_nm应为CustomerName,booking_dt应为BookingDate。reg_customer,嗯,我不知道那是什么。
伊恩·博伊德

3
@伊恩 目的是使您坚持惯用的命名约定,并保持一致。我总是知道任何日期字段都是_dt,任何名称字段都是_nm。“ reg”是“注册”系统(预订,客户等)的一个示例,并且所有相关表都具有相同的前缀。但是每个人都有自己的……
Guy 2010年

7
我同意特定的标准不如拥有一致的标准重要。但是有些标准是错误的。DB2和列名称,例如CSPTCN,CSPTLN,CSPTMN,CSDLN。人们应该了解长名称已经被发明了-我们有能力使事物可读。
伊恩·博伊德

17
多年来,我在我开发和销售的应用程序表的末尾添加了新列。有时,我在列中使用英文名称,有时使用西班牙语,有时我将列重新用于其他用途,而不是删除它们并添加具有适当描述性名称的新列。我故意这样做是为了混淆我的源代码,以防其他人尝试破解或反向工程我的代码。只有我能理解,否则别人会感到沮丧!..这样,他们总是不得不依靠我!
Frank R.

47
  1. 否。表应以其代表的实体命名。无论记录中的哪一位代表,人都是人,而不是人。
  2. 再说一遍。实际上,FirstName列不应称为FirstNames。这完全取决于您要用该列表示什么。
  3. 没有。
  4. 是。为了清楚起见,将其装入。如果您需要具有“ FirstName”之类的列,则使用大写将使其更易于阅读。

好。那是我的0.02美元


5
为数字3增添了一些清晰度-前缀是一种将元数据嵌入到列名中的方法。出于与(过度使用)匈牙利表示法相同的原因,在任何现代数据库中都不需要这样做。
Mark McDonald

21
“从订单中选择前15名”还是“从订单中选择前15名”?后者是我(人类)的偏爱。
伊恩·博伊德

8
@Ian Boyd:是的:选择前100位*从报表R的内部联接VisitReport VR ON R.ReportID = VR.ReportID。这完全取决于您的想法。如果在罐子上放一张柠檬的图片,您就会知道里面有柠檬,而外面不需要两个柠檬来表示它可以是复数。当然,您可以将其标记为“柠檬”。但这也可能是“柠檬”。要获取名为“柠檬”的资源,请转到此处。
ErikE 2010年

6
为在列名称中使用UpperCase添加$ 0.01,为在列名称中使用下划线添加另一个$ 0.01,以便在外观上更容易区分列名称。总计=我对您的$ 0.02捐款!
Frank R.

6
“表应以其代表的实体命名”。表是实体的集合。虽然表也是实体,但它是类型为“表”的实体,添加到其名称毫无意义。
Trisped

34

我也赞成ISO / IEC 11179样式命名约定,并指出它们是准则而不是说明性的。

请参阅Wikipedia上的数据元素名称

“表是实体的集合,并遵循集合命名准则。理想情况下,使用集合名称:例如,人员。复数也是正确的:Employees。不正确的名称包括:Employee,tblEmployee和EmployeeTable。”

像往常一样,规则也有例外,例如始终只有一行的表最好使用单数形式的名称,例如config表。一致性至关重要:检查您的商店是否有约定,如果有,请遵守;如果您不喜欢它,那么请做一个商业案例来对其进行更改,而不要成为唯一的管理员。


-1:引用的文本与ISO / IEC 11179没有任何关系。读取的实际标准,而不是(metadata-standards.org/11179/#A5
mkadunc

@onedaywhen:我对该主题了解不足,无法更正维基百科页面;另外,维基百科页面并没有太多错误,因为它具有误导性-它没有明确表示ISO / IEC 11179包含数据库命名约定,它只是说“ ISO / IEC 11179适用于在关系型数据库”。然后继续提供一个可能用于关系数据库的命名约定的示例。它可以使您认为该示例是从标准中提取的,而实际上它是由Wikipedia文章的作者所组成的。
mkadunc 2012年

27

我一直都在争辩说,桌子是否复数都是个人喜好,没有最佳实践。我不相信这是真的,尤其是作为程序员而不是DBA。据我所知,除了“对我来说很有意义,因为它是对象的集合”以外,没有其他理由使表名复数,而通过使用单表名可以在代码中获得合法收益。例如:

  1. 它避免了由多义性引起的错误和错误。程序员并非以其拼写专业知识而著称,而将某些单词复数会造成混淆。例如,复数词以“ es”结尾还是仅仅是“ s”?是人还是人?当您与大型团队一起进行项目时,这可能会成为问题。例如,团队成员使用不正确的方法对他创建的表进行复数的情况。当我与该表进行交互时,该表已在我无法访问的代码中全部使用,或者需要很长时间才能修复。结果是我必须记住每次使用该表时都会拼写错误。我发生了与此非常相似的事情。您可以更轻松地使团队中的每个成员一致,轻松地使用确切的,正确无误的表名,或者始终需要查找表名的效果更好。单一版本在团队环境中更容易处理。

  2. 如果您使用表名的单数形式并在主键之前加上表名,则现在可以轻松地通过代码单独从主键确定表名,反之亦然。可以给您一个带有表名的变量,将“ Id”连接到末尾,现在您可以通过代码获得表的主键,而无需执行其他查询。或者,您可以从主键的结尾处截断“ Id”,以通过代码确定表名。如果使用不带表名的“ id”作为主键,则无法通过代码从主键确定表名。此外,大多数使用表名对表名和PK列加前缀的人都会在PK中使用表名的单数形式(例如statuss和status_id),

  3. 如果将表名设为单数,则可以使它们与它们代表的类名匹配。再一次,这可以简化代码,并允许您做一些真正整洁的事情,例如通过仅使用表名来实例化一个类。它还只会使您的代码更加一致,从而导致...

  4. 如果将表名设为单数,则将使您的命名方案一致,有条理并且易于在每个位置维护。您知道在代码的每个实例中,无论是在列名,类名还是表名中,它都是相同的名称。这使您可以进行全局搜索以查看使用数据的任何地方。当您对表名进行复数化时,在某些情况下,您将使用该表名的单数形式(它变成主键中的类)。在某些情况下没有数据被称为复数的情况而在某些情况下将单数的情况称为合理。

综上所述,如果您对表名进行复数化处理,则会失去使代码更智能,更易于处理的各种优势。甚至在某些情况下,您必须具有查找表/数组才能将表名转换为可以避免的对象或本地代码名。尽管一开始可能会感到有些奇怪,但单数表名相对于复数名具有明显的优势,我认为这是最佳实践。


26

我们的偏好:

  1. 表名应该是复数吗?
    决不。将其作为集合的参数很有意义,但您永远不知道表将包含什么(0,1或许多项目)。多个规则使命名变得不必要地复杂。一栋房子,两栋房子,老鼠与老鼠,人与人,我们甚至都没有看过其他语言。

    Update person set property = 'value'对表中的每个人起作用。
    Select * from person where person.name = 'Greg'返回人员行的集合/行。

  2. 列名称应为单数吗?
    通常,是的,除非您要违反规范化规则。

  3. 我应该为表格或列添加前缀吗?
    通常是平台偏好。我们更喜欢为表名加上前缀列。我们不为表加前缀,但为视图(v_)和stored_procedures(sp_或f_(函数))加前缀。这可以帮助想要尝试更新v_person.age的人,这实际上是视图中的计算字段(无论如何都无法更新)。

    这也是避免关键字冲突的好方法(delivery.from会中断,但delivery_from不会)。

    它的确使代码更加冗长,但通常有助于提高可读性。

    bob = new person()
    bob.person_name = 'Bob'
    bob.person_dob = '1958-12-21'
    ...可读性很强。但是,这可能会失控:

    customer.customer_customer_type_id

    表示customer和customer_type表之间的关系,表示customer_type表(customer_type_id)上的主键,如果在调试查询时看到“ customer_customer_type_id”,则可以立即知道它来自(customer表)的位置。

    或customer_type和customer_category之间有MM关系(仅某些类型可用于某些类别)

    customer_category_customer_type_id

    ...在长边有点(!)。

  4. 我在命名项目时应该使用大小写吗?是的-小写:),带下划线。这些都是易读和跨平台的。与上面的3一起也很有意义。

    其中大多数是首选项。-只要您保持一致,任何需要阅读的人都应该可以预见。


1
SELECT * FROM people AS person WHERE person.name = 'Greg'听起来对我来说是最自然的。
Kenmore

1
@Zuko大多数情况下,为表的主键的命名约定<table name><id>,例如PersonIDPerson_ID等。因此,它更有意义,因为每个记录是一个独立的人不是人,你没有名字的复数你的表。
金发先生

20

看看ISO 11179-5:命名和识别原理您可以在这里获得:http ://metadata-standards.org/11179/#11179-5

我在这里写过一篇关于它的博客:ISO-11179命名约定


19
如果您在此处提供摘要,您的答案将更易于访问(=更好)。很棒的指针!
OlaEldøy09年

15

我知道这已经晚了,问题已经得到很好的回答,但是我想就列名的前缀在#3上发表我的看法。

所有列均应使用在其定义表中唯一的前缀来命名。

例如,给定表“ customer”和“ address”,我们分别使用“ cust”和“ addr”作为前缀。“客户”中将包含“ cust_id”,“ cust_name”等。“地址”中将包含“ addr_id”,“ addr_cust_id”(返回给客户的FK),“ addr_street”等。

当我第一次被提出这个标准时,我对它一无所知。我讨厌这个主意。我无法忍受所有额外键入和冗余的想法。现在我已经有了足够的经验,我再也不会回头了。

这样做的结果是数据库模式中的所有列都是唯一的。这有一个主要好处,它胜过所有反对它的争论(当然,在我看来):

您可以搜索整个代码库,并可靠地找到涉及特定列的每一行代码。

#1带来的好处是巨大的。我可以弃用一列,并且确切知道在可以从架构中安全删除该列之前需要更新哪些文件。我可以更改列的含义,并确切知道需要重构哪些代码。或者我可以简单地说出来自列的数据是否甚至在系统的特定部分中使用。我无法计算将一个潜在的庞大项目变成一个简单项目的次数,也无法计算我们在开发工作中节省的时间。

另一个相对较小的好处是,您只需在执行自我联接时使用表别名即可:

SELECT cust_id, cust_name, addr_street, addr_city, addr_state
    FROM customer
        INNER JOIN address ON addr_cust_id = cust_id
    WHERE cust_name LIKE 'J%';

1
然后,您将无法reliably find every line of code that touches a particular column...不是重点吗?
raveren

6
@Raveren-您仍然可以。如果您要做的只是“ SELECT *”,那么与此查询无关。当/如果稍后使用查询结果,则必须使用列名称来处理其数据,因此这是您需要在代码中担心的地方,而不是SQL语句。
Granger 2013年

我会对在什么情况下需要SELECT *感到好奇?我当然不希望任何人在生产代码中使用它。是的,它对于临时查询以及找出哪些数据使您的多联接查询结果变得奇怪很有用,但是我认为在生产代码中没有需要的地方。
HLGEM 2013年

2
除非您使用非OO语言编写整个应用程序,否则具有合适的ORM层会使此参数变得多余。
亚当

6
因此,由于这个答案,我决定尝试在大型项目中使用表前缀,并认为我会向后报告。它确实使重构表变得非常容易,这太棒了!但是,这比我预期的要痛苦得多。我们的数据库有很多复杂的命名表。容易记住Cust是Customer的前缀,但不容易记住HazardVerificationMethod的前缀。每次我写一个表或字段时,我都不得不停下来思考一下前缀。最后,我认为速度和便利性比可搜索性更为重要,但我确实觉得这是一次宝贵的经验。
达林

15

我对这些的看法是:

1)不,表名应为单数。

尽管对于简单选择(select * from Orders)似乎很有意义,但对于OO等效项(Orders x = new Orders)却没有太大意义。

数据库中的表实际上是该实体的集合,一旦使用set-logic,它就更有意义了:

select Orders.*
from Orders inner join Products
    on Orders.Key = Products.Key

最后一行,即连接的实际逻辑,看上去与复数的表名混淆了。

我不确定是否总是使用别名(如Matt所建议的那样)可以解决这一问题。

2)它们应为单数,因为它们仅拥有1个财产

3)永远不要,如果列名模棱两可(如上图,它们都具有称为[Key]的列),则表名(或其别名)可以很好地区分它们。您希望查询快速键入且简单-前缀会增加不必要的复杂性。

4)无论您想要什么,我都建议使用CapitalCase

我不认为在这些方面有一套绝对的准则。

只要您选择的内容在整个应用程序或数据库中是一致的,我认为这并不重要。


3
到底是CapitalCase什么?
ViRuSTriNiTy

@ViRuSTriNiTy他可能是指pascal case
marctrem

基思(Keith),在#3上我都做,并且我前后不一致(但是我离题了),但是我不明白为什么只要不具有描述性的列名(只要与表相同)就不好了。变量等
约翰尼

@johnny这样还不错,只是不需要。为什么要键入不必要的内容?也最智能感知主要使用名称的开始,所以如果你有Product.ProductNameProduct.ProductIDProduct.ProductPrice等打字Product.P给你所有的前缀领域。
基思

13

在我看来:

  1. 表名应为复数。
  2. 列名应为单数。
  3. 没有。
  4. 对于表名和列名,可以使用CamelCase(我更喜欢)或underscore_separated。

但是,就像已经提到的那样,任何约定总比没有约定好。无论选择哪种方式,都要记录下来,以便以后的修改都遵循相同的约定。


1
关于#4,PascalCase ... camelCase ... snake_case ...
Andrew

11

我认为您和您的团队将为每个问题提供最佳答案。拥有命名约定远比命名约定的精确度重要得多。

由于没有正确的答案,您应该花一些时间(但不要太多)并选择自己的约定,并且- 这是重要的部分-坚持下去。

当然,这是您所要询问的关于标准的信息,这是很好的,但不要着急或担心您可能会得到的不同答案的数量:选择一个对您来说似乎更好的答案。

以防万一,这是我的答案:

  1. 是。桌子是一组记录老师演员,所以...复数。
  2. 是。
  3. 我不使用它们。
  4. 我经常使用的数据库-Firebird-将所有内容都保留为大写,因此没关系。无论如何,在编程时,我会以一种更易于阅读的方式编写名称,例如releaseYear

11
  1. 绝对将表名保持单数,人而不是人
    1. 同样在这里
    2. 否。我已经看到了一些可怕的前缀,甚至可以说是要处理的是表(tbl_)还是用户存储过程(usp_)。然后是数据库名称...不要这样做!
    3. 是。我倾向于PascalCase我所有的表名

28
我的天啊。没有。表名一定是复数。这是一个集合。它有很多东西。“从人中选择*”。您不是从一个人中进行选择,而是从多个人中进行选择!
Triynko 2010年

4
我一直很喜欢select语句是复数形式时听起来更好的方式。SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'表格复数,列单数。再次总是个人意见问题。
scunliffe 2012年

在处理数据库元数据时,给tbl,qry等添加前缀非常有用,如果您正在检查具有快速,简单命名约定的数据库中的对象,则可以大大提高理解速度
Cruachan

9

命名约定使开发团队可以在项目的核心设计可发现性和可维护性。

好的命名约定需要花费一些时间才能发展,但是一旦到位,就可以使团队继续使用通用语言。良好的命名约定与项目一起自然发展。良好的命名约定可以轻松应对软件生命周期中最长,最重要的阶段(生产中的服务管理)中的更改。

这是我的答案:

  1. 是的,当表名称涉及一组交易证券交易对手时,表名称应为复数形式。
  2. 是。
  3. 是。SQL表的前缀为tb_,视图的前缀为vw_,存储过程的前缀为usp_,触发器的前缀为tg_,后跟数据库名称。
  4. 列名应使用小写字母,并用下划线分隔。

命名很困难,但是在每个组织中都有一个可以命名的人,在每个软件团队中都应该有人对命名标准负责,并确保诸如sec_idsec_valuesecurity_id之类的命名问题在被纳入项目之前尽早得到解决。 。

那么,良好的命名约定和标准的基本原则是什么?

  • 使用客户和解决方案域的语言
  • 具有描述性
  • 始终如一
  • 消除歧义,反映和重构
  • 除非所有人都清楚,否则不要使用缩写
  • 不要将SQL保留关键字用作列名

3
表是按定义的关系。实际上是单数。前缀糟透了。您是否曾经需要将表更改为视图,反之亦然?尝试使用前缀。如果它是视图或表,有什么区别?
威廉·琼斯

在两个对象具有相同名称的地方,例如函数和存储过程,前缀可能会有所帮助。我将拥有一个名为“ GetApproverList”的函数,并且我想创建一个具有相同名称的存储过程,该存储过程将在内部调用此函数。SQL不允许创建两个具有相同名称的对象。
拉文德·辛格


7
SELECT 
   UserID, FirstName, MiddleInitial, LastName
FROM Users
ORDER BY LastName

2
请注意所使用的标准:表包含多个内容,用户具有一个名字,大写的T-SQL关键字,帕斯卡的情况下的表定义。
伊恩·博伊德

3
错别字:Lastname应为LastName
最小动物

1
表名应为单数,即:User而不是Users
AZ_

并注意表名称是如何复数的;因为他们拥有用户,而不是用户
伊恩·博伊德

5

表名应始终为单数,因为它们代表一组对象。正如您说的,牛群代表一群绵羊,羊群代表一群鸟类。无需复数。当表名是两个名字的组成并且命名约定是复数形式时,很难知道复数名称是第一个单词还是第二个单词,或者两者都是。这是逻辑– Object.instance,而不是object.instance。或TableName.column,而不是TableNames.column。Microsoft SQL不区分大小写,如果使用两个大写字母组成的表名或列名,则使用大写字母时,读取表名更容易。


2
一群是一群绵羊。一个User不是一组用户。
EricRobertBrewer

4

表名:它应该是单数形式,因为它是表示现实世界对象的单数实体,而不是表示单数形式的对象。

列名:只有当它表示它将拥有一个原子值并确认归一化理论时,才应为单数。但是,如果有n个相同类型的属性,则应在其后缀1、2,...,n等。

前缀表/列:这是一个巨大的话题,稍后将讨论。

外壳:应该是骆驼壳

我的朋友帕特里克·凯彻Patrick Karcher),我请您不要写任何可能令人反感的内容,如您所言:“•此外,必须在不同的表中统一命名外键。殴打不这样做的人应该合法。做这个。”。我的朋友帕特里克(Patrick)从未犯过这个错误,但我的写作总体上是这样。如果他们俩计划为此击败您怎么办?:)


2
所以您是说表是实体?还是表中的行是实体?对我来说,表是行的集合-因此是表示复数的实体的集合。
杰森

4

晚会很晚,但我仍然想在栏前缀上加上两美分

对于列使用table_column(或tableColumn)命名标准,似乎有两个主要参数,这两个事实都是基于列名本身在整个数据库中是唯一的这一事实:

1)您不必一直在查询中指定表名和/或列别名

2)您可以轻松地在整个代码中搜索列名

我认为这两种说法都是有缺陷的。不使用前缀即可轻松解决这两个问题。这是我的建议:

始终在SQL中使用表名。例如,请始终使用table.column而不是column。

显然,它解决了2),因为您现在可以仅搜索table.column而不是table_column。

但是我能听到你的尖叫声,它如何解决1)?正是要避免这种情况。是的,是的,但是解决方案存在严重缺陷。为什么?好了,前缀解决方案可以归结为:
为了避免在出现歧义时不必指定table.column,请将所有列都命名为table_column!
但这意味着从现在开始,每次指定列时都必须写列名称。但是,如果仍然必须这样做,那么始终显式编写table.column有什么好处?确实,没有好处,因为键入的字符数完全相同。

编辑:是的,我知道用前缀命名列会强制正确使用,而我的方法依赖于程序员


1
如前所述,您不能完全依赖于table.column的所有情况。程序员会忘记一个地方,然后全局查找和替换就破坏了整个程序。否则您将成为一条规则,并且有人会认为他通过使用表的别名来满足该规则,从而再次挫败了全局查找。另外,如果您想通过某种数据库类来组织代码(任何优秀的程序员都可以做到),有时您会只将列名传递给db函数,或者仅将列名放在其中。一个变量。
dallin

2
@janb:我完全支持你的回答。我还想补充一点,使用文本搜索来找到依赖项是浏览代码的野蛮人方式。一旦人们摆脱了野蛮人的搜索习惯-他们将开始使用好命名,即table.column。因此,问题不在于命名风格,而是针对野蛮人的不良工具。
alpav 2015年

你的论点是有缺陷的。它的问题是它可以双向工作,并且不会增加任何优势。您说,要解决此问题,只需始终编写table.column,因为您已经在编写table_column。好吧,您也可以说只写table_column,因为您已经在写table.column。换句话说,您的答案之间没有区别,只是它引入了可能的错误并且不执行约定。这就是我们使用“私人”关键字的原因。我们可以相信程序员总是正确使用类变量,但是关键字可以强制使用它并消除可能的错误。
达林2015年

3

基本数据库命名约定(和样式)(单击此处可获得更详细的描述)

表名选择简短,明确的名称,使用不超过一两个词的区别表就可以轻松地为唯一字段名命名以及查找和链接表赋予表单数名,而不是复数(更新:我仍然同意给出的原因为了这个约定,但是大多数人真的很喜欢复数表名,所以我已经放松了立场。。。请点击上面的链接


1
尽管Oracle建议与上述链接完全相反。在这里找到Oracle所说的话。ss64.com
ora/


Oracle的命名规则是他们所有的最有趣的.. e.g. PATIENTS would have a primary key called pa_patient_id_pk!!
nawfal 2013年

2

表名单数。假设您正在模拟某人及其地址之间的房地产。例如,如果您正在读取数据模型,则您会希望“每个人可能居住在0.1或许多地址上”。或“每个人可能居住在0.1或许多地址”。我认为它更容易使地址多元化,而不是必须将人改写为人。再加上集体名词通常与单数形式不相似。


-4

--Example SQL

CREATE TABLE D001_Students
(
    StudentID INTEGER CONSTRAINT nnD001_STID NOT NULL,
    ChristianName NVARCHAR(255) CONSTRAINT nnD001_CHNA NOT NULL,
    Surname NVARCHAR(255) CONSTRAINT nnD001_SURN NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(StudentID)
);

CREATE INDEX idxD001_STID on D001_Students;

CREATE TABLE D002_Classes
(
    ClassID INTEGER CONSTRAINT nnD002_CLID NOT NULL,
    StudentID INTEGER CONSTRAINT nnD002_STID NOT NULL,
    ClassName NVARCHAR(255) CONSTRAINT nnD002_CLNA NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(ClassID, StudentID),
    CONSTRAINT fkD001_STID FOREIGN KEY(StudentID) 
        REFERENCES D001_Students(StudentID)
);

CREATE INDEX idxD002_CLID on D002_Classes;

CREATE VIEW V001_StudentClasses
(
    SELECT
        D001.ChristianName,
        D001.Surname,
        D002.ClassName
    FROM
        D001_Students D001
            INNER JOIN
        D002_Classes D002
            ON
        D001.StudentID = D002.StudentID
);

这些是我所教的惯例,但是您应该适应您开发软管使用的任何情况。

  1. 复数。它是实体的集合。
  2. 是。该属性表示实体的奇异属性。
  3. 是的,前缀表名称允许轻松跟踪所有约束索引和表别名的命名。
  4. Pascal表和列名称的大小写,前缀和所有大写字母用于索引和约束。

6
ChristianName ...这是一个奇怪的约定。
BobbyShaftoe

3
您桌上的序列号?有谁真的认为这是有道理的作品为开发商?
ErikE 2011年

既然这个例子提出来了...我个人反对在表名或列名中使用大写缩写词,因为我认为这使阅读变得更加棘手。因此,在这种情况下,我想说StudentId优于StudentID。首字母缩略词结尾时没什么大不了的,但是我在工作中看到了无数示例,其中首字母缩略词出现在名称的前部或中间,这使您更难以解析。例如:StudentABCSSN与StudentAbcSsn。
redOctober13'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.