学术界认为,表名应该是存储其属性的实体的唯一性。
我不喜欢任何需要在名称周围加方括号的T-SQL,但我已将Users表重命名为单数形式,永久性地判决那些使用该表的人有时必须使用方括号。
我的直觉是,保持单数形式更为正确,但我的直觉是括号表示不受欢迎的内容,如带有空格的列名等。
我该留下还是该走?
- 先前数据库表命名的dup,复数或单数,但这一个得到了更多的关注。
- 英语不是我的母语,有人能给我举个例子,名字是Singular和Plural?
- codeproject.com/articles/309304/…
- 我很惊讶有更多的人没有说:这取决于单行代表什么。在一个数据库中,我可能有一个表,其中的行表示单个小部件,而另一个与该表的一对多关系表示行表示多个小部件。不这样做会失去表达能力。
- @Andygavin好吧,我在一个单数和复数混合的系统中工作(也许像你建议的那样,我可能会检查一下,但我怀疑这只是太多的厨师),过了一段时间你才弄好(intellisense对我来说总是太慢…)
- 解决关键字难题的一种方法是添加一个简短的前缀,例如"t"用于表(tuser▼显示),"v"用于视图等,但不推荐用于属性(不需要"agroup"或类似的!)
- 必须是复数!listnames==>string list of names,usercollection of users,collection of users,usertable of users,applebag of redapples…有铃声吗?类名将是'user'、'apple'等。
- 这两者都是:例如,我有一个名为用户的表,这是可以的,然后我有一个名为用户事务而不是用户事务的表。然后考虑你有这个表:用户类别,它只保存类别,然后你有一个名为用户类别的链接表,因为用户可以在更多类别中…我希望这能给你个主意
- 我只想在所有这些讨论中加上一点,请注意,表格的形状或形式决不能与类相同。表是特定类型的元素集合,可以对单个属性进行排序、查询等。类是描述特定类型的属性和行为的框架。在OO编码术语中,表的Closes表示是对象的集合(不管您使用的是什么ORM)。这是迄今为止谷歌在这个问题上排名最高的答案,所以尽管这个问题已经结束,但这个页面仍然有价值。
- 我赞成你所从事的生态系统的共同实践。例如:在node.js中,bookself.js或object.js等表单主要基于"knex.js"。在"knex.js"文档中,您可以找到复数形式的表名。所以在这个领域我会用复数。来源:knexjs.org/schema createtable
- 重新打开。这个问题关系到编程的效率和可靠性。尽管意见确实很多,但投票结果最高的答案充满了事实、参考资料和专门知识。
- 我们所有的表都是单数的(每一行都是独立的),但是我们的形式在我们的应用程序中对其进行了复数化(当您查询时,您通常对集合感兴趣)
- 插入客户(姓名)值("Alice")。不:插入带有值的客户(名称)("alice")。从客户中选择name="alice"。不:选择一个名为"Alice"的客户。从id=1的客户中删除。不:删除id=1的客户。update customers set email="[email protected]"其中name="alice"。否:使用name="alice"set email="[email protected]"更新客户。
- 是的,我同意。拥有一个用户表并将其称为"appuser"是有意义的,同时拥有一个适用于特定类型用户的规则表并将其称为"user rules"也是有意义的。
- @Arindam"userrule"或"usersrule"绝对不能作为与用户相关的规则列表的名称。现在这是一个强有力的论点,反对总是使用单数形式!
我也有同样的问题,在阅读了所有答案后,我肯定会留下单一的理由:
原因1(概念)。你可以把装苹果的袋子想象成"苹果袋",不管是装0个,1个还是100万个苹果,都是同一个袋子。表只是容器,表名必须描述它包含什么,而不是它包含多少数据。此外,复数概念更多的是关于一种口语(实际上是为了确定是否有一种或多种)。
原因2。(方便)。单名比复数更容易说出。对象可以有不规则的复数形式,也可以没有复数形式,但总是有一个单数形式(很少有例外,比如新闻)。
原因3。(审美和秩序)。特别是在主细节场景中,它读得更好,按名称排列得更好,逻辑顺序也更合理(先主,后详细):
相比:
原因4(简单)。把所有这些放在一起,表名,主键,关系,实体类…最好只知道一个名字(单数),而不是两个(单数类,复数表,单数字段,单数复数主细节…)
- Customer
- Customer.CustomerID
- CustomerAddress
- public Class Customer {...}
- SELECT FROM Customer WHERE CustomerID = 100
一旦你知道你要处理的是"客户",你就可以确定你将使用同一个词来满足你所有的数据库交互需求。
原因5。(全球化)。世界越来越小,你可能有一个不同国籍的团队,不是每个人都有英语作为母语。对于非母语英语程序员来说,想到"存储库"要比想到"存储库"或"状态"而不是"状态"更容易。使用单一的名称可以减少因打字错误而导致的错误,不必考虑"它是孩子还是孩子?"从而提高生产力。
原因6。(为什么不呢?)它甚至可以节省你的写作时间,节省你的磁盘空间,甚至使你的电脑键盘使用时间更长!
- SELECT Customer.CustomerName FROM Customer WHERE Customer.CustomerID = 100
- SELECT Customers.CustomerName FROM Customers WHERE Customers.CustomerID = 100
您已经保存了3个字母、3个字节、3个额外的键盘点击次数:)
最后,你可以把那些乱七八糟的保留名称命名为:
- 用户>登录用户,应用用户,系统用户,CMSUSER,…
或者使用不知名的方括号[用户]
- 我敢打赌,如果你在袜子抽屉上贴上标签,你会称之为"袜子"。
- Definetelly。很难得到一个适用于所有人和所有人的标准,重要的是这对你有效。这对我很有用,我在这里解释了原因,但我还是觉得这对我很方便。
- 我喜欢这个答案,它提供了许多选择作为使用单数的优势。我相信也有缺点,像袜子的例子,但我认为这是一个相当整洁的方法。
- 原因6,直到您尝试返回多个用户:p从customers.customerRole='admin'的客户中选择customers.customerRole
- 更大的问题是,为什么在命名袜子抽屉时要遵循数据库命名约定?
- @凯尔,因为内斯特的苹果袋/容器类比(原因1)。当你给一个移动的盒子贴标签时,你会写"书",而不是"书"。
- 这个答案需要更多的赞扬。它讨论了一系列实际的原因,我适用于为什么我喜欢单数名称。关于集合中适当语言的交替讨论只是哲学上的,并掩盖了真正的观点。奇异效果更好。
- 原因4很可爱,但是如果你必须在代码的其他地方使用复数形式,那么它就没有什么作用。假设有一个模型函数来检索非活动用户的列表,很自然地命名为getInactiveUsers。因此,简单性变为:(1)在SQL中,一切都是单一的。(2)代码中的单数类。(3)对于其余部分,单数或复数取决于其是集合还是单个实例。我的简单就是(3)。
- +1原因5(全球化)。我以前遇到过这个问题,当然它可以帮助外国程序员为对象和表使用统一的命名约定。
- 我家里有个"袜子"抽屉,不是"袜子"抽屉。如果它是一个数据库,我会称之为"sock"表。
- @Chris实体不是"label"或"collection"。它"应"定义"instance of"…
- @Sayap,你有一点,但是,如果你通常在一个团队中工作,并且项目有几个层,那么只有那些在编码上工作的需要处理复数形式,而其他的像数据库设计者和用户界面这样的人可以更容易地处理单数形式。
- @内斯特,在阅读了你的评论之后,原因4现在是有意义的。我真的被卖了:)
- 太糟糕了,我不能两次投反对票。一个原因是1,另一个原因是4。
- 原因2-6在您同意冗长语言和OOP的概念是为了使编程人性化,以便能够立即理解概念后,就相当没有意义了。
- 至于原因1,当你谈论一个对象时,你可以用这个集合的名字加上后缀来证明一个单一的名字:"这是我的袜子抽屉"。然而,当你提到你所有的抽屉时,你会说"这些是我的袜子,这些是我的裤子"等。这是因为谈论收藏类型的上下文已经建立起来了。这张桌子是干什么的?我的用户。这是什么桌子?我的用户表。你会给它贴上什么标签?用户。"
- @jlembke:这是一个放袜子的抽屉。你不会在袜子抽屉上贴上"袜子"的标签。哪个类比更准确?
- @微型科技:这些都是很好的观点。对我来说,这正是内斯特和杰森所说的,我只是觉得它更好用。但要继续无用的争论,请注意:)"袜子"、"裤子"和"手套"无论如何都是复数。也许"衬衫"更好。我每天都在家里听到"把这些衬衫(特别是)放在你的衬衫(抽象)抽屉里",在工作中我听到"把这些顾客坚持在顾客桌上",但最后没关系。由于这个答案中列出的原因,单数对我来说效果更好。如果我看到一个包含复数的数据库,没什么大不了的,但我知道会有一些不便。
- @Jlembke:多好的例子"袜子通常是复数的"(因为是成对的),而且谢谢"把这些衬衫放在衬衫抽屉里",因为我不是英语母语的人,我不知道这一点。由于你的例子,现在我相信"袜子抽屉"不再是反对单一概念的有力论据。
- 您有用户记录,而不是用户记录。因此,您有一个用户表,而不是用户表。
- @Minitech:没错,你不会把你的袜子抽屉命名为"袜子",但你可以把它命名为"袜子抽屉"。同样,你也可以把用户表命名为"用户表"。只要"表"在它后面,名称就可以是单数。我是这样看的:想象一下"table"这个词应该出现在所有表名的末尾,但是按照惯例,"table"这个词会被去掉,只剩下单数。就像一个惯例。当你看到一个表名时,你看到的是"用户",但你解释的是"用户表"。这对像我这样的强迫症患者来说是可行的。
- @friendlydev:我把它读成了"用户的表格"。ERR_SUBJECTIVE
- @微型科技:我同意它的阅读方式是主观的。我提出了不同的观点:原因1-6主要是客观的,表明使用单数表名对于开发目的更有效。然而,对于某些人来说,表的单数名称有时看起来和感觉很尴尬(这就是主观经验的来源)。这是唯一的缺点,我可以看到使用单数名称。我所分享的观点有助于我克服心理上对使用单一名字的保留。我相信这个观点会帮助其他人对使用单数感到更舒服。
- @Friendlydev:原因3是列表中唯一客观的原因。2和5是相同的原因。原因6是愚蠢的。但是……好吧。
- @Minitech:原因1的措辞不太好,但它是客观的。单数词总是用来给集合或集合加标签。它从来不是"袜子套装"或"小饰品收藏",而是"袜子套装"或"小饰品收藏"。我同意你可以通过说"袜子套装"或"小饰品收藏"来指代这个套装或收藏,但是你这样指代它们时,实际上并没有提到套装或收藏的实际名称。在"用户集合"与"用户集合"中,"用户"是集合的名称,"用户"是集合描述的一部分。
- @我完全不同意。我叫瑞安,你不叫我"瑞安人"。"sock table"不是隐式的。(不同意?)这就是为什么它是主观的。)
- @Minitech:2和5是密切相关的,可以归为一类,是的,但这并不意味着它们是不客观的。也可以证明,4有助于简化,这使得4个目标。6是弱的,但也是客观的。这些都是客观的。最后,你是Ryan,但你不是,永远也不会是一套或一个收藏品,所以Ryan的例子是不合理的。如果有一个叫Ryan的人的集合,它可以被称为"Ryan集合",而不是"Ryans集合"。"Ryans集合"指的是它,但不是它的名字。
- 虽然我喜欢这个答案,但我的眼睛还是被网址stackoverflow.com/questions/...吸引住了。我会把"问题"放在"问题"表中,URL会反映出表名,不会有任何混淆。
- 我将把参数/数据从表命名约定中去掉。不要为每种抽屉都创建新的桌子。一定要加上一列标签,说明存放在我们抽屉里的物品的类型。
- 参考你的苹果包例子,我同意。但是,如果我正在创建一个有不同种类苹果的表,我可以创建一个名为Apple的表(ID、颜色、大小、原产国等),但是如果我正在创建一个表,在其中保存所有在我的国家种植的水果,那么我可以将它命名为水果[ID、名称]?
- @如果多个苹果放在Apple桌上,那么多个水果放在Fruit桌上,就太差了。你也可以用复数来命名它们。唯一被保证不可接受的事情就是把一个名字单独命名,另一个用复数命名。
- 在读了所有的评论之后,我觉得我必须说……袜子…+10分,为一个非常好的答案!
- 原因7。如果表映射了一个对象,那么表名和类名将匹配,这有助于避免在名称不匹配中添加额外阻抗的代价。
- 通常,一次从抽屉里取出一双袜子,而不仅仅是一只袜子。领带架、衬衫抽签、鞋柜似乎都支持这一独特的原因。
- 拥有一张新闻桌和拥有一张爱情桌或一张气象桌一样有意义。它们都是en.wikipedia.org/wiki/mass_名词没有新闻、爱情或天气之类的东西。你今天想要多少天气?
- 我最近遇到了另一个坚持使用单数的好理由。我有一张包含了一系列设置的表——每个设置都是一个组织的设置集合——我想知道我应该使用单数还是复数。这就是它击中我的原因,因为显然我必须将表命名为"OrganizationSettings"。如果我用复数的话,我就无法区分。在这种情况下,复数是指每个组织的一系列设置。您仍然可以在每行中创建一个包含不同设置的表。我希望我能理解我的观点。
- 虽然我同意单数更好的结论,但第一个原因的例子似乎不合逻辑。你说的是一袋苹果应该被称为applebag;根据这种推理,这个表应该被称为usertable(就像你描述的容器——一袋苹果或者一张用户表)。或者相反,如果你认为一张用户表应该被称为用户,那么你应该称你的苹果包为苹果。
- 从你的第一点开始,我就得打电话给你"苹果包"的评论。为什么?因为通过添加后缀"bag",您可以将其更改为引用某个容器。出于同样的原因,如果您说appletable等同于applecollection,那么我没有问题。但是如果没有描述性部分(这里是"table"或"collection"),您将通过它可能包含或不包含的内容来调用某个内容,而不是它本身。换句话说,你可以说"苹果包里装着苹果",但你不会说"苹果里装着苹果",但你可以说"苹果包里装着零个或更多的苹果物体"。
- @Jlembke,你说得对。你可以称之为"袜子抽屉",但你自己承认,你不会在SQL中这样做,因为如果你是,你会把它命名为"可袜子",而不是。你称之为"袜子"。正如我上面所说,"袜子抽屉里有袜子物品"。你不会说"袜子抽屉里有袜子对象",也不会说"袜子里有袜子对象"。你把名字和描述混淆了。你的"袜子抽屉"(描述)有标签(名称)"袜子",而不是"袜子"。
- 如果一张表不是供人阅读的,请将其命名为asdjfhasgkdjagksjdg。
- 如何命名数据库本身?例如,我希望有一个单元测试将使用的沙盒数据库,我正在尝试在单元测试和单元测试之间做出决定。
- 单一命名约定的主要原因是:表是ER模型语言/关系代数中实体的直接数据库表达式。表"apple"表示实体apple并包含apple的"实例"。在OOP中,类名是单数的:"apple"。您将拥有许多"苹果"—类型为"苹果"的实例(对象)。
- 关于袜子和袜子:如果我有这样一个抽屉,我可能会称之为袜子刷,因为这就是它。它不是"袜子"或"袜子",而是"抽屉"。我会给容器命名,不仅是它的用途。为什么不为表命名:用户表或用户tbl?这使得单复数讨论在这个范围内不相关,只要它一直被使用。在代码中使用这样的表名约定会使它100%不合理,尽管有额外的后缀。
- 理由1:假设你带着苹果包在城里走来走去,有人问你带了什么。你会回答,"我的苹果包"或"苹果",但不会说"苹果",除非你是个疯子。理由2:复数词并不难。根据你的逻辑,你可能会完全停止使用复数。我想人们可能会觉得这更令人困惑。原因3:顺序是有效的,尽管我不经常按字典顺序排列我的表。原因4:"客户。客户ID。"真的吗?原因5:只是原因2的重复。理由六:好吧,我被卖了。复数是。
- 我不喜欢你的AppleBag类比。它建议您必须为客户命名一个表CustomerTable,而不是Customer。
- @名为applebag的nestor表令人困惑?是装苹果的还是装苹果袋的。根据您的说法,名为"客户"的表是客户的容器。applebag是一种存储在bags表中的类型。
- 你知道我今天是怎么来的吗?盯着一个满是笨拙的复数表名的数据库。它只是让我的眼睛抽搐,我不知道为什么。当我查看一个ERD(或模式图)时,我将每个表看作一个单独的记录,所以在我看来,这就是它注册的方式。一个意见的问题,但我同意这个答案中提出的观点。
- @Tobia.Zanarella,正如我在上面对另一张海报所说的,您认为类名是错误的,因为类代表一个实例。它并不代表一个集合。相反,表表示由行表示的事物集合。行是类的同义词,而不是表。你不会说"袜子里有袜子",但你可以说"袜子(名字)或袜子桌(描述)里有袜子对象。"
- @pacoverflow,您的注释正是表应该是复数的原因。客户清楚地表明它保存着客户对象的集合。如果它只是"客户",那么你怎么知道它没有为特定客户保存属性?单数不明确。另外,它也不遵循正确的语法。"从name="joe"明确说明您选择的客户中选择*。但是"select*from customer where name="joe"是指选择客户的某一部分,该部分的名称是joe,还是选择具有该名称的整个客户?
- 你从来没有提到可理解性。这应该是在方便之前或者必须少打字。一张桌子就是一张东西的清单。如果我看到一个叫苹果的东西,我会把它理解为一个苹果。如果我看到苹果这个名字,我会理解任何数量的苹果。我认为使用单数会混淆试图理解代码含义的人。因此,它是语义上的不足,应该使用复数。
- 我把我的袜子抽屉叫做"鲍勃"。叫它"bobs"会很奇怪…此外,我不会称一个表为"新闻",这似乎都是含糊不清的,所以我会避免使用这个名称,也就是"新闻文章",它更能描述它的"实际内容"。
- @克赖斯沃德,你不是在给抽屉起名,你只是在给袜子起名。我的意思是,标签不是"袜子"抽屉,而是放在袜子抽屉里的"袜子"。
- 这听起来非常像是某个人的意见,他的工作的最大部分就是使用数据库本身。我在完整的堆栈位置工作,我更喜欢简单的集体名称或复数,因为它在整个应用程序中都工作得很好。您总是有一个用户列表(表)和一个用户(行)。在SQL级别选择好的名称几乎可以保证即使在多个开发人员之间,这些名称也将被执行到整个应用程序中。当您开始尝试教开发人员在SQL级别对复数进行不同的思考时,事情会变得混乱。
- 如果您需要为自己的sock draw添加标签,那么就比表命名有更大的问题;)
- 我认为这取决于你在做什么,决定是用复数形式还是单数形式的名词作为表名。然而,fruit已经是复数了,你可以说你有一对socks而不是一对sock。袜子是单数,Sock Pairs是复数。我相信,就是这样。哈哈。我确实喜欢两边的外卖,而且肯定能看到使用单数形式的优点。伟大的回答!
如果您使用对象关系映射工具,或者将来会使用,我建议使用单数。
有些工具(如llblgen)可以自动将用户等复数名称更正为用户,而无需更改表名本身。为什么这很重要?因为当它被映射时,您希望它看起来像user.name而不是user s.name,或者更糟的是,我的一些旧数据库表命名为tblusers.strname,这在代码中很混乱。
我的新经验法则是判断它被转换成物体后的样子。
我发现一个不适合我使用的新命名的表是usersinroles。但总会有一些例外,即使在这种情况下,它看起来像usersinroles.username。
- 我投了反对票,我会告诉你原因,因为我不同意。ORM的本质就是地图。我使用过的每一个ORM工具都支持指定一个实体与实体名称不同时要使用的表名。这一点很重要,因为我们映射到关系数据库的全部原因是,我们可以轻松地使用与对象模型不同的形状进行即席查询和报告。否则,我们现在都只使用对象/文档数据库。
- ORM不应该指定它们映射到的对象的名称。ORM的要点是对对象的抽象,赋予了这种灵活性。
- 这在工具中占主导地位,还是仅仅是您使用过的工具?
- 在我的世界里,我试图在整个项目中使用一致的名称,以避免浪费时间去想这个实例的结尾是否有一个s。ORM可以重命名并独立并不意味着这样做可以帮助其他开发人员。
- 一些ORM(像许多编程工具一样)具有默认行为,可以在没有配置的情况下生成实现…以生产力为卖点。因此,如果不使用显式映射创建Employee类,则默认情况下将生成Employee表。
- @巴里克。复数名称在ORM代码中不只是看起来很愚蠢。在SQL中复数也很糟糕,尤其是在引用唯一属性时。谁从未写过从用户中选择user.id?或者…从用户离开thingy.user_id=user.id…加入?
- @萨缪尔达尼尔森-我不明白你的意思。使用您提供的SQL示例,我可以使用表别名,例如"从用户U中选择U.ID"。这张桌子是一个物品的集合,因此它应该是复数形式——就像在一篮子苹果里一样,而不是一篮子苹果。
就"标准"而言,其他人给出了相当好的答案,但我只是想补充一下……"用户"(或"用户")是否可能不是表中所含数据的完整描述?并不是说你应该对表名和特定性过于疯狂,而是像"widget-users"(其中"widget"是应用程序或网站的名称)这样的东西更合适。
- 我同意。OrgUsers,AppUsers,任何避免使用关键字的内容。
- - 1。表用户(以及国家、语言)可以同时用于少数应用程序。
- 这就是我为什么说,"有可能……?"和"也许"
- 关联模式名是否会消除所有的混乱?APPNAME1.用户,APPNAME2.用户?
- 这是一种可能性,但有很多原因可以解释为什么有人不想这样使用模式。此外,即使使用模式,您仍然会遇到关键字问题。
- 我不同意表前缀——这可能是一个模式?--但我同意"更具描述性的名字"。即使是像"appuser"这样简单的东西也足够了,而不需要进入整个名称空间的争论。
- 前缀表名与使用单数和复数有什么关系?现在问题变成了我使用widget用户还是widget用户。这与问题无关。
- 这个被接受的答案更像是一个旁注,而不是回答问题。
- 该表应该是客户端不可知的,如中所述,它不应该关心它是不是被称为widget,或者它是如何使用的,名称可能会改变。表的唯一职责是以结构化和显式的形式保留用户数据。
我更喜欢使用未经修饰的名词,在英语中,它恰好是单数。
改变表名的数目会导致正交问题(如许多其他答案所示),但选择这样做是因为表通常包含多个行,在语义上也充满了漏洞。如果我们考虑一种根据大小写改变名词的语言,这一点就更明显了(大多数情况都是这样):
既然我们通常是在处理行,为什么不把这个名字放在指控的案例中呢?如果我们有一张写得比读得多的表,为什么不把这个名字放在dative中呢?这是一张桌子,为什么不使用属灵?我们不会这样做,因为表被定义为一个抽象容器,不管其状态或用法如何,都存在。词义上没有精确和绝对的原因而改变名词的词形是胡言乱语。
使用未经修饰的名词是简单的、逻辑的、规则的和语言无关的。
- 可能是我所见过的关于这个问题最合乎逻辑的论证,让我很高兴我把时间花在了拉丁语上。肯定1。
- 嗯,我显然需要加强我的词汇量。
- +我明白了,这些是互联网需要更多的答案。用丰富的词汇来执行完美的逻辑是无可挑剔的。
- 下次我用拉丁语编程时会注意到这一点。同时,用户将进入用户表,客户将进入客户表。
- 深信不疑——毫无察觉。有趣的是,在这之后,"单数"和"复数"的流行选择都是错误的!
- 迟到了,但我很好奇,如果你在(其他)编程中对变量名应用相同的规则,当它们包含一种类型的多个项(如数组、列表、集合等)时。是FrequentCustomerArray而不是FrequentCustomers?如果不是,那为什么不一样?
- 还有一个迟交的答复。在代码中,您需要识别复数和单数的差异,因为变量中的项目数量很重要。在类名中,它是不同的:如果你的类是客户机,你就不会给它命名为Clients。
什么约定要求表具有单数名称?我一直认为它是复数。
用户将添加到用户表中。
本网站同意:http://vyaskn.tripod.com/object_naming.htm表格
此网站不同意(但我不同意):http://justinsmnia.org/writings/naming_conventions.html
正如其他人提到的:这些只是指导方针。选择一个适合你和你的公司/项目的惯例并坚持下去。在单数和复数之间转换,或者有时缩写单词,有时不更严重。
- 当把集合论应用到表中时,集合中的任何一个实例都代表集合,所以苹果是一个苹果集合,它不知道集合中有多少个苹果——它是一个有许多实例的苹果。当一袋苹果含有许多苹果时,它不会变成一袋。
- 关系由标题和正文组成。标题是一组属性。主体(n元关系的)是一组n元组。关系的标题也是它的每个元组的标题。[en.wikipedia.org/wiki/relational_模型]
- 如果你有一个袋子里面有5个苹果怎么办?你叫它苹果袋吗?还是一袋苹果?
- 我认为理论上应该是这一套叫苹果。一个单独的苹果仍然是"一组苹果"——尽管,一组只有一个实例。多个苹果也是"一套苹果"。
- 如何在代码中定义Apple对象数组?Apple apples[100]或Apple apple[100]。
- @克里斯托弗,如果袋子里的葡萄干只装苹果,那么它就是一个"苹果袋",不管里面是1个苹果,100个苹果还是没有苹果。
- @伊恩:那是因为一张桌子是普通的,可以和一个船运集装箱相比(几乎可以装任何东西,从苹果板条箱到哈雷戴维森摩托车的板条箱)。你说:一个装橘子的货柜,不是橘子的货柜。你说:货柜里装的是汽车零件,不是汽车零件货柜。如果您创建了一个只保存特定类型数据(如苹果名称)的自定义数据结构,并将其命名为"kungabogo",那么您可以拥有一个apple kungaboko。我知道你在想什么,但先想到一个圆球囊,然后明白意思的不同。
- @Christopher,一个特定的数据库表被设计为只保存一种类型的东西,永远保存,并且即使是空的,也要与这种类型相关联,因此运输容器是一个不恰当的比喻。它们也是抽象的概念,所以不太可能有人将它们与阴囊混淆。
- @伊恩:好吧,我同意你的看法。已实现的表不能保存任何内容,除非它们是要保存的内容。当然,它们可以容纳许多不同种类的东西。红衬衫、蓝衬衫、软衬衫、短衬衫等带有亮片的衬衫。他们都掉到衬衫桌上了。销售中的衬衫、订购中的衬衫、有缺陷的衬衫、正在设计的衬衫、包装中的衬衫、穿的衬衫、销毁的衬衫、非洲的衬衫、巴基斯坦的衬衫、船上的衬衫、盒子中的衬衫、架子上的衬衫、地板上的衬衫。所有衬衫。在衬衫桌上。有道理。不是。
- 这些都是很搞笑的例子——我倾向于同意@ian,尽管@christopher——我知道这是一辆苹果车。它卖的是史密斯奶奶,乔纳森,甚至是金苹果。毕竟,它是一个用户表,而不是一个用户表…
- -1未提及任何标准(或权威作者)。
- 我父亲是Wayback的一位老数据库管理员,他有时引用使用单词"record"的表,这可能是将实例名称应用于集合的一种方法。换句话说,他会说,"widgetuser记录"。从他和一个很好的数据库架构师那里,我知道,我本能地发现,真正的人就是这么做的。
- "applebag"最适用于单数形式,因为它包含容器类型,但我不喜欢为我创建的每个数据库表添加"-table"后缀。同样地,给一个苹果包贴上一个单字"苹果"也没有意义。
- 要点是:表是对象的集合。所以,我很明显表名应该是复数形式。也就是说,表用户是称为用户的对象/实体的集合。
- 在用户表中添加了一个用户。"就像在Java中说,一个属于用户类的变量用户。或者说"ints i"比"int i"更好,因为我只是另一个int变量(或者,在javascript中,"vars i"比"var i"更好,因为它只是另一个变量)。使用这种方法,数据库应该称为表
- 我认为将表与Java类进行比较是不公平的。类的工作原理与DB表(特定元素的集合)不同。我相信比较表和数组会更好。
- @plap用户不是类,它是该类或列表的集合。将用户添加到用户列表。
- 复数是一种方式。唯一反对它的论据不成立,在选择关系。从users.name="somename"所在的用户中选择"*"。这实际上应该写成select*from users user where user.name="somename"。或者在实体框架中考虑它。其中(user=>user.name=="somename")。表是集合实体,表不是关系。关系是实体的一个特征,仅此而已。表名应为复数
举个简单的例子吧:
1
| SELECT Customer.Name, Customer.Address FROM Customer WHERE Customer.Name >"def" |
VS
1
| SELECT Customers.Name, Customers.Address FROM Customers WHERE Customers.Name >"def" |
后者中的SQL听起来比前者更奇怪。
我投票赞成单数。
- 在那个例子中,是的,但是在实际的SQL中,它永远不会以这种方式编写。你有一个表别名,所以它更像是SELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def'
- +(一年后)你引用了一个很好的例子来说明单数的意义。这是一场宗教辩论。几年前,我被一位数据架构师调到单数,比我大很多年,我觉得这对我来说是正确的(在我需要非常有说服力的转换之后)。
- 我认为sql的复数形式听起来更好。每列都没有表名,为什么您这么喜欢键入?选择name,address from customers,其中name>"def"是从名大于def的客户池中选择的。
- 使用别名/AS来解决这个问题怎么样?选择customer.name,customer.address from customers作为customer,其中customer.name>"def"
- 第二个听起来好多了,单数听起来像是一个不会说英语的人。
我坚信,在一个实体关系图中,实体应该用一个单数名称来反映,类似于类名是单数。一旦实例化,该名称将反映其实例。因此,对于数据库,当实体构成一个表(实体或记录的集合)时,它是复数。实体,用户被制成表用户。我同意其他人的意见,他们建议可以将名称用户改进为员工或更适用于您的方案。
这在SQL语句中更有意义,因为您从一组记录中进行选择,如果表名是单数的,那么它的可读性就不好。
- 我特别喜欢SQL语句注释。在这里使用单数对读者来说并不直观。
- 关于ERD的很好的观点。我怀疑这就是为什么,对于通过DBA观察世界的人来说,单一的命名是有意义的。我怀疑,正如你指出的,他们没有得到实体和集合之间的区别。
- 表不是记录的集合;表是记录外观的定义。这就是所有复数/单数民族似乎都存在的脱节。
- 我不同意SQL语句注释。如果你想加入反对用户的行列呢?id
我坚持使用单数形式表示表名和任何编程实体。
原因何在?事实上,在英语中有不规则复数,比如鼠标?老鼠和绵羊?绵羊。然后,如果我需要收藏,我就用鼠标或羊皮,然后继续。
这真的有助于多元性的突出,我可以很容易和程序化地确定收集的东西是什么样子的。
所以,我的规则是:一切都是奇异的,所有的事物集合都是奇异的,并附加了s。对ORM也有帮助。
- 以"s"结尾的词怎么样?如果您有一个名为"news"的表(例如),那么您将如何称之为新闻集合?纽斯?或者你会称这张桌子为"新的"?
- 我会给桌子上的新闻项目和收藏新闻项目打电话。
- 如果必须对所有代码进行拼写检查,否则将无法编译;)?
- @哈米什:你真的用orderby、sbyte、const、sizeof等常见条目拼写检查代码吗?再次提醒我?
- ORM不应该指定它们映射到的对象的名称。ORM的要点是对对象的抽象,赋予了这种灵活性。
- fishs在这条规则下不太管用。在ORM中用复数形式表示集合的名称并不难,因为您可以查看要映射到单数表名的对象类型。然后,属性可以被命名为任何你想要的,你可以让你的IDE自动完成处理其余的。
- @Hamishgrubijan然后停止使用Word编写代码!;)
- 除了你所说的,还有另一种例子:类别和类别。Laravel的雄辩ORM采用模型名称的小写复数形式。我想知道为什么他们不把单数作为默认选项。
- 你自相矛盾。您说过"每一个集合都是单数的,并附加了一个s",但是您声明表名应该是单数的。根据您自己的承认,表名应该是复数(或者正如您指出的,伪复数),因为表是以单数形式收集的数据。(也就是说,容纳汽车的桌子是汽车对象的集合,因此它应该称为"汽车")如果您喜欢car.doors语法的单数形式,请使用别名。(即,从cars中选择car.wheellcount作为car.id=44的car)
- @马尔奎夫:当我说"一个集合"是复数时,我指的是对象域的集合,而不是数据域的集合。例如,列表、数组和IEnumerable都是集合(复数)。数据表将是单数。希望这是有帮助的。
- 归根结底,如果您将表命名为不同的对象(即可推车),或者将表命名为它包含的对象(汽车)。在逻辑上,我和那些称之为"汽车"的人有一个错误,那就是桌子不是汽车!它是一个Cartable,它是它的类型,相当于一个数据类型。一个car collection(也可以是单数),一旦你给"数据类型"一个名称(即变量名),你通常会描述它的用途,在这种情况下,容器/集合/任何car对象,因此数据类型应该是car table,但是表名应该是car s。
- @马奎夫:好吧,照SOF所说,答案主要是基于意见的。所以我很高兴你有你的。
- 啊…旧的"同意不同意"立场!哈哈,够公平的了。我承认这一点。
- 这个答案很有道理。把Mouse类映射到Mice表的感觉真是太棒了。
单数的。我不赞成任何最合乎逻辑的论点——每个人都认为自己的偏好是最合乎逻辑的。不管你做什么,都是一团糟,只需选择一个惯例并坚持下去。我们试图将语法和语义高度不规则的语言(正常的口头和书面语言)映射为具有非常具体语义的高度规则(SQL)语法。
我的主要论点是,我不把表看作集合,而是把表看作关系。
因此,AppUser关系告诉哪些实体是AppUsers实体。
AppUserGroup关系告诉我哪些实体是AppUserGroups实体。
AppUser_AppUserGroup关系告诉我AppUsers和AppUserGroups是如何联系的。
AppUserGroup_AppUserGroup关系告诉我AppUserGroups和AppUserGroups是如何联系的(即群体成员)。
换言之,当我想到实体以及它们是如何相关的时,我想到的关系是单数的,但是当我想到集合或集合中的实体时,集合或集合是复数的。
在我的代码中,然后在数据库模式中,我使用单数。在文本描述中,我最终使用复数来提高可读性,然后使用字体等来区分表/关系名称和复数。
我喜欢把它看成是杂乱的,但有系统的——这样,我想表达的关系总是有一个系统生成的名字,这对我来说非常重要。
- 确切地。很多人不知道的主要事情是他们在命名什么…您为关系命名(表中的单个记录),而不是表中的一组记录。
- 不能再不同意了。"从名称如"j%"的用户中选择"*",因为我选择的是名称以"j"开头的所有用户。如果你的论点是想写"…where user.name like…",那么只需使用别名。我说"从所有的袜子里给我一双"。
- 如果我是那样的人,我的表名就是袜子对。
我也会使用复数,在前面提到的用户困境中,我们确实采用了方括号方法。
我们这样做是为了在数据库体系结构和应用程序体系结构之间提供一致性,因为底层理解用户表是用户值的集合,而代码工件中的用户集合是用户对象的集合。
让我们的数据团队和开发人员使用相同的概念语言(尽管对象名称并不总是相同的),可以更容易地在他们之间传达想法。
- 我同意。为什么代码和存储之间不一致?我不会在代码中命名用户对象集合"user"…那我为什么要叫那张桌子呢?这毫无意义。当我读到上面关于它的论点时,他们关注的是实体,而不是表…表中的内容与我心目中的表本身是有区别的。
- 如何处理像companies这样的表名,其中其他表有一个名为company_id的引用字段?虽然它的拼写正确,但对于那些挑剔表命名约定的人来说,它似乎不一致。
- 记住companies的单数形式是company,并且这个ID是对单数形式的引用。它在代码方面不应该比它在英语方面更困扰我们。
imho,表名应该像客户一样是复数。
如果类名映射到customers表中的一行,则类名应该像customer一样是单数。
我个人更喜欢用复数来代表一个集合,它只是"听起来"对我的关系头脑更好。
此时此刻,我正使用单一的名字为我的公司定义一个数据模型,因为工作中的大多数人都觉得这样更舒服。有时候,你只需要让每个人的生活更轻松,而不是强加你的个人偏好。(这就是我在这个线程中结束的方式,以确认命名表的"最佳实践"是什么)
在阅读了这篇文章中所有的争论之后,我得出了一个结论:
我喜欢我的蜂蜜煎饼,不管大家最喜欢什么口味。但如果我为别人做饭,我会尽力为他们提供他们喜欢的食物。
- 在关系模型世界中使用这种约定是不明智的,特别是当您描述对象之间的关系时,例如,"每个团队可能只有一个主教练和多个次教练",这被描述为:团队->主教练,团队->次教练。
单数的。我将调用一个包含一组用户行表示对象的数组"users",但该表是"用户表"。把表看作是它所包含的行的集合是错误的,IMO;表是元数据,行的集合是分层附加到表上的,而不是表本身。
当然,我一直在使用ORM,用复数表名编写的ORM代码看起来很愚蠢。
- 我猜是给每个人的。关系数据库表根据定义是一个标题(即命名属性的元数据)和一组与标题匹配的元组。您可以关注元数据,而其他人则关注元组。-)
- 嘿,用户表是我喜欢的名字!:)
- ORM不应该指定它们映射到的对象的名称。ORM的要点是对对象的抽象,赋予了这种灵活性。
- 我这样看……如果你用代码创建了一个数组/列表/字典,我打赌你可以用它所拥有的复数名称命名它。如果您使用ORM抽象数据库,那么表是用某种集合表示的,那么为什么您要对它们进行不同的处理呢?使用单一的名称听起来可能不错,但您总是在与您的直觉作斗争,即表中包含许多相同的东西,就像代码中的集合一样。为什么不一致?
- @杰森:请比较一下这些东西的读法:1)$db->user->row(27)、$db->product->rows->where(something)2)$db->users->row(27)、$db->products->rows->where(something)。
- 在sqlAlchemy中,不管如何命名表,示例都是User.query.get(27)或User.query.filter(User.id == 27).one()和Product.query.filter(something).all()。正如@barrypicker所说,您使用的ORM不够灵活。
- @ Burikror语法不应该规定编程约定(你知道Java bean是什么吗?).只要没有进入,就应该遵循。在ORM中使用不同映射的可能性在需要时是存在的。语法是非常不规则的,像"矩阵"和"矩阵"之类的东西很少,但很好地说明了为什么代码不应该被它所感染。
我不喜欢复数表名,因为英语中的一些名词不可数(水、汤、现金),或者当你使其可数时,其含义会发生变化(鸡对鸡;肉对鸟)。我也不喜欢使用表名或列名的缩写,因为这样做会给已经陡峭的学习曲线增加额外的坡度。
具有讽刺意味的是,我可能会将User作为一个例外,并因为用户(transac-sql)而将其称为Users,因为如果不需要的话,我也不喜欢在表周围使用方括号。
我也喜欢将所有的ID列命名为Id,而不是ChickenId或ChickensId(复数的人对此做了什么?).
所有这些都是因为我对数据库系统没有适当的尊重,我只是在从OO命名约定中重新应用一个技巧,比如Java的习惯和懒惰。我希望对复杂的SQL有更好的IDE支持。
- 我们的复数人要么像你一样命名"id"列"id",要么是"单数"。我认为表应该是复数的(把它们想象成数组),但是列名应该是单数的(单个元素的属性)。
- plu ral/表名的复数形式,主键的单数形式。
实际上,我一直认为使用复数表名是一种流行的惯例。到目前为止,我一直用复数。
我能理解单数表名的论点,但对我来说复数更有意义。表名通常描述表包含的内容。在规范化数据库中,每个表都包含特定的数据集。每行都是一个实体,表中包含许多实体。因此,表名的复数形式。
一张汽车表上会有汽车的名字,每排都是一辆汽车。我承认,以table.field的方式指定表和字段是最佳实践,使用单数表名更易于阅读。然而,在以下两个例子中,前者更有意义:
1 2
| SELECT * FROM cars WHERE color='blue'
SELECT * FROM car WHERE color='blue' |
老实说,我将重新考虑我在这件事上的立场,我将依赖于我正在为之开发的组织所使用的实际惯例。但是,我认为根据我的个人习惯,我会坚持使用复数的表名。对我来说,这更有意义。
- 这不是罗尔的惯例吗?表的复数名和ORM类的单数?对我来说很有意义。表之所以被称为"cars",是因为它有许多"car"实例,而类之所以被称为"car",是因为它将保存一个car实例!!
- @对句子后半部分稍加修改——"car"类是表示现实汽车的抽象数据类型。它是保存一个实例还是多个实例取决于它的使用方式。
- 让我们面对现实吧,表car是对一辆汽车结构的定义。如果你看表的结构,它基本上会吐出"id int,color string等",而且:假设你有一个表car_vendor(或者对于你的复数版本,它将是cars_vendor)和外键cars_id?!那该死的是什么?这是江户一四,没必要让我想。我非常喜欢单数
- 我真的很喜欢这个答案!让我解释一下。如果集合是car,而您需要car的所有内容,即blue,则结果应该类似于tire, mirror, engine。然后它变得越来越令人困惑,因为所有的结果都是来自car的parts。所以表名应该是carparts(或者car_parts,carparts随便你喜欢什么)
- 任何强制使用单一表名的数据库设计师基本上都在向未来可能接触到该数据库的RubyonRails应用程序开发人员宣战。Rail对类的单数词和表的复数名称的严格坚持,使得Ruby生态系统中的许多gem都具有强大的行为能力。所以即使你觉得单数听起来更好,为了兼容性,你也应该坚持复数。我认为这对许多其他对象关系映射器也是适用的。
我们运行类似的标准,当编写脚本时,我们要求在名称周围使用[],并且在适当的情况下使用模式限定符——主要是它对冲您对SQL语法将来获取的名称的赌注。
1
| SELECT [Name] FROM [dbo].[Customer] WHERE [Location] = 'WA' |
这在过去拯救了我们的灵魂——我们的一些数据库系统已经从SQL 6.0到SQL 2005运行了10多年——远远超过了它们的预期寿命。
- 像是仪式性的自我鞭打。有没有发生过这样的抢名夺利事件?
服务器本身的系统tables/views(SYSCAT.TABLES、dbo.sysindexes、ALL_TABLES、information_schema.columns等)几乎总是复数。我想为了保持一致,我会听从他们的领导。
- 微软之所以如此,首先是出于商业原因(而且常常是出于不道德的原因),其次是逻辑原因。我跟踪他们的唯一原因是他们是大猩猩,其他人都是这样。当我有选择的时候,我会选择另一种方式。
- 应注意,information_schema是SQL标准ISO/IEC 9075-11的一部分。是的,它使用了复数的表/视图名称。
我是一个单一表名的爱好者,因为它们使我的ER图表使用case语法更容易阅读,但通过阅读这些响应,我感觉它从来没有被很好地抓住?我个人很喜欢。这里有一个很好的概述,举例说明当您使用单数表名、在关系中添加动作动词以及为每个关系形成好的句子时,模型的可读性如何。对于一个20表的数据库来说,这有点过分了,但是如果您有一个包含数百个表的数据库,并且设计复杂,那么如果没有一个可读性好的图表,您的开发人员将如何理解它呢?
网址:http://www.aisintl.com/case/method.html
至于前缀表和视图,我绝对讨厌这种做法。在给一个人可能不好的信息之前,完全不给他任何信息。任何浏览数据库中的对象的人都可以很容易地从视图中分辨出一个表,但是如果我有一个名为tblusers的表,出于某种原因,我决定在将来将它重组为两个表,通过一个视图将它们统一起来以避免破坏旧代码,我现在有一个名为tblusers的视图。此时,我只剩下两个没有吸引力的选项,一个名为tbl前缀的视图可能会使一些开发人员感到困惑,或者强制另一个层(中间层或应用程序)重写以引用我的新结构或名称viewusers。这否定了视图imho的大部分价值。
- 很好的例子就是在对象名称前面加上"type"限定符!
表:复数形式
Multiple users are listed in the users table.
模型:单数
A singular user can be selected from the users table.
控制器:复数
http://myapp.com/users would list multiple users.
不管怎样,这是我的看法。
- 更接近我的观点,但我的观点是,表中存储的多个用户实际上是偶然的,任何单个用户都由表表示,或者更确切地说,是一组表示用户实体的元组的关系。
我的观点是语义上的,这取决于您如何定义容器。例如,一个"苹果袋"或者简单的"苹果",或者一个"苹果袋"或者"苹果"。
例子:"大学"表可以包含0个或多个大学"学院"表可以包含0个或多个学院
1 2
| a"student" TABLE can contain 0 OR more students
a TABLE OF"students" can contain 0 OR more students. |
我的结论是,要么是好的,但你必须定义你(或与之交互的人)在引用表时将如何处理;"x表"或"x表"
这可能有点多余,但我建议谨慎行事。不一定重命名表是件坏事,但是标准化就是这样;一个标准——这个数据库可能已经"标准化",但是很糟糕:)——我建议一致性是一个更好的目标,因为这个数据库已经存在,而且可能包含两个以上的表。
除非您能够标准化整个数据库,或者至少计划朝着这个目标努力,否则我怀疑表名只是冰山一角,专注于手头的任务,忍受命名不好的对象的痛苦,可能对您最有利。--
实践的一致性有时是最好的标准…:)
My2美分
如果我们查看MS SQL Server's系统表,微软指定的名称在plural中。
Oracle的系统表在singular中命名。尽管其中一些是复数。Oracle建议用户定义的表名使用复数。这没有多大意义,他们推荐一件事和遵循另一件事。这两个软件巨头的架构师使用不同的约定来命名他们的表,这也没有什么意义…毕竟,这些家伙是什么…博士学位?
我记得在学术界,这个建议是独一无二的。
例如,当我们说:
1
| SELECT OrderHeader.ID FROM OrderHeader WHERE OrderHeader.Reference = 'ABC123' |
也许每个ID的B/C都是从一个特定的单行中选择的…?
- 微软之所以如此,首先是出于商业原因(而且常常是出于不道德的原因),其次是逻辑原因。我跟踪他们的唯一原因是他们是大猩猩,其他人都是这样。当我有选择的时候,我会选择另一种方式。
- 两件事。第一,您通常不会使用表名,并且会写"select id from orderheaders where reference='abc123',因为您是"selecting all ids from orderheaders where something is true",但是如果由于联接或其他原因而必须使用表名,那么您将使用这样的别名…"从orderHeaders中选择orderHeader.id作为orderHeader,其中orderHeader.reference='abc123'
可能的替代方案:
- 重命名表SystemUser
- 使用括号
- 保留复数表名。
在技术上,使用支架是最安全的方法,尽管有点麻烦。在我看来,这是六分之一,六分之一,而你的解决方案实际上就是个人/团队的偏好。
- 我喜欢你的"前缀"想法,但会称之为系统用户。
- 我想投票赞成先前的评论。:)
- 相应地编辑。谢谢!
我认为使用单数是我们在大学里所学的。但与此同时,您可能会认为,与面向对象编程不同,表不是其记录的实例。
我想我现在倾向于使用单数,因为英语中存在复数形式的不规则。在德语中,由于没有一致的复数形式,情况更糟——有时,如果没有前面的指定词(der/die/das),就无法分辨一个词是复数还是非复数。在汉语中,也没有复数形式。
我总是用单数,因为我是这么学的。然而,在最近创建一个新模式的同时,在很长一段时间内,我第一次主动地决定维护这个约定,仅仅是因为…它短一些。在每个表名的末尾添加"s"对我来说就像在每个表名前面添加"tbl_uuu"一样无用。
正如其他人在这里提到的,约定应该是一个增加易用性和可读性的工具。不是一个束缚或者折磨开发者的俱乐部。
也就是说,我个人的偏好是对表和列使用单数名称。这可能来自我的编程背景。类名通常是单数的,除非它们是某种集合。在我的头脑中,我在存储或阅读问题表中的个别记录,所以单数对我来说是有意义的。
这个实践还允许我为那些存储对象之间多对多关系的表保留复数名称。
我尽量避免在表名和列名中使用保留字。在这里讨论的情况下,为了避免需要封装使用用户保留字的表,对用户来说违背单一约定更为合理。
我喜欢以有限的方式使用前缀(表名为tbl,过程名为sp_u等),尽管许多人认为这会增加混乱。我更喜欢驼背式的名字而不是下划线,因为我在输入名字时总是按+而不是u。其他许多人不同意。
下面是命名约定指南的另一个好链接:http://www.xaprb.com/blog/2008/10/26/the-power-of-a-good-sql-naming-convention/
请记住,在您的约定中,最重要的因素是它对与相关数据库交互的人有意义。当涉及到命名约定时,没有"一个环来规则它们"。
- 忽略匈牙利符号的恐怖。永远不要,永远不要在存储过程之前使用sp_u,因为MS-SQL将其用于系统存储过程,并对其进行特殊处理。由于sp_u存储在主表中,因此即使您限定了位置,MS-SQL也总是先查找该位置。
我曾经用"dude"来表示用户表——同样的短字符数,与关键字没有冲突,仍然是对一般人的引用。如果我不关心那些可能看到代码的闷头,我会保持这种状态。
我只对拼写相同的表名使用名词,不管是单数还是复数:
驼鹿鱼鹿飞机你裤子短裤眼镜剪刀种后代
我一直认为那是个愚蠢的约定。我使用复数表名。
(我认为该策略背后的理性是,ORM代码生成器更容易生成对象和集合类,因为从单一名称生成复数名称比从单一名称生成复数名称更容易,反之亦然)
- 这种约定早在ORM出现之前就已经成为关系理论的一部分。
- ORM不应该指定它们映射到的对象的名称。ORM的要点是对对象的抽象,赋予了这种灵活性。
指导方针就是这样。这不是"一石二鸟",这就是为什么你可以选择忽略它们。
我想说,用复数形式的表名更符合逻辑。表毕竟是实体的集合。除了提到的其他替代方法之外,我还经常看到表名上的前缀…
我不是建议这样做,我也看到表名中使用了很多我讨厌的空格。我甚至遇到过有白痴性格的外号,比如?好像说这个领域回答了一个问题。
- 同意。空格和前缀来自魔鬼。
- MSAccess鼓励使用带有空格的表名。我怀疑空间中的许多mssql表是从那里导入的。
- 再加1。以空格命名的表和字段是WhizzKidOfficeJunior的标志,它为帐户中的贝丽尔创建了一个真正的Kool访问应用程序。
- 嘿,我喜欢帐户中的贝丽尔…但它不会让我在我的表名中加前缀或空格…也不会让我在域名中加上问号或感叹号。我不管她有多可爱。P
- 作为前缀的tbl是devispawn和臭腐尸的儿子,但是语义前缀要好一点。在我们的主应用程序中,我们使用chase软件,在所有表前面加上"ca"或"cs",即chase应用程序或chase系统。
- (续)"CA"表是业务表,在日常使用中经常发生变化,如cadocument,即发票、采购订单、成本表等。"CS"表更多用于导航等,如csform,我们用于在表单(页面)之间导航,通常只由我们更改。
- 我花了好几个小时试图从一个有一个前导空格前缀的表中进行选择。我以为我疯了。
我只想说明我为什么用单数。
例如,我需要从用户那里获取所有字段:
1 2
| -- Select every fields from 'user' table
SELECT * FROM USER |
我需要21岁用户的姓名:
1 2
| -- Select every fields from 'user' table which have 21 years old
SELECT * FROM USER WHERE age = '21' |
当然,复数的方式也可以用同样的方式,但对于我的大脑来说,我真的认为这是正确的方式。
- 我不同意;在Oracle数据库中有一个名为user的系统表,现在您必须决定将其称为"app_user"或类似的名称。但是,不管怎样,最好是说"从用户中选择所有",我只是将所有表命名为我的实体的复数形式,以免与任何系统表冲突。
- 我喜欢从users或userTable中选择,但不喜欢user。用单数听起来你只得到了一张唱片。我看到您喜欢从表中选择列。最喜欢认为select从表中返回行,因此集合名称听起来很合乎逻辑。
- 我给你2美分,你的数据库表是由1行还是多行组成?就像是说:我手里拿着五个苹果。然而,我们都同意正确的说法:我手里拿着五个苹果。为什么我们要为数据库更改这个问题?一旦将"usertable"指定为名称,我们就有一个表,它实际上已经定义了多个数据行的存在。但是我也不会坚持。我宁愿说用复数。因为age='21'最有可能返回超过1行,不是吗?
- 标准是单数。
- 看看像Rail的ActiveRecord这样的应用程序语言。它严格要求表名为复数,对象实体为单数的分隔。这么多神奇的东西来自于遵循这个惯例,而你却因为不遵循这个惯例而伤害了你的应用团队的系统。
- 除了在活动记录中必须处理非标准复数化的痛苦…我一直使用复数表名,但是复数化不会造成麻烦——在ORM和JSON标准中都是如此——单数表名永远不会这样做。
- +Kelsey Hannan公平地说,尽管有些人喜欢单数惯例,但某些框架(如Rails)使用复数作为惯例……因此有时选择单数与复数是项目特有的……
- '从'user'表中选择21岁的每个字段'->从21岁的每个用户(多个)中选择每个字段。所以复数更合乎逻辑。
实际上,表的SQL定义是表的一个潜在行的定义,而不是集合。因此,该定义中使用的名称必须指定行的类型,而不是集合的名称。喜欢复数的人,因为他们的英语语句读起来很好,所以他们需要开始更加逻辑化地思考,看看实际使用表所涉及的所有逻辑和编程代码。这些注释中提到了使用单数表名的几个非常好的原因。其中包括不使用复数表名的非常好的理由。""读得好"不应该是任何原因,特别是因为有些人可能读得不一样。
- 不,表的SQL定义是该表中所有行的定义,而不是您所说的一个潜在行。举个例子,用你的定义,如果我说这个周末一个潜在约会的描述是一个红头发的人,那并不意味着我也不能和一个黑发女人约会。然而,如果说这个周末所有可能的约会都是红头发的,那就排除了这一点,这正是一张桌子所做的。它限制所有行与该描述匹配,或者换句话说,它是对所有行的描述——单词"rows"是复数,因此表也应该是复数。
- 扩展这个概念,定义中的每一列也应该是复数。
- 我知道您是如何到达那里的,但我认为这是因为您将列看作一个容器,而不是容器。换句话说,列只是用于存储行属性的元数据。列数据本身不存在于行之外,因为行存储在其中。在查询列时,您正在查询该列数据的行。您没有自动查询列。该行是实体。表是这些实体的集合。列只是该实体的属性。
- 我在开玩笑。表可能包含行的集合,但表定义不是集合的定义,而是表行的定义,因此必须是单数。如果您开始将表定义转换为处理它的程序的类定义,那么所有这些都将非常清楚。
我总是使用单数表名,但正如前面所述,最重要的是保持一致,并对所有名称使用相同的格式。
关于复数表名,我不喜欢的是组合名称会变得很奇怪。例如,如果您有一个名为Users的表,并且您希望为用户存储属性,这将导致一个名为UsersProperties的表……
- 不,它实际上称为"用户属性",因为它们是存储在表中的用户对象(行)的属性,而不是用户表本身的属性。说"usersproperties"意味着它们是用户表的属性(如rowcount、maxrows等),而userproperties则明确表示与用户相关的属性(如用户名、年龄、ssn等)。
如果你去的话会有麻烦,但如果你留下来的话会有双倍的麻烦。
我更愿意反对一些所谓的非复数命名约定,而不是用一些可能是保留字的词来命名我的表。
我没有在之前的回答中清楚地看到这一点。许多程序员在处理表时没有考虑到正式的定义。我们经常以"记录"或"行"的形式进行直观的交流。但是,除了非规范化关系的一些例外,通常设计表,使非键属性与键之间的关系构成一个集合理论函数。
函数可以定义为两个集合之间的叉积的子集,其中键集的每个元素在映射中最多出现一次。因此,从这个角度产生的术语往往是单一的。在涉及函数(例如代数和lambda微积分)的其他数学和计算理论中,我们可以看到相同的单数(或至少非复数)约定。
没有要求表名为单数的"约定"。
例如,我们在评级流程使用的数据库上有一个名为"拒绝"的表,其中包含从程序一次运行中拒绝的记录,我看不到不使用该表的复数形式的任何原因(将其命名为"拒绝"只会很有趣,或者过于乐观)。
BR/>关于另一个问题(引号),它取决于SQL方言。Oracle不需要在表名周围加引号。
- 对于保留关键字的名称,SQL Server只需要大括号("用户"是一个)。我相信甲骨文也有同样的政策
如果您使用Zend框架(PHP)这样的特定框架,那么对于表类使用复数,对于行类使用单数是明智的。
所以假设您创建了一个表对象$users=new users(),并且已经将row类声明为user,那么您也可以调用new user()。
现在,如果对表名使用单数形式,则必须执行诸如new usertable()之类的操作,其中该行是new userrow()。对于我来说,这看起来比只为表设置一个object users()和为行设置user()对象更笨拙。
- 这不是真的。Zend_DB不会对数据库表名、表类名或行类名施加命名约定。我自己删除了那个构思不周的拐点代码。
- 但是我支持表类名为复数,行类名为单数的约定。只是Zend_DB框架没有强制执行任何约定。
- 只是重新浏览了我的帖子并更正了它。它确实没有强加任何东西。只是暗示而已。
- 没有用于表的类。映射到表的任何类实际上都描述行,而不是表。表与类的唯一对应关系是显式描述集合的对应关系。
在寻找好的命名约定的同时,我应该命名以下混乱:
1)根据桌子的位置一张用户表。它总是复数。所以,用户
2)根据记录的内容用户表中的记录将是单个用户。所以,用户。
现在,主要是用户角色的问题。案例1:根据第一个命名约定,用户角色这个名字的含义,用户及其角色。
案例2:根据第二个命名约定,用户角色这个名字意味着什么,用户和他的角色。
好的命名约定是为实体关系提供一个额外的概念,特别是在存储多对多关系时。
在这里,根据场景,我们应该将其标识为一组信息。
在用户表中,形成的所有集合都是唯一用户。在"角色"表中,形成的所有集合都是唯一的角色。在用户和角色关系表中,可以使用不同的角色形成一组用户,这使得存储了1个多个关系。
1 2 3 4
| I would prefer,
Users TABLE => USER
Roles TABLE => ROLE
users ROLE relationship TABLE => user_roles |
表名是表结构的一个定义。视图或查询名称是(一个或多个)表的视图或查询的一个定义。表、视图或查询可以包含以下内容之一:
0记录1记录许多记录。
你到底为什么要在一个物体名称的末尾加上"s"?将"s"放在对象名称的末尾,表示什么?
如果要区分,请添加"_-tbl"。一种观点是"素食"(不是愚蠢的"素食"惯例)。
至少3个字符的后缀-使讨论停止。
表是一个数据库对象-与其他对象没有区别。
保存3个字符只会节省意义的清晰度。
红色;-)
- 添加"table"比添加"tbl"难多少?
- 为了更清楚地说明,表定义实际上是一个潜在行的定义。
- 根据你自己的定义,你给了两个不同的东西相同的名字…将放置在表中的对象,以及保存这些对象的表。如果我说car,我指的是表还是表中的记录?如果我说的是汽车,很明显我指的是能容纳零个或更多汽车物体的东西。正确地使用复数将一个项目与持有它们的事物区分开来。如果你说的是"推车",那就太奇怪了。但是如果没有后缀"table",就必须给它一个表示它所持有内容的名称。"袜子抽屉"(单数)上有标签(名称)"袜子"。
两个网站都有不同的论文,我认为你只需要选择你的立场。我个人更喜欢plurar用于表命名,当然也喜欢单数用于列命名。
我喜欢你怎么读这个:
1
| SELECT CustomerName FROM Customers WHERE CustomerID = 100; |
实际上,我们有OOP,而且很好,但是大多数人都在使用关系数据库,没有对象数据库。没有必要遵循关系数据库的OOP概念。
另一个例子是,您有一个表团队,它保留teamid、teamcolor和playerid,并且在一定数量的playerid中具有相同的teamid和teamcolor…
球员属于哪个队?
1
| SELECT * FROM Teams WHERE PlayerID = X |
所有来自X队的球员?
1
| SELECT * FROM Players INNER JOIN Teams ON Players.PlayerID = Teams.PlayerID WHERE Teams.TeamID = X |
你觉得这一切都好吗?
无论如何,还可以看看W3学校使用的命名约定:
http://www.w3schools.com/sql/sql_join_inner.asp
我通过将表命名为"Employee"(实际上是"Employees")来解决相同的问题。我尽量避免与可能保留的词语发生冲突。即使是"用户"对我来说也非常接近。
- 面临的挑战是,在编写应用程序时,您只知道保留字——随着语言的增强,这个词库将随着时间的推移而漂移。把一个词用方括号括起来是减轻这种痛苦的唯一方法。
- 以牺牲可读性为代价,这在SQL语句中是很有问题的。
- 完全同意-关键字,camelcase等名称的上限有助于改善这一点,但仍然会降低可读性。
- 员工不一定总是用户。
- 不,所以对于那些情况来说是不合适的。但在其他情况下,可能还有另一个词(比如"成员"、"人",或者类似的词)可以让你避开"用户",而不太可能与某个事物发生冲突。