数据库,表和列命名约定?

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

  1. 表名应该是复数?
  2. 列名应该是单数吗?
  3. 我应该前缀表或列吗?
  4. 我应该在命名项目中使用任何情况吗?

是否有任何build议的准则在数据库中命名项目?

我build议查看微软的SQL Server示例数据库: http : //codeplex.com/SqlServerSamples

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

  1. 表格的单数名称
  2. 列的单数名称
  3. 表格前缀的模式名称(例如:SchemeName.TableName)
  4. 帕斯卡套(即上骆驼案件)

迟到的答案在这里,但总之:

  1. 我的偏好是复数
  2. :*通常*没有前缀是最好的。 专栏 :没有。
  3. 表和列:帕斯卡套pipe。

阐述:

(1) 你必须做什么。 每一次你都必须以某种方式做很less的事情,但是有一些事情。

  • 使用“[singularOfTableName] ID”格式命名主键 。 也就是说,无论您的表名称是Customer还是Customers ,主键都应该是CustomerID
  • 此外, 外键必须在不同的表中一致地命名 。 殴打不这样做的人应该是合法的。 我会提出,虽然定义的外键约束通常很重要,但一致的外键命名总是很重要
  • 你的数据库必须有内部的约定 。 即使在后面的章节中,你会看到我非常灵活, 数据库中命名必须非常一致。 无论客户的客户名称是客户还是客户 ,都不如您在同一个数据库中以同样的方式进行。 你可以翻转硬币来确定如何使用下划线,但是你必须继续使用它们 。 如果你不这样做,你就是一个自卑的人。

(2) 你应该怎么做。

  • 表示不同表上相同types数据的字段应该命名相同。 不要在一张桌子上有拉链,在另一张桌子上也不要拉链。
  • 要分隔表或列名称中的单词,请使用PascalCasing。 使用camelCasing不会是本质上的问题,但这不是常规,它看起来很有趣。 我会在下一刻解决下划线。 (你可能不会像以前那样使用ALLCAPS,20年前DB2中的OBNOXIOUSTABLE.ANNOYING_COLUMN是可以的,但现在不行。)
  • 不要人为地缩短或缩短词汇。 一个名字长而明确,而不是短而混乱。 超短名字是从更黑暗,更野蛮的时代保留。 Cus_AddRef。 那到底是什么? 保pipe收件人参考? 客户额外退款? 自定义地址推荐?

(3) 你应该考虑什么。

  • 我真的觉得你应该有表格的复数名称; 有些人觉得奇怪。 阅读别处的观点。 列名应该是单数然而。 即使使用复数表名,表示其他表的组合的表也可能是单数forms。 例如,如果您有“ 促销”和“ 物品”表,则表示作为促销活动一部分的物品的表格可以是Promotions_Items,但它也可以合法地成为我认为的Promotion_Items(反映一对多关系)。
  • 始终如一地使用下划线,并用于特定目的。 一般的表名应该用PascalCasing清楚; 你不需要下划线来分隔单词。 保存下划线(a)表示一个关联表或(b)前缀,我将在下一个项目符号中解决。
  • 前缀既不好,也不好。 通常不是最好的。 在你的第一个数据库中,我不会build议使用表的通用主题分组的前缀。 表格最终不能很容易地适合你的类别,而且它实际上可能使查找表格变得更加困难 。 凭借经验,您可以规划和应用比伤害更好的前缀scheme。 我曾经在一个数据表中工作过一次,其中数据表以tbl 开头 ,configuration了ctbl的表,使用vew的视图,proc的spudffn等等。 它一丝不苟,始终如一地运用起来,所以没有问题。 唯一一次你需要前缀是当你有真正独立的解决scheme,由于某种原因驻留在相同的分贝; 为它们加上前缀对分组表格非常有帮助。 对于特殊情况,前缀也可以,例如对于要突出的临时表。
  • 很less(如果有的话),你想要前缀列。

好的,因为我们在意见:

我相信表名应该是复数。 表是实体的集合(表)。 每一行代表一个单一的实体,表格代表集合。 所以我会打个人实体人物表(或人物,无论你的看法如何)。

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

 SELECT person.Name FROM People person 

