,例如PersonID或Person_ID等。因此,不以复数形式命名表更为合理,因为每个记录都是单独的人而不是人。
我经常听到这样的争论:一张桌子是否是复数的,都是个人品味的问题,没有最佳实践。我不相信这是真的,尤其是作为程序员而不是DBA。据我所知,除了"它对我来说是有意义的,因为它是对象的集合",没有合法的理由将表名复数,而通过使用单一的表名在代码中有合法的收益。例如:
它避免了由复数歧义引起的错误和错误。程序员并不完全以他们的拼写专业知识而闻名,而且一些单词的复数形式令人困惑。例如,复数是以"es"结尾还是仅以"s"结尾?是人还是人?当您与大型团队一起处理项目时,这可能会成为一个问题。例如,团队成员使用不正确的方法将他创建的表复数化的实例。当我与这个表交互时,它在我无法访问或需要很长时间才能修复的代码中被广泛使用。结果是我每次使用表格时都要记住拼写错误。类似的事情发生在我身上。您可以让团队中的每个成员更容易地一致、轻松地使用准确、正确的表名,而不会出现错误,或者总是需要查找表名,这就更好了。单一版本在团队环境中更容易处理。
如果使用表名的单一版本并在主键前面加上表名,那么现在就可以轻松地从主键中确定表名,反之亦然,只需通过代码即可。可以为您提供一个包含表名的变量,将"id"连接到末尾,现在您可以通过代码获得表的主键,而无需执行其他查询。或者,您可以从主键的末尾切断"id"来通过代码确定表名。如果您使用的"id"没有主键的表名,则不能通过代码从主键确定表名。此外,大多数将表名复数并在pk列前面加上表名的人在pk中使用表名的单数版本(例如status和statusid),这使得根本无法做到这一点。
如果将表名设为单数,则可以让它们与它们所表示的类名相匹配。再一次,这可以简化代码,并允许您做一些非常简单的事情,比如只使用表名实例化类。它还使代码更加一致,从而导致…
如果将表名设为单数,则可以使命名方案在每个位置都保持一致、有组织且易于维护。您知道,在代码的每个实例中,无论是列名、类名还是表名,它都是相同的准确名称。这允许您进行全局搜索,以查看使用数据的所有位置。当您用复数形式表示一个表名时,在某些情况下,您将使用该表名的单数形式(它在主键中变成的类)。没有某些实例将数据称为复数,而有些实例则称为单数,这是有意义的。
综上所述,如果您将表名复数化,那么在使代码更智能、更易于处理方面,您将失去各种优势。甚至在某些情况下,为了将表名转换为可以避免的对象或本地代码名,必须使用查找表/数组。单表名,虽然一开始可能感觉有点奇怪,但比起复数名有着显著的优势,我认为这是最佳实践。
请看一下ISO 11179-5:命名和标识原则你可以在这里找到它:http://metadata standards.org/11179/11179-5
我在这里写了一段时间:ISO-11179命名约定
- 如果你在这里总结一下,你的答案会更容易理解。不过,棒极了!
我的意见是:
1)否,表名应为单数。
虽然对于简单的选择(select * from Orders)似乎有意义,但对于OO等价物(Orders x = new Orders)则没有意义。
数据库中的一个表实际上是该实体的集合,一旦使用集合逻辑,它就更有意义了:
1 2 3
| select Orders.*
from Orders inner join Products
on Orders.Key = Products.Key |
最后一行,即联接的实际逻辑,看起来与复数表名混淆了。
我不确定是否总是使用别名(如马特建议的那样)来清除这一点。
2)它们应该是单数,因为它们只持有1项财产。
3)如果列名不明确(如上所述,两个列都有一个名为[key]的列),则表的名称(或其别名)可以很好地区分它们。您希望查询能够快速输入,而简单的前缀会增加不必要的复杂性。
4)不管你要什么,我建议你用大写字母。
我认为没有一套绝对的指导方针。
只要您选择的内容在整个应用程序或数据库中是一致的,我认为这并不重要。
- 究竟是什么东西?
- @他可能指的是刚毅(EDOCX1)(5)
- 基思,在数字3上,我两者都做,而且我不一致(但我离题了),但我不明白为什么有一个描述性的列名是不好的,只要它不过分,同一个表,一个变量,等等。
- @约翰尼,这还不错,就这样,只是不需要。为什么要输入你不需要的东西?另外,大多数智能感知主要使用名称的开头,因此如果您有Product.ProductName、Product.ProductID、Product.ProductPrice等类型,键入Product.P会给您所有的前缀字段。
我知道这已经晚了,这个问题已经得到了很好的回答,但我想就列名称的前缀3发表我的意见。
所有列的命名前缀都应该是它们在中定义的表所特有的。
例如,给定表"customer"和"address",让我们分别使用前缀"cust"和"addr"。"客户"将在其中包含"客户ID"、"客户名称"等。地址"将包含"addr_id","addr_cust_id"(fk back to customer),"addr_street"等。
当我第一次看到这个标准时,我坚决反对它;我讨厌这个想法。我无法忍受那种额外的打字和冗余的想法。现在我已经有了足够的经验,我再也不会回去了。
这样做的结果是数据库模式中的所有列都是唯一的。这有一个主要好处,它胜过所有反对它的论据(当然,在我看来):
您可以搜索整个代码库,并可靠地找到每一行与特定列接触的代码。
从1中获得的好处是难以置信的巨大。我可以取消对列的预测,并准确知道在可以从模式中安全地删除列之前需要更新哪些文件。我可以更改列的含义,并确切知道需要重构什么代码。或者,我可以简单地判断一个列中的数据是否被用于系统的特定部分。我无法计算这将一个可能巨大的项目变为简单项目的次数,也无法计算我们在开发工作中节省的时间。
另一个相对次要的好处是,在进行自联接时,只需使用表别名:
1 2 3 4
| 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%'; |
- 那你就不能再这样了。这不是重点吗?
- @瑞文-你仍然可以。如果您所做的只是"选择*",那么查询就与此无关。如果以后使用该查询的结果,则必须使用列名来处理其数据,因此这是代码中需要担心的地方,而不是SQL语句。
- 我想知道在什么情况下需要选择*?我当然不希望任何人在生产代码中使用它。是的,它对于特殊查询和找出使您的多个联接查询结果变得奇怪的数据块很有用,但是我认为在生产代码中不存在需要它的地方。
- @当然,没什么需要的。但是,如果您有一个查询来提取数据,但是有多个地方可以运行该查询来使用其数据,那么维护任务就更容易了。然后,由于不同的"消费者"或多或少需要列,所以您只需要更新消费者,而不需要更新生产者。
- 这正是表有别名的原因。
- 除非您是用非OO语言编写整个应用程序,否则拥有一个合适的ORM层会使这一论点变得多余。
- @亚当-多余的?你一直在用这个词……"即使没有这个词,你的评论仍然没有意义。好的ORM/EF层遵循数据库命名约定,因此可以继续应用哑文本搜索。此外,任何不平凡的应用程序最终都需要绕过ORM/EF/LINQ层。过程编程并不总是能很好地映射到关系中;它是一种不同的思维方式。
- @格朗格对不起,也许我看完这里所有的高谈阔论后脾气变得暴躁了。我在这里为我们的应用程序找到一个数据库命名约定,它有一个使用不一致列前缀的小型遗留数据库。最初我被你的论点说服了,但考虑到我们所做的重构,以及通过应用程序跟踪数据项使用的麻烦,我决定事实上没有,它没有那么有用-SQL只在代码中渗透了大约20%,而我们可能从其他类似的列名中得到的误报不会是真了不起。
- 因此,由于这个答案,我决定在一个大型项目上尝试使用表前缀,并认为我会返回报告。它确实使重构表变得非常简单,这太棒了!然而,这是一个比我预期的更大的痛苦。我们的数据库有许多复杂的命名表。很容易记住cust是客户的前缀,但不容易记住hazardverification方法的前缀。每次我写一个表或字段时,我都要停下来考虑前缀。最后,我认为速度和方便性比搜索性更重要,但我确实觉得这是一次宝贵的经历。
在我看来:
表名应为复数。
列名应为单数。
不。
camelcase(我的首选)或下划线_,分别用于表名和列名。
然而,正如前面提到的,任何约定都比没有约定好。无论您如何选择,都要记录下来,以便将来的修改遵循相同的惯例。
一定要保持表名的唯一性,人而不是人。
彼此彼此
不。我见过一些糟糕的前缀,甚至可以说是用来处理表(tbl_u)或用户存储过程(usp_u)。后面跟着数据库名称…不要这样做!
对。我倾向于把我所有的表名都翻过来
- 天啊。不,表名绝对是复数。这是一个收藏。里面有很多东西。"从"人"中选择"*"。你不是从一个人中选择,而是从多个人中选择!
- 我一直喜欢select语句的复数形式听起来更好。SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'表复数,列单数。再说一次,总是个人意见的问题。
我认为这些问题的最佳答案将由你和你的团队给出。有一个命名约定比命名约定的确切程度更重要。
因为没有正确的答案,你应该花些时间(但不要太多)选择你自己的惯例——这是很重要的一部分——坚持下去。
当然,寻求一些关于标准的信息是很好的,这正是你所要求的,但是不要担心你可能得到的不同答案的数量:选择一个对你来说更好的答案。
以防万一,我的答案是:
对。桌子是一组唱片、老师或演员,所以…复数的
对。
我不用它们。
我经常使用的数据库——Firebird——将所有内容都放在大写字母中,所以没关系。不管怎样,当我在编程时,我用一种更容易阅读的方式来写名字,比如releaseyear。
命名约定允许开发团队在项目的中心设计可发现性和可维护性。
一个好的命名约定需要时间来发展,但是一旦它到位,它就允许团队使用一种通用语言前进。一个好的命名约定随着项目的有机发展而增长。一个好的命名约定可以很容易地处理软件生命周期最长和最重要的阶段——生产中的服务管理中的变更。
以下是我的答案:
是的,当表名涉及一组交易、证券或交易对手时,表名应为复数。
对。
对。SQL表的前缀为tb_u,视图的前缀为vw_u,存储过程的前缀为usp_u,触发器的前缀为tg_u,后跟数据库名称。
列名应为小写,并用下划线分隔。
命名很难,但在每个组织中都有人可以命名事物,在每个软件团队中,都应该有人负责Namings标准,并确保在将命名问题(如sec-id、sec-value和security-id)放入项目之前尽早解决。
那么,好的命名规则和标准的基本原则是什么:
- 使用客户的语言和您的解决方案域
- 是描述性的
- 始终如一
- 消除歧义、反映和重构
- 不要使用缩写,除非他们每个人都清楚
- 不要将SQL保留关键字用作列名
- 表按定义是关系。它们实际上是奇异的。前缀很糟糕。您是否需要将表更改为视图,或者将表更改为视图?用前缀试试看。如果是视图或表,它会有什么区别?
这里有一个链接提供了一些选择。我在寻找一个可以遵循的简单规范,而不是依赖于一个部分定义的规范。
http://justinsmnia.org/writings/naming_conventions.html
1 2 3 4
| SELECT
UserID, FirstName, MiddleInitial, LastName
FROM Users
ORDER BY LastName |
- 注意使用的标准:表包含多个东西,用户有一个名字,T-SQL关键字大写,表定义用pascal大小写。
- 错别字:Lastname应为Lastname。
表名应该始终是单数的,因为它们代表一组对象。正如你所说的"群"指一组羊,或"群"指一组鸟。不需要复数。当一个表名由两个名称组成,并且命名约定是复数形式时,就很难知道复数名称应该是第一个词还是第二个词,或者两者都是。它是逻辑——object.instance,而不是object s.instance。或tablename.column,而不是tablename.column。Microsoft SQL不区分大小写,如果使用大写字母,则在表名或列名由两个或多个名称组成时,更容易读取表名来分隔表名或列名。
表名:应该是单数,因为它是表示真实世界对象的单数实体,而不是表示singlular对象的单数实体。
列名:它应该是单数,然后它表示它将保留一个原子值,并符合标准化理论。但是,如果有n个相同类型的属性,那么它们应该加上1、2、…、n等后缀。
前缀表/列:这是一个巨大的主题,稍后将讨论。
外壳:应该是骆驼壳
我的朋友Patrick Karcher,我请求你不要写任何可能冒犯某人的东西,就像你写的,"?此外,必须在不同的表中一致地命名外键。殴打不这样做的人应该是合法的。我从来没有犯过这样的错误,我的朋友帕特里克,但我一般都在写作。如果他们一起计划为此打败你呢?:)
- 所以你是说表是实体?或者表中的行是实体?对我来说,表是行的集合——因此是表示复数的实体的集合。
参加聚会很晚,但我还是想加上我的两美分关于列前缀的内容。
对于使用表列(或表列)命名标准的列,似乎有两个主要参数,这两个参数都是基于列名本身在整个数据库中是唯一的:
1)查询中不必一直指定表名和/或列别名。
2)您可以轻松地搜索整个代码中的列名
我认为这两个论点都有缺陷。解决这两个问题不使用前缀很容易。我的建议是:
总是在SQL中使用表名。例如,总是使用table.column而不是column。
显然,它解决了2)的问题,因为您现在只需搜索table.column而不是table_column。
但我能听到你的尖叫声,它是如何解决1?就是为了避免这种情况。是的,的确如此,但解决方案存在严重缺陷。为什么?那么,前缀解决方案可以归结为:为避免在有歧义时指定table.column,请将所有列命名为table_column!但这意味着从现在开始,每次指定列时都必须编写列名称。但是,如果必须这样做,那么总是显式地编写table.column有什么好处呢?准确地说,没有好处,输入的字符数完全相同。
编辑:是的,我知道用前缀命名列会强制使用正确的用法,而我的方法依赖于程序员
- 正如您所提到的,您不能依赖每个案例都有table.column。程序员将在一个地方忘记,然后您的全局查找和替换就破坏了您的整个程序。或者你将它作为一个规则,有人会认为他正在通过使用表的别名来实现这个规则,从而再次挫败了一个全局发现。此外,如果您希望通过拥有某种类型的数据库类来组织代码(任何优秀的程序员都会这样做),有时您只需要将列名传递给DB函数,或者只在变量中使用列名。
- @我完全支持你的回答。我还想补充一点,使用文本搜索来查找依赖项是野蛮的代码导航方式。一旦人们摆脱了野蛮人的搜索习惯,他们将开始使用好的命名,即table.column。所以问题不在于命名风格,而在于为野蛮人制造的坏工具。
- 你的论点有缺陷。它的问题在于它可以双向工作,而且不增加任何优势。你说,要解决这个问题,只需编写table.column,因为你已经在编写table_column了。你也可以说只写table_列,因为你已经在写table.column了。换句话说,您的答案之间没有区别,除了它会引入可能的错误,并且不会强制执行约定。这就是我们有"private"关键字的原因。我们可以相信程序员总是正确地使用类变量,但是关键字强制使用它并消除可能的错误。
基本数据库命名约定(和样式)(单击此处可获得更详细的描述)
表名使用不超过一个或两个词的简短、明确的名称容易区分表格便于对唯一字段名以及查找和链接表进行命名给桌子起单数的名字,而不是复数(更新:我仍然同意这个惯例给出的理由,但是大多数人确实喜欢复数的名字,所以我软化了我的立场)。请按上面的链接操作
- 尽管甲骨文的建议与上面的链接链接完全相反。找到Oracle在这里说的话..ss64.com/ora/syntax-naming.html
- 这个答案在3年前就已经给出了…
- 甲骨文的命名约定是其中最有趣的。EDOCX1,0!!
表名单数。假设你在模拟某人和他们的地址之间的关系。例如,如果您正在读取数据模型,您是否希望'每个人可以住在0,1或多个地址。'"每个人可能住在0、1或多个地址。"我认为用复数形式表达地址更容易,而不必把人改成人。加上集体名词常常与单数形式不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| --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
); |
这些是我被教导的惯例,但是你应该适应开发软管所使用的任何东西。
复数的它是实体的集合。
对。属性是实体的奇异属性的表示。
是的,前缀表名允许轻松跟踪所有约束索引和表别名的命名。
pascal大小写表示表名和列名,前缀+所有索引和约束的大写。
- 克里斯蒂安娜…这是一个奇怪的惯例。
- 你桌上的序列号?有人真的认为这对开发人员有意义吗?
- 既然这个例子提出了…我个人反对在表名或列名中使用大写首字母缩写,因为我认为这样读起来更难。所以在这种情况下,我会说studentid比studentid更好。当缩略词出现在结尾时没什么大不了的,但是我在工作中看到过无数的例子,缩略词出现在名字的前面或中间,这使得在你的脑海中解析起来更加困难。示例:studentabcsn与studentabcsn。