有点像LINQ的“从人中挑选person.Name”。

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

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

  1. 任何命名标准都比没有标准好。
  2. 没有“一个真实”的标准,我们都有我们的偏好
  3. 如果已经有了标准,就使用它。 不要制定另一个标准或泥泞的现有标准。

我们使用单数名称的表格。 表往往以系统的名称(或其首字母缩略词)作为前缀。 如果系统复杂,您可以更改前缀以逻辑地将表组合在一起(例如,reg_customer,reg_booking和regadmin_limits),这非常有用。

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

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

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

在开发一个新的项目时,我build议你写出所有的首选实体名称,前缀和首字母缩略词,并把这个文档给你的开发者。 然后,当他们决定创build一个新表时,他们可以引用文档而不是“猜测”表和字段应该被调用。

  1. 不应该。表格应该以它代表的实体命名。 人,而不是人如何指代谁是logging中的任何一个人。
  2. 再一次,同样的事情。 FirstName列真的不应该被称为FirstNames。 这一切都取决于你想用列表示什么。
  3. 没有。
  4. 是。 为清楚起见, 如果你需要有“FirstName”这样的列,套pipe会使阅读更容易。

好。 那是我的$ 0.02

我也赞成ISO / IEC 11179风格的命名规范,注意到它们是指导性的而不是规范性的。

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

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

和往常一样,规则也有例外,例如一个总是只有一行的表可能会更好,例如一个configuration表。 一致性是至关重要的:检查你的店铺是否有一个惯例,如果是的话, 如果你不喜欢它,那么做一个商业案例来改变它,而不是单独的游侠。

我们的偏好:

  1. 表名应该是复数?
    决不。 它是一个集合的参数是有道理的,但是你永远不知道表将包含什么(0,1或多个项目)。 多重规则使命名不必要地复杂化。 1房子,2房子,鼠标与老鼠,人与人,我们甚至没有看过其他语言。

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

  2. 列名应该是单数吗?
    通常,是的,除非你正在打破正常化规则。

  3. 我应该前缀表或列吗?
    主要是平台首选项。 我们更喜欢用表名前缀列。 我们不是前缀表,而是前缀视图(v_)和stored_procedures(sp_或f_(函数))。 这有助于那些想要尝试上传v_person.age的人,这个v_person.age实际上是一个视图中的计算字段(无论如何都不能被更新)。

    这也是避免关键字冲突的一个好方法(delivery.fromrest,但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)上的主键,并且如果在debugging查询时看到“customer_customer_type_id”,则立即知道它来自哪里(客户表)。

    或者您在customer_type和customer_category之间有MM关系(只有某些类别可用于某些类别)

    customer_category_customer_type_id

    长边上有一点(!)。

  4. 我应该在命名项目中使用任何情况吗? 是 – 小写:),用下划线。 这些是非常可读和跨平台的。 再加上3以上也是有道理的。

    这些大部分都是偏好。 – 只要你是一致的,任何人都必须阅读它是可以预测的。

看看ISO 11179-5:命名和识别原则你可以在这里得到它: http ://metadata-standards.org/11179/#11179-5

我在这里博客了一段时间: ISO-11179命名约定

我知道这个游戏已经迟到了,这个问题已经得到了很好的回答,但是我想就列名前缀的问题提出我的意见。

所有的列都应该用一个前缀来命名,这个前缀对于它们定义的表是唯一的。

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

当我第一次被提出这个标准的时候,我对此一无所知。 我讨厌这个主意。 我无法忍受所有额外的打字和冗余的想法。 现在我已经有了足够的经验,我永远不会回去。

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

您可以search整个代码库,并可靠地find触及特定列的每行代码。

#1的好处是非常巨大的。 我可以弃用一列,并确切地知道哪些文件需要更新之前,可以安全地从架构中删除列。 我可以改变列的含义,确切地知道哪些代码需要重构。 或者我可以简单地告诉一下,如果某个列的数据甚至被用在系统的特定部分。 我无法计算出这样一个潜在巨大的项目变成一个简单的项目的次数,也没有我们在开发工作中节省的时间。

另一个相对较小的好处是,你只需要使用表别名,当你自我join:

 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)不,表名应该是单数。

虽然它对于简单的select( select * from Orders )似乎是有意义的,但是对于OO等价( Orders x = new Orders )来说,这是没有意义的。

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

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

最后一行,连接的实际逻辑,看起来与复数表名混淆。

我不确定总是使用一个别名(正如马特所build议的那样)会清除它。

2)他们应该是单数,因为他们只拥有一个财产

3)永远不要,如果列名是不明确的(如上面他们都有一个名为[Key]的列),表(或别名)的名称可以很好地区分它们。 您希望查询快速input和简单 – 前缀会增加不必要的复杂性。

4)无论你想要什么,我都会build议CapitalCase

我不认为有任何一套绝对的指导方针。

只要你select的应用程序或数据库是一致的,我不认为它真的很重要。

我一直听到这样的说法:桌子是否多元化,都是个人品味的问题,没有最好的做法。 我不相信这是真的,尤其是作为程序员而不是DBA。 据我所知,除了“因为它是一个对象集合对我来说是合理的”以外,没有任何合法的理由来复制一个表名,而通过具有单一表名的代码有合法的好处。 例如:

  1. 它避免了由多义性引起的错误和错误。 程序员并不完全知道他们的拼写专业知识,并且将一些单词复数化是令人困惑的。 例如,复数单词是以“es”还是“s”结尾? 是人还是人? 当您与大型团队合作项目时,这可能成为一个问题。 例如,一个团队成员使用不正确方法复制他创build的表格的实例。 在我与这个表进行交互的时候,它被全部用于我没有访问的代码或者需要很长时间才能修复的代码。 结果是我必须记住每次使用它时拼写错误。 一些非常相似的事情发生在我身上。 您可以更轻松地让团队的每个成员始终如一地轻松使用正确,正确的表格名称,而无需一直查找表格名称。 单一版本在团队环境中更容易处理。

  2. 如果您使用表名的单数版本,并且将主键作为表名的前缀,那么您现在可以轻松地通过代码从主键(反之亦然)确定表名。 你可以给它一个表名的variables,将“Id”连接到最后,然后你可以通过代码获得表的主键,而不需要额外的查询。 或者,您可以从主键的末尾切断“Id”以通过代码确定表名。 如果使用没有表名称的“id”作为主键,则不能通过代码从主键中确定表名。 另外,大多数使用表名和表名前缀PK列的人使用PK中表名的单数版本(例如status和statusId),这使得根本无法做到这一点。

  3. 如果你使表名单数,你可以让它们匹配它们代表的类名。 再一次,这可以简化代码,并允许你做非常干净的事情,比如通过除了表名以外的任何东西来实例化一个类。 它也只是让你的代码更一致,这导致…

  4. 如果您将表格名称设置为单数,则会使您的命名scheme在每个位置都保持一致,组织和便于维护。 你知道在你的代码的每一个实例中,无论是列名,类名还是表名,它都是相同的名字。 这使您可以进行全局search,以查看到处使用数据的位置。 当你复制一个表名的时候,会出现这样的情况:你将使用表名的单数forms(在主键中它变成了这个类)。 没有一些数据被称为复数的例子是有意义的,有些例子是单数的。

总结一下,如果你复制你的表名,你会失去各种优势,让你的代码变得更加智能和易于处理。 甚至可能会出现这样的情况:您必须具有查找表/数组才能将您的表名称转换为您可以避免的对象或本地代码名称。 奇异的表名虽然起初可能感觉有些奇怪,但是与复数名称相比却有明显的优势,我相信这是最好的做法。

我的想法是:

  1. 表名应该是复数。
  2. 列名应该是单数。
  3. 没有。
  4. 对于表名和列名都可以是CamelCase(我的首选)或underscore_separated。

但是,就像已经提到的那样,任何公约都比没有公约更好。 不pipe你如何select,都要logging下来,以便将来的修改遵循相同的约定。

我认为这些问题的最佳答案将由你和你的团队给出。 有一个命名约定,命名约定是多么的重要。

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

当然,寻求关于标准的一些信息是很好的,这就是你所要求的,但是不要担心或者担心你可能得到的不同答案的数量:select一个对你来说更好的方法。

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

  1. 是。 一张桌子是一组logging老师演员 ,所以…复数。
  2. 是。
  3. 我不使用它们。
  4. 我经常使用的数据库 – 火鸟 – 保持大写,所以没关系。 无论如何,当我在编程时,我会以一种更容易阅读的方式编写名字,比如releaseYear

命名约定允许开发团队将项目的可重用性和可维护性devise为项目的核心。

一个好的命名约定需要一定的时间来发展,但一旦到位,它就可以让团队用一种通用语言向前迈进。 一个好的命名约定会随着项目的发展而有机地增长。 在软件生命周期的最长和最重要的阶段 – 生产中的服务pipe理期间,良好的命名约定容易应对变化。

这是我的答案:

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

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

那么一个好的命名规范和标准的基本原则是什么?

  • 使用您的客户和解决scheme域的语言
  • 是描述性的
  • 始终如一
  • 消除歧义,反思和重构
  • 除非每个人都清楚,否则不要使用缩写
  • 不要使用SQL保留关键字作为列名

这是一个提供了几个select的链接。 我正在寻找一个我可以遵循的简单规范,而不必依赖于部分定义的规范。

http://justinsomnia.org/writings/naming_conventions.html

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

表名应始终是单数,因为它们代表一组对象。 正如你所说牛群指定一群羊,或羊群指定一群鸟。 不需要复数。 当一个表名是两个名字的组合并且命名约定是复数时,很难知道复数名是第一个字还是第二个字还是两者。 这是逻辑 – Object.instance,而不是objects.instance。 或TableName.column,而不是TableNames.column(s)。 Microsoft SQL不区分大小写,如果使用大写字母,则可以更容易地读取表名,以便在由两个或更多名称组成的表名或列名分隔开。

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

表名称:它应该是单数的,因为它是代表真实世界对象的单一实体,而不是单元的对象。

专栏名称:它应该是单数,只有传达它将保持一个primefaces价值,并将确认归一化理论。 然而,如果有n个相同types的属性,那么它们应该被加上1,2,…,n等等。

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

shell:应该是骆驼的情况

我的朋友帕特里克·凯奇Patrick Karcher) ,我请求你不要写任何可能会冒犯别人的东西,正如你所写的:“此外,外键必须在不同的表格中一致地命名,打败不做这个。”。 我从来没有犯过这个错误我的朋友帕特里克,但我一般写。 如果他们一起打算打败你呢? 🙂

晚会非常晚,但我仍然想添加我的两个字节前缀

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

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

2)您可以轻松地search整个代码的列名称

我认为这两个论点都是有缺陷的。 这两个问题的解决scheme,而不使用前缀很容易。 这是我的build议:

总是在SQL中使用表名。 例如,总是使用table.column而不是列。

它显然可以解决2)现在你可以只searchtable.column而不是table_column。

但是我可以听到你尖叫,它是如何解决1)? 这完全是为了避免这一点。 是的,这是,但解决scheme是可怕的缺陷。 为什么? 那么,前缀解决scheme归结为:
为了避免在不明确时指定table.column,可以将所有的列命名为table_column!
但是这意味着从现在开始,每当你指定一个列时,都必须写下列名。 但是,如果你必须这样做,总是明确写table.column有什么好处? 确实,没有任何好处,input的字符数量完全相同。

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

Essential Database Naming Conventions (and Style) (click here for more detailed description)

table names choose short, unambiguous names, using no more than one or two words distinguish tables easily facilitates the naming of unique field names as well as lookup and linking tables give tables singular names, never plural (update: i still agree with the reasons given for this convention, but most people really like plural table names, so i've softened my stance)… follow the link above please

Table names singular. Let's say you were modelling a realtionship between someone and their address. For example, if you are reading a datamodel would you prefer 'each person may live at 0,1 or many address.' or 'each people may live at 0,1 or many addresses.' I think its easier to pluralise address, rather than have to rephrase people as person. Plus collective nouns are quite often dissimlar to the singular version.

 --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 ); 

These are the conventions I was taught, but you should adapt to whatever you developement hose uses.

  1. Plural. It is a collection of entities.
  2. 是。 The attribute is a representation of singular property of an entity.
  3. Yes, prefix table name allows easily trackable naming of all constraints indexes and table aliases.
  4. Pascal Case for table and column names, prefix + ALL caps for indexes and constraints.