表命名困境:奇异与多个名称

Pro*_*ofK 1404 sql sql-server naming-conventions

学术界认为表名应该是他们存储属性的实体的单数.

我不喜欢任何需要在名称周围使用方括号的T-SQL,但我已经将Users表重命名为单数,永远判断那些使用表的人有时必须使用括号.

我的直觉是,保持单数是更正确的,但我的直觉也是括号表示不受欢迎的人,如列名,其中有空格等.

我应该走还是留?

Nes*_*tor 1718

我有同样的问题,在阅读完这里的所有答案后,我肯定会留在SINGULAR,原因:

原因1(概念).你可以想到包含苹果的包如"AppleBag",如果包含0,1或者100万个苹果没关系,它总是相同的包.表只是容器,表名必须描述它包含的内容,而不是它包含的数据量.另外,复数概念更多地是关于口语(实际上确定是否存在一个或多个).

原因2.(方便).与复数名称相比,更容易出现奇异名称.对象可以具有不规则的复数或者根本不具有复数,但是总是具有单数(除了新闻之外的少数例外).

  • 顾客
  • 订购
  • 用户
  • 状态
  • 新闻

原因3.(审美和秩序).特别是在主 - 详细信息场景中,这更好地读取,更好地按名称对齐,并且具有更多逻辑顺序(Master first,Detail second):

  • 1.Order
  • 2.OrderDetail

相比:

  • 1.OrderDetails
  • 2.Orders

原因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个额外的键盘点击:)

最后,您可以将那些与保留名称混淆的名称命名为:

  • 用户> LoginUser,AppUser,SystemUser,CMSUser,...

或使用臭名昭着的方括号[用户]

  • 我敢打赌,如果你在袜子抽屉上放一个标签,你就称之为"袜子". (591认同)
  • 更大的问题Chris,为什么在命名袜子抽屉时会遵循数据库命名约定? (420认同)
  • 我家里有一个"袜子"抽屉,而不是"袜子"抽屉.如果它是一个数据库,我称之为"Sock"表. (282认同)
  • 这个答案需要更多的赞扬.它讨论了我应用于为什么我更喜欢单数名称的一些实际原因.关于集合中适当语言的替代讨论只是哲学上的,并且模糊了真正的观点.Singular的效果更好. (75认同)
  • Definetelly.很难得到一个适合所有人和每个人的标准,重要的是适合你.这对我有用,在这里我已经解释了为什么,但同样,这对我来说,我发现它非常方便. (67认同)
  • @minitech:没错,你不会把你的袜子抽屉命名为"袜子".但你可以把它命名为"袜子抽屉".以同样的方式,您可以将用户表命名为"User_Table".只要单词"Table"出现在它之后,名称就可以是单数.所以这就是我看待它的方式:想象一下"Table"这个词应出现在所有表名的末尾,但作为一种惯例,单词"Table"会被删除,只留下单数词.就像一个惯例.当您查看表名时,您会看到"用户",但您将其解释为"用户表".这适用于像我这样的强迫症患者. (20认同)
  • @Kyle因为Nestor的Apple Bag/Container类比(原因1).当你标记一个移动的盒子时,你会写"书"而不是"书". (17认同)
  • 您有用户记录,而不是用户记录.因此,您有一个User表,而不是Users表. (10认同)
  • @minitech:这些都是好点.对我来说,这正是Nestor和Jason所说的,我认为它效果更好.但要继续无用的争吵:) - "袜子","裤子"和"手套"无论如何通常都是复数.也许"衬衫"更好.我听到"每天在我的房子里把这些衬衫(特别是)放在你的衬衫(抽象)抽屉里",在工作中我听到"坚持把这些顾客留在顾客桌子里"但最后这没关系.由于本答案中列出的原因,Singular对我来说效果更好.如果我看到一个有复数的数据库,没什么大不了的,但我知道会有一些不便之处. (7认同)
  • 至于原因1,你可以在谈论一个对象时使用后缀的集合名称来证明一个单数名称:"这是我的SockDrawer".然而,当你提到所有的抽屉时,你会说"这些是我的袜子,这些是我的裤子"等等.这是因为谈论集合类型的背景已经建立."这个表是什么?我的用户.这是什么表?我的用户表.你会给它标记什么?用户." (6认同)
  • @Chris实体不是'标签'或'集合'.它应该"定义"'实例'...... (4认同)
  • 如果一个表不打算被人读取,请将其命名为"asdjfhasgkdjagksjdg". (4认同)
  • 这听起来非常像一个人的意见,他的工作的最大部分是与数据库本身一起工作.我在完整的堆栈位置工作,我更喜欢集体名称或复数,因为它在整个应用程序中运行良好.你总是有一个用户列表(表)和一个用户(行).在SQL级别选择好名称几乎可以保证即使在多个开发人员中,这些名称也会被执行到整个应用程序.当你开始尝试教导开发人员在SQL级别上对复数进行某些不同的思考时,事情会变得混乱. (4认同)
  • @jlembke:这是一个包含袜子的袜子抽屉.你不会把你的袜子抽屉标记为"袜子".哪个比喻更准确? (3认同)
  • @shabby如果多个苹果进入'Apple`表,那么多个水果进入`Fruit`表.你也可以将它们命名为复数.唯一保证不可接受的是单独命名一个,另一个多个. (3认同)
  • 虽然我同意单数更好的结论,但第一个原因的例子似乎是不合逻辑的.你说一袋苹果应该叫AppleBag; 通过这种推理,该表应该被称为UserTable(就像你在描述容器 - 一袋苹果或一个用户表).或者相反,如果您认为用户表应该被称为用户,那么您应该打电话给你的Apple苹果包. (3认同)
  • 我必须在你的'AppleBag'评论表上给你打电话.为什么?因为通过添加后缀'Bag',你*正在改变它以引用某个容器.出于同样的原因,如果你说AppleTable等同于AppleCollection我也没问题.但是如果没有描述部分 - "表格"或"集合" - 您通过它可能包含或不包含的内容来调用某些内容,而不是它本身*的内容.换句话说,你*可以*说'一个AppleBag持有苹果',但你不会*说'一个苹果持有苹果',但你可以说'名为'苹果'的项目包含零个或多个苹果对象'. (3认同)
  • 我不喜欢你的'AppleBag'类比.它建议您必须为客户`CustomerTable`而不是'Customer`命名一个表. (3认同)
  • 我喜欢这个答案,它提供了许多选项作为使用Singular的优点.我确信还有一些缺点,比如袜子的例子,我仍然认为这是一个非常简洁的方法. (2认同)
  • 原因4很可爱,但是如果您必须在代码中的其他位置使用复数形式,则它的作用很小。假设有一个模型函数来检索非活动用户列表,自然将其命名为“ getInactiveUsers”。因此,简单性变成了:(1)SQL一切都是单数。(2)代码中的奇异类。(3)对于其余部分,单数或复数取决于它是集合还是单个实例。我的简单性就是(3)。 (2认同)
  • +1仅因为理由5(全球化).我以前遇到过这个问题,当然它有助于外国程序员对对象和表使用统一的命名约定. (2认同)
  • 太糟糕了,我不能两次赞成这个回应。一个是原因 1,另一个是原因 4。 (2认同)
  • 一旦你同意详细语言和OOP的概念是为了使编程人性化以便立即理解概念,2-6原因就没有实际意义了. (2认同)
  • @jlembke:这是一个很好的例子"袜子通常是复数"(因为它来自成对),并且感谢"把这些衬衫放在衬衫抽屉里",因为我不是母语为英语的人,所以我没有意识到这一点.感谢你的例子,现在我有信心"袜子抽屉"不再是反对单一概念的坚实论据. (2认同)
  • @FriendlyDev:我读到了"与用户同桌".`ERR_SUBJECTIVE` (2认同)
  • @minitech:我同意它的阅读方式是主观的。我提出了不同的观点:原因 1-6 大多是客观的,表明使用单数表名对于开发目的更有效。然而,有时对于某些人来说,表格的单数名称看起来和感觉很尴尬(这就是主观体验的来源)。这是我可以看到使用单数名称的唯一缺点。我分享的观点帮助我克服了对使用单数名称的心理保留。我相信这个观点会帮助其他人更习惯使用单数名称。 (2认同)
  • @minitech:原因 1 的措辞不是很好,但它是客观的。单数词始终用于标记集合或集合。它从来不是“袜子套装”或“小饰品系列”,而是“袜子套装”或“小饰品系列”。我同意您可以通过说“套袜子”或“小饰品系列”来指代该系列或系列,但在以这种方式提及它们时,您实际上并没有参考该系列或系列本身的实际名称。在“用户集合”与“用户集合”中,“用户”是集合的名称,“用户”是集合描述的一部分。 (2认同)
  • @minitech:2和5密切相关,可以混为一谈,是的,但这并不意味着它们不客观。还可以证明 4 有助于简化,这使得 4 具有客观性。6是弱,但也是客观的。这些都是客观的。最后,你是 Ryan,但你不是、也永远不会是一个集合或集合,因此 Ryan 的例子是不合逻辑的。如果有一个叫 Ryan 的人的收藏,它可以被称为“Ryan Collection”,而不是“Ryans Collection”。“Ryans 的集合”可能指的是它,但不是它的名字。 (2认同)
  • 虽然我喜欢这个答案,但我的眼睛却被URL"stackoverflow.com/questions/..."所吸引.我会在"问题"表中加上"问题",而URL会反映表名而不会引起任何混淆. (2认同)
  • 拥有新闻桌与拥有爱情表或气象表一样有意义.它们都是https://en.wikipedia.org/wiki/Mass_noun没有新闻,爱情或天气这样的东西.你今天想要多少天气? (2认同)
  • 单数命名约定的主要原因是:表是ER模型语言/关系代数中实体的直接数据库表达式.表"apple"表示实体apple并包含苹果的"实例".在OOP中,类名是单数的:"Apple".您将拥有许多"苹果" - "Apple"类型的实例(对象). (2认同)
  • 原因1:想象一下,你带着你的苹果包走在城里,有人问你带着什么.你会回答"我的苹果包"或"苹果".但除非你是个疯子,否则不会说"苹果".原因2:多个单词并不那么困难.按照你的逻辑,人们可能会完全停止使用复数词.我认为人可能会发现这更令人困惑.原因3:订单有效,虽然我不经常按字典顺序订购我的表.原因4:"Customer.CustomerID."真的吗?理由5:只是理性的重复2.理由6:很好,我卖了.多个是. (2认同)
  • 名称AppleBag的@Nestor表令人困惑?它是苹果或applebags的容器.根据您的说法,以Customer命名的表是客户的容器.AppleBag是一种存储在Bags表中的类型. (2认同)
  • @tobia.zanarella,正如我上面关于另一张海报所说的那样,您将类名等同起来的论点是不正确的,因为类代表单个实例。它并不代表事物的集合。相反,表代表由行表示的事物的集合。行是类的同义词,而不是表的同义词。您不会说“Sock 中包含一组袜子”,但您“可以”说“Socks(名称)或 SockTable(描述)中包含一组 Sock 对象”。 (2认同)
  • @pacoverflow,你的评论正是为什么表应该是复数.客户清楚地表明它拥有一组客户对象.如果它只是"客户",那么您怎么知道它不包含特定客户的属性?奇异是模棱两可的.另外,它也没有遵循正确的语法."选择*来自客户,其中姓名="乔""明确表示您正在选择具有该名称的客户.但是"Select*From Customer where Name ="Joe""是否意味着您选择了一部分客户,其中该部分名为Joe,或者您是否选择了具有该名称的整个客户? (2认同)
  • 我知道这已经讨论得很厉害了,只是想补充一下:你把袜子放进袜子抽屉里,你也从袜子抽屉里取出袜子。这是您大多数时候与袜子抽屉交互的方式,而不是与袜子抽屉交互的方式。 (2认同)

Bri*_*ght 259

如果您使用对象关系映射工具,或将来我建议使用Singular.

像LLBLGen这样的工具可以自动更正多个名称,例如用户到用户,而无需更改表名本身.为什么这很重要?因为当它被映射时你希望它看起来像User.Name而不是Users.Name,或者更糟糕的是我的一些旧数据库表命名tblUsers.strName,这在代码中只是令人困惑.

我的新经验法则是判断一旦它被转换成对象后它的外观.

我找到的一个表不适合我使用的新命名是UsersInRoles.但总会有少数例外,即使在这种情况下它看起来也很好,如UsersInRoles.Username.

  • 我投了票,我会告诉你原因,因为我不同意.ORM的本质是关于映射.我曾经使用的每个ORM工具都支持在实体与实体名称不同时指定要用于实体的表名.这很重要,因为我们映射到关系数据库的全部原因是我们可以轻松地创建具有与我们的对象模型不同的形状的即席查询和报告.否则我们现在只是使用对象/文档数据库. (45认同)
  • ORM不应该指定它们映射到的对象的名称.ORM的观点是对象的抽象,赋予了这种灵活性. (22认同)
  • 在我的世界中,我尝试在整个项目中使用一致的名称,以避免浪费时间,想知道这个实例是否有最终结果.ORM*可以*重命名并且独立的事实并不意味着这样做可以帮助您的开发人员. (19认同)
  • @巴里皮克。复数名称在 ORM 代码中看起来并不愚蠢。复数在 SQL 中看起来也很糟糕,尤其是在引用唯一属性时。谁从来没有写过 select user.id from users ?或者也许...来自用户左加入 thingy.user_id = user.id...? (3认同)
  • 一些ORM(像许多编程工具一样)具有默认行为,可以生成没有配置的实现......具有Productivityity的卖点.因此,创建一个没有显式映射的Employee类将默认生成一个Employee表 (2认同)

Tom*_*m H 239

就"标准"而言,其他人已给出了相当不错的答案,但我只想添加这个......"用户"(或"用户")是否可能实际上并不是表中所含数据的完整描述?并不是说你应该对表名和特异性过于疯狂,但也许类似"Widget_Users"(其中"Widget"是你的应用程序或网站的名称)会更合适.

  • 不会关联架构名称会消除所有的混乱吗?AppName1.Users,AppName2.Users? (122认同)
  • 我同意.OrgUsers,AppUsers,任何避免使用关键字的东西. (7认同)
  • 我不同意表前缀 - 应该是一个架构? - 但我同意"更具描述性的名称".即使像"AppUser"这样简单的东西就足够了,而不会进入整个名称空间辩论. (6认同)
  • -1.表用户(和国家/地区,语言)可以同时在少数应用程序中使用. (5认同)
  • 这是一种可能性,但可能有很多原因导致某人不想以这种方式使用模式.此外,即使使用模式,您仍然会遇到关键字问题. (5认同)
  • 这个被接受的答案更多的是一个侧面评论,并没有回答这个问题. (5认同)
  • 表名前缀与*使用单数与复数*有什么关系?现在问题就变成了我使用*Widget_User*或*Widget_Users*.这与这个问题无关. (3认同)
  • 绝对不要使用应用程序名称!在某些时候,营销人员会将您的产品重命名为 NewFooApp,您将永远受困于“Widget”的遗留问题,永远污染您的数据库模式,只有少数人仍在公司工作足够长的时间来记住它的含义。 (2认同)

Ian*_*non 206

我更喜欢使用未反射的名词,在英语中恰好是单数.

改变表名的数量会导致正交问题(正如许多其他答案所示),但选择这样做是因为表通常包含多行,因此在语义上也充满了漏洞.如果我们考虑一种基于案例(大多数情况下)调用名词的语言,这一点就更加明显了:

既然我们通常会对行做些什么,为什么不把这个名字放在指控的情况下呢?如果我们写的表比我们读的要多,为什么不把这个名字写成dative?这是一个表东西,为什么不使用所有格?我们不会这样做,因为该表被定义为一个抽象容器,无论其状态或用法如何都存在.在没有精确和绝对语义原因的情况下改变名词就是喋喋不休.

使用未反射的名词是简单的,逻辑的,规则的和与语言无关的.

  • 好吧,我显然需要加强我的词汇量. (46认同)
  • 可能是我见过的关于这个主题的最合理的论点,让我很高兴我把时间花在了拉丁语上.+1肯定. (36认同)
  • +1看,这些是互联网需要更多的答案.无可挑剔的证据使用丰富的词汇来执行完美的逻辑. (17认同)
  • 我下次用拉丁语编程时会注意到这一点.在此期间,用户将进入users表,将客户进入customers表. (8认同)
  • 深信不疑 - 它是不受影响的.有趣的是,经过这么长时间以来,"奇异"和"复数"的流行选择**都错了! (8认同)
  • 迟到了,但是如果你对(其他)编程中的变量名应用相同的规则,当它们包含多种类型的项目(例如数组,列表,集合等)时,我会感到好奇.`FrequentCustomerArray`而不是'FrequentCustomers`?如果没有,为什么会有所不同? (3认同)
  • 也很晚回复。在代码中,您需要确定复数形式和单数形式的区别,因为变量中的项目数量很重要。在类名中,它是不同的:如果它是客户端,则不会命名为“ Clients”类。 (2认同)
  • 对于我们这些在创建表格之前没有时间获得语言学学位的人来说,一些简单的定义和示例将非常有帮助。 (2认同)

Mic*_*ren 128

什么约定要求表具有单数名称?我一直认为这是多个名字.

用户将添加到Users表中.

本网站同意:http:
//vyaskn.tripod.com/object_naming.htm#Tables

该网站不同意(但我不同意):http:
//justinsomnia.org/writings/naming_conventions.html


正如其他人所说:这些只是指导方针.选择适合您和您公司/项目的惯例并坚持下去.在单数和复数之间切换或有时缩写单词有时不会更加恶化.

  • 如果你有一个装有5个苹果的袋子怎么办?你叫它一袋苹果吗?还是一袋苹果? (87认同)
  • 当将集理论应用于表时,集合中的任何实例都代表集合,因此Apple是Apple集合,它不知道集合中有多少苹果 - 它是具有许多实例的Apple.苹果的"袋子"在包含许多苹果时不会成为"袋子". (44认同)
  • @Christopher,如果袋子的存在理由是拿苹果而且只有苹果,那么它就是一个"苹果袋",无论它是包含1个苹果,100个苹果还是没有苹果. (26认同)
  • 我认为该理论将该集合命名为Apples.一个单一的苹果仍然是"一套苹果" - 尽管是一个单一的实例.多个苹果也是一套"苹果". (25认同)
  • @ Ian:那是因为桌子是通用的,可以与运输容器进行比较(几乎可以包含任何东西,从苹果箱到Harley Davidson摩托车的箱子).你说:一个橙色货物集装箱,而不是橙色货物集装箱.你说:一个货物集装箱的汽车零件,而不是一个汽车零件货物集装箱.如果您创建了一个自定义数据结构,只包含特定类型的数据,例如苹果的名称,并将其命名为"kungabogo",那么您可以拥有一个苹果kungaboko.我知道你的想法,但首先考虑一个球的囊,并理解意义上的差异. (13认同)
  • 我的父亲,一个来自Wayback的旧DB管理员,有时会使用"record"这个词来引用表,大概是将实例的名称应用于集合的一种方式.换句话说,他会说,"WidgetUser记录".从他和我认识的一位非常优秀的数据库建筑师那里,我本能地认识到这就是真正的家伙所做的那种奇异. (7认同)
  • "AppleBag"在单数方面效果最好,因为它包含容器类型,但我不希望在我创建的每个数据库表后面添加"-Table".同样地,用一个单词"Apple"标记苹果包是没有意义的. (7认同)
  • @Christopher,一个特定的数据库表被设计为永久保存一种类型的东西,并且即使在空的时候也与这种类型相关联,因此运输容器是一个不充分的比喻.它们也是抽象概念,因此不太可能有人将它们与阴囊混淆. (6认同)
  • 您将如何在代码中定义Apple对象数组?`Apple apples [100]`或`Apple apple [100]` (3认同)
  • @Ian:好的,我同意你的意见.除了它们要保留的东西之外,实现的表不能容纳任何东西.当然,他们可以容纳许多不同类型的东西.红色衬衫,蓝色衬衫,柔软衬衫,短衬衫等.亮片衬衫.他们都落入了衬衫桌.出售衬衫,订购衬衫,衬衫设计,包装衬衫,衬衫被破坏,衬衫被破坏,非洲衬衫,巴基斯坦衬衫,船上衬衫,盒子里的衬衫,架子上的衬衫,衬衫在地上.所有衬衫.在衬衫表.说得通.不. (3认同)
  • 这些都是搞笑的例子 - 我倾向于同意@Ian虽然@Christopher - 我知道在路上是一个苹果车.它出售格兰尼史密斯,乔纳森甚至金冠苹果.毕竟,它是一个User表,而不是Users表...... (3认同)
  • 复数是要走的路。唯一反对它的论点是站不住脚的,那就是选择关系。从用户中选择*,其中Users.Name =“somename”。这实际上应该写为 SELECT * from Users user where user.Name = "somename"。或者在实体框架中考虑它。Users.Where(user => user.Name == "somename"). 表是集合实体,表不是关系。关系只是实体的一个特征,仅此而已。表名应该是复数 (2认同)

小智 74

这个如何作为一个简单的例子:

SELECT Customer.Name, Customer.Address FROM Customer WHERE Customer.Name > "def"
Run Code Online (Sandbox Code Playgroud)

SELECT Customers.Name, Customers.Address FROM Customers WHERE Customers.Name > "def"
Run Code Online (Sandbox Code Playgroud)

后者的SQL听起来比前者更陌生.

我投票支持单数.

  • 在那个例子中,是的,但在实际的SQL中,它永远不会以这种方式编写.你有一个表别名,所以它更像是`SELECT C.Name,C.Address FROM Customers WHERE Customers.Name>'def'` (45认同)
  • 我认为sql听起来更好复数.你不会为每一列都有表名,为什么要输入这么多.SELECT名称,地址FROM Customers WHERE名称>"def"您要从名称大于def的客户池中进行选择. (22认同)
  • 如何使用别名/ AS解决这个问题?SELECT Customer.Name,Customer.Address FROM Customers AS Customer WHERE Customer.Name>"def" (6认同)
  • 第二个听起来好多了,单数听起来像一个不会说英语的人。 (2认同)
  • 我知道这很旧,但如果您考虑一下,它会从客户表中选择每个客户的姓名、客户地址。通过使用复数,您始终会记住返回的将是一个集合,即使该集合仅包含一项。 (2认同)

Ada*_*arr 61

我坚信在实体关系图中,实体应该用一个单数名称来反映,类似于一个单数的类名.实例化后,名称将反映其实例.因此,对于数据库,实体在制成表格(实体或记录的集合)时是复数形式.实体,用户被制成表用户.我同意其他人的建议,可能会将用户名称改进为员工,或者更适用于您的场景.

这在SQL语句中更有意义,因为您从一组记录中进行选择,如果表名是单数,则读取不好.

  • 我特别喜欢SQL语句注释.在这里使用单数对读者来说并不直观. (3认同)
  • 关于ERD的要点。我怀疑这就是为什么对于通过DBA眼睛看世界的人来说,单数命名是有意义的。正如您所指出的,我怀疑它们没有得到实体和它们的集合之间的区别。 (2认同)
  • 表不是记录的集合;而是记录的集合。表是记录的定义。这就是所有复数/单数人似乎都存在的脱节。 (2认同)
  • 查找关系数据库术语以及为什么我们应该使用“关系”一词而不是“表”。 (2认同)

Ash*_*ine 38

我坚持使用单数表格和任何编程实体.

原因?事实上,英语中有不规则的复数,如老鼠⇒老鼠绵羊⇒绵羊.然后,如果我需要一个集合,我只需使用鼠标绵羊,然后继续前进.

它确实有助于多元化突出,我可以轻松地和编程地确定事物的集合将是什么样子.

所以,我的规则是:一切都是单数的,每个事物的集合都是单数的,附加一个s.也帮助ORM.

  • 我会调用表NewsItem和一个集合NewsItems. (18认同)
  • @HamishGrubijan然后停止使用Word编写代码!;) (13认同)
  • 用's'结尾的单词怎么样?如果您有一个名为"新闻"的表(仅作为示例),您会将新闻集合称为什么?Newss?或者你会把表格称为"新"? (7认同)
  • 如果你必须拼写检查所有代码,否则它将无法编译,该怎么办?)? (4认同)
  • ORM不应该指定它们映射到的对象的名称.ORM的观点是对象的抽象,赋予了这种灵活性. (2认同)

Gul*_*zim 33

恕我直言,表名应该像客户一样复数.

如果类名映射到Customers表中的行,则类名应该像Customer一样.


小智 31

单数.我不买任何涉及最合乎逻辑的论据 - 每个人都认为他自己的偏好是最合乎逻辑的.无论你做什么都是一团糟,只需选择一个约定并坚持下去.我们试图将具有高度不规则语法和语义(正常的口语和书面语言)的语言映射到具有非常特定语义的高度规则(SQL)语法.

我的主要论点是,我不认为这些表是一个集合,而是作为关系.

因此,AppUser关系告诉哪些实体AppUsers.

这种AppUserGroup关系告诉我哪些实体AppUserGroups

AppUser_AppUserGroup关系告诉了我怎么AppUsersAppUserGroups有关系.

这种AppUserGroup_AppUserGroup关系告诉我如何AppUserGroupsAppUserGroups相关(即群组成员).

换句话说,当我考虑实体及其相关性时,我会以单数形式考虑关系,但当然,当我想到集合或集合中的实体时,集合或集合是复数.

在我的代码中,然后在数据库模式中,我使用单数.在文本描述中,我最终使用复数来提高可读性 - 然后使用字体等来区分表/关系名称和复数s.

我喜欢把它看作是凌乱的,而是系统的 - 这种方式总是有一个系统生成的名称,我希望表达的关系对我来说非常重要.

  • 确切地。许多人不知道的主要事情是他们所命名的内容......您正在为一个关系(表中的单个记录)命名,而不是为表中的记录集命名。 (4认同)
  • 不能同意更多。'从名称为'J%'的用户中选择*,因为我要选择名称以'J'开头的所有用户。如果您的论据是您要写'... where User.Name like ...',则只需使用别名即可。同样的原因,我说“请从所有可用的袜子中给我一双。” (3认同)

Jos*_*ris 29

我也会使用复数形式,并且由于上述用户困境,我们采取了方括号方法.

我们这样做是为了在数据库体系结构和应用程序体系结构之间提供一致性,基本理解Users表是User值的集合,而代码工件中的Users集合是User对象的集合.

让我们的数据团队和我们的开发人员使用相同的概念语言(尽管并不总是相同的对象名称)可以更容易地在它们之间传达想法.

  • 我同意..为什么代码和存储之间的不一致?我永远不会在代码中命名用户对象"User"的集合...那么我为什么要调用一个表呢?这没有道理.当我阅读上面关于它的论点时,他们关注的是实体,而不是表格......表格中的内容与表格本身在我的脑海中有所区别. (7认同)
  • 如何处理像“companies”这样的表名称,而其他表有一个名为“company_id”的引用字段?虽然拼写正确,但对于那些对表命名约定挑剔的人来说,它似乎不一致。 (3认同)
  • 通过记住`companys`的单数是`company`,并且这个id是对单数项的引用。它不应该在代码中困扰我们,就像它在英语中困扰我们一样。 (2认同)

小智 20

我个人更喜欢使用复数名称来表示一组,它对我的​​关系思维来说只是"听起来"更好.

在这个时刻,我使用单数名称来为我的公司定义数据模型,因为大多数工作人员对此感到更加舒适.有时你只需要让每个人的生活更轻松,而不是强加你的个人喜好.(这就是我在这个帖子中的结果,以获得关于命名表的"最佳实践"的确认)

在阅读了这个帖子中的所有争论之后,我得出了一个结论:

无论每个人最喜欢的味道是什么,我都喜欢我的蜂蜜煎饼.但如果我正在为其他人做饭,我会尝试为他们提供他们喜欢的东西.


cha*_*aos 16

单数.我将调用一个包含一堆用户行表示对象'us​​ers'的数组,但该表是'用户表'.将表视为只包含它所包含的行的集合是错误的,IMO; 表是元数据,行集按层次结构附加到表中,而不是表本身.

当然,我总是使用ORM,并且用多个表名编写的ORM代码看起来很愚蠢.

  • ORM不应该指定它们映射到的对象的名称.ORM的观点是对象的抽象,赋予了这种灵活性. (3认同)
  • 我是这样看的..如果你在代码中创建一个包含任何内容的数组/列表/字典,我敢打赌你用它所包含的任何内容的复数名称来命名它。如果您使用 ORM 来抽象数据库,表是用某种集合表示的,那么为什么要以不同的方式对待它们呢?使用单一名称可能听起来不错,但您总是与自己的本能作斗争,因为表中包含许多相同的内容,就像代码中的集合一样。为什么不一致? (2认同)

Eug*_*ota 15

我不喜欢复数表名,因为英语中的一些名词不可数(水,汤,现金),或者当你使它成为可数时意义改变(鸡与鸡,肉与鸟).我也不喜欢使用表名或列名的缩写,因为这样做会给已经陡峭的学习曲线增加额外的斜率.

具有讽刺意味的是,我可能会因为USER(Transac-SQL)User异常并调用它,因为如果我不需要,我也不喜欢在表格周围使用括号.Users

我也喜欢来命名所有的ID列作为Id,而不是 ChickenIdChickensId(什么做复数家伙怎么处理这件事?).

所有这一切都是因为我对数据库系统没有适当的尊重,我只是重新应用来自OO命名约定的单一技巧 - 小马知识,比如Java的习惯和懒惰.我希望有更好的IDE支持复杂的SQL.

  • 我们复数的人要么像你一样命名'id'列'id',要么'singular_id'.我认为表应该是复数(想象它们像数组),但列名应该是单数(单个元素的属性). (8认同)

ste*_*hbu 14

我们运行类似的标准,当脚本我们要求[]围绕名称,以及适当的模式限定符 - 主要是它通过SQL语法对未来的名称争夺进行对冲.

SELECT [Name] FROM [dbo].[Customer] WHERE [Location] = 'WA'
Run Code Online (Sandbox Code Playgroud)

这已经拯救了我们的灵魂 - 我们的一些数据库系统已经从SQL 6.0到SQL 2005运行了10多年 - 远远超过了预期的寿命.


小智 14

我实际上一直认为使用复数表名是流行的惯例.到目前为止,我一直使用复数.

我可以理解单数表名称的论点,但对我而言,复数更有意义.表名通常描述表包含的内容.在规范化数据库中,每个表都包含特定的数据集.每行都是一个实体,表包含许多实体.因此表名的复数形式.

汽车的表将有名称的汽车和每一行都是汽车.我承认,以某种table.field方式指定表和字段是最佳做法,并且具有单个表名更具可读性.但是在以下两个例子中,前者更有意义:

SELECT * FROM cars WHERE color='blue'
SELECT * FROM car WHERE color='blue'
Run Code Online (Sandbox Code Playgroud)

老实说,我将重新考虑我对这个问题的立场,我将依赖于我正在开发的组织所使用的实际惯例.但是,我认为对于我的个人约定,我会坚持使用多个表名.对我而言更有意义.

  • 这不是RoR的惯例吗?表的多个名称和ORM类的Singular?对我来说很有意义.表被称为"汽车",因为它有许多"汽车"的实例,而班级被称为"汽车",因为它将举行汽车的一个实例! (8认同)
  • 我真的很喜欢这个答案!让我解释。如果集合是`car`,而您想要`car`是蓝色的一切,那么结果应该是诸如“轮胎,镜子,引擎”之类的东西。然后,这变得令人困惑,因为所有结果都是来自“汽车”的“零件”。因此表名称应为`carparts`(或任意喜欢的`car_parts`,`CarParts`) (4认同)

And*_*rew 13

表:复数

users表中列出了多个用户.

型号:单数

可以从用户表中选择单个用户.

控制器:复数

http://myapp.com/users会列出多个用户.

无论如何,这是我对它的看法.


Mic*_*hel 12

该系统tables/views服务器本身(的SYSCAT.TABLES,dbo.sysindexes,ALL_TABLES,information_schema.columns,等)几乎总是复数.我想为了保持一致性,我会追随他们的领导.

  • 应该注意的是,`information_schema` 是 SQL 标准 ISO/IEC 9075-11 的一部分。是的,它确实使用了多个表/视图名称。 (3认同)

Sha*_*ore 12

我是单个表名的粉丝,因为他们使用CASE语法使我的ER图更容易阅读,但通过阅读这些回复,我感觉它从来没有流行起来?我个人喜欢它.有一个很好的概述,例子说明当您使用单数表名称时,模型的可读性,为您的关系添加动作动词以及为每个关系形成好的句子.对于一个20表数据库来说,这有点过分,但如果你有一个拥有数百个表和复杂设计的数据库,你的开发人员如何在没有良好可读图的情况下理解它?

http://www.aisintl.com/case/method.html

至于为表格和视图添加前缀,我绝对讨厌这种做法.在给予他们可能不良信息之前,根本不给任何人提供信息.任何浏览数据库对象的人都可以很容易地从视图中告诉表,但是如果我有一个名为tblUsers的表,由于某种原因我决定将来重组为两个表,并使用一个视图统一它们以防止破坏旧代码我现在有一个名为tblUsers的视图.在这一点上,我留下了两个没有吸引力的选项,留下一个以tbl前缀命名的视图,这可能会使一些开发人员感到困惑,或者强制使用另一个层,要么重写中间层或应用程序以引用我的新结构或名称viewUsers.这否定了恕我直言的观点价值的很大一部分.


小智 10

如果我们查看MS SQL Server's系统表,它们的名称由Microsoft分配plural.

Oracle的系统表以命名singular.虽然其中一些是复数.Oracle建议使用多个用户定义的表名.他们推荐一件事并跟随另一件事并没有多大意义.这两个软件巨头的建筑师用不同的惯例命名他们的桌子也没有多大意义......毕竟,这些家伙是什么......博士?

我记得在学术界,这个建议是单数的.

例如,当我们说:

select OrderHeader.ID FROM OrderHeader WHERE OrderHeader.Reference = 'ABC123'
Run Code Online (Sandbox Code Playgroud)

也许b/c每个ID都是从特定的一行中选出的......?

  • 微软之所以成为今天的样子,首先是出于商业原因(而且往往是不道德的原因),最后才是逻辑原因。我跟随他们的唯一原因是他们是大猩猩,其他人都走那条路。当我有选择的时候,我会选择另一条路。 (2认同)

Dav*_*kle 9

可能的选择:

  • 重命名表SystemUser
  • 使用括号
  • 保留多个表名.

使用支架的IMO在技术上是最安全的方法,尽管它有点麻烦.IMO是其中的6个,另外6个,你的解决方案实际上归结为个人/团队偏好.

  • 我喜欢你的"前缀"想法,但会称之为SystemUser. (2认同)

Bor*_*zio 9

这可能有点多余,但我建议保持谨慎.重命名表不一定是坏事,但标准化就是这样; 一个标准 - 这个数据库可能已经"标准化",但是很糟糕:) - 我建议一致性是一个更好的目标,因为这个数据库已经存在,并且可能它只包含2个表.

除非你能够标准化整个数据库,或者至少计划为此目的而努力,否则我怀疑表名只是冰山一角,专注于手头的任务,忍受命名不佳的物体的痛苦,可能在你的最大利益 -

实际的一致性有时是最好的标准...... :)

my2cents ---


jle*_*rre 9

我的观点是语义,取决于你如何定义容器.例如,"苹果袋"或简称为"苹果"或"苹果袋"或"苹果".

示例:"大学"表可以包含0个或更多个学院,"大学"表可以包含0个或更多个同事

a "student" table can contain 0 or more students 
a table of "students" can contain 0 or more students.
Run Code Online (Sandbox Code Playgroud)

我的结论是,两者都很好,但你必须定义你(或与之交互的人)在引用表格时会如何处理; "ax table"或"xs表"


Chr*_*ris 8

正如其他人在此提到的那样,约定应该是增加易用性和可读性的工具.不是折磨开发商的束缚或俱乐部.

也就是说,我个人的偏好是对表格和列使用单数名称.这可能来自我的编程背景.类名通常是单数,除非它们是某种集合.在我看来,我正在存储或阅读有问题的表中的个别记录,所以奇异对我来说是有道理的.

这种做法还允许我为那些存储我的对象之间的多对多关系的表保留多个表名.

我也试图避免在表格和列名中保留单词.在这里讨论的情况下,更有意义的是,与用户的单一约定相反,以避免需要封装使用User的保留字的表.

我喜欢以有限的方式使用前缀(tbl用于表名,sp_用于proc名称等),尽管许多人认为这会增加混乱.我也更喜欢CamelBack名称下划线,因为在键入名称时我总是最后点击+而不是_.许多人不同意.

以下是命名惯例指南的另一个很好的链接:http://www.xaprb.com/blog/2008/10/26/the-power-of-a-good-sql-naming-convention/

请记住,您的约定中最重要的因素是,与相关数据库交互的人员是有意义的.在命名约定方面,没有"一环统治它们".

  • 无视匈牙利符号的恐怖.永远不要永远不要在存储过程之前使用sp_,因为MS-SQL将它用于系统存储过程并对它们进行特殊处理.由于sp_存储在主表中,因此即使您符合该位置,MS-SQL也始终首先查看. (18认同)

hel*_*der 8

我认为使用单数是我们在大学里教的.但与此同时,您可能会争辩说,与面向对象编程不同,表不是其记录的实例.

由于英语中存在多种不规则现象,我认为我现在正倾向于支持单数.在德语中,由于没有一致的复数形式,情况更糟糕 - 有时你无法判断一个单词是否为复数而没有前面的指定文章(der/die/das).而在中文中,无论如何都没有复数形式.


小智 8

我总是使用单数,因为这就是我所教的.然而,在最近创建一个新架构时,我很长时间以来第一次主动决定维护这个约定只是因为......它更短.在每个表名的末尾添加's'对我来说似乎没有用,因为在每个表前加上'tbl_'.


Bru*_*tin 8

我曾经在User表中使用"Dude" - 相同的短字符数,与关键字没有冲突,仍然是对通用人类的引用.如果我不担心可能会看到代码的闷头,我会保持这种方式.


Jam*_*ran 7

我一直认为这是一个愚蠢的惯例.我使用多个表名.

(我相信该策略背后的理性是它使ORM代码生成器更容易生成对象和集合类,因为从单数名称生成复数名称比反之亦然更容易)

  • 在ORM曾经存在之前,这个约定长期以来一直是关系理论的一部分. (11认同)
  • ORM 不应该规定它们映射到的对象的名称。ORM 的要点是对象的抽象,从而赋予了这种灵活性。 (2认同)

小智 7

我只使用名词作为拼写相同的表名,无论是单数还是复数:

驼鹿鱼鹿飞机你裤子短裤眼镜剪刀种子后代


Ben*_*ter 5

准则确实就在那里。这不是“一成不变”的原因,因此您可以选择忽略它们。

我要说,具有复数的表名在逻辑上更直观。表毕竟是实体的集合。除了提到的其他替代方案之外,我通常会在表名上看到前缀...

  • tblUser
  • tblThis
  • 那个
  • tblTheOther

我并不是在建议这样做,我也看到空格在我讨厌的表名中使用了很多。我甚至遇到过带有白痴字符的字段名称?好像说这个领域回答了一个问题。

  • 同意 空格和前缀来自Devil。 (4认同)
  • 再次+1。用空格命名的表和字段是神智活泼的孩子Office Junior在帐户:-)中为Beryl制作真正的kool访问应用程序的标记。 (4认同)
  • tbl作为前缀是devilspawn和臭腐肉的儿子,但是语义前缀要好一些。在我们的主应用程序中,我们(Chase Software)将所有表都以“ ca”或“ cs”作为前缀,作为追逐应用程序或追逐系统。 (3认同)
  • MSAccess鼓励表名带有空格。我怀疑空间中的许多MSSQL表是从那里导入的。 (2认同)

小智 5

我只想说明为什么我使用单数名称.

例如,我需要从用户获取所有字段:

-- Select every fields from 'user' table
SELECT * FROM user
Run Code Online (Sandbox Code Playgroud)

我需要21岁用户的名字:

-- Select every fields from 'user' table which have 21 years old
SELECT * FROM user WHERE age = '21'
Run Code Online (Sandbox Code Playgroud)

当然,复数方式可以通过相同的方式使用,但是对于我的大脑来说,我真的认为这是正确的方法.

  • 我不同意; 在oracle数据库中有一个名为USER的系统表,现在你必须决定将其称为"APP_USER"或类似的东西.但是考虑到说"选择所有来自用户"听起来更好,我只是将所有表命名为我的实体的复数形式,以免与任何系统表冲突. (3认同)
  • 我喜欢从“users”或“userTable”中选择,但不喜欢从“user”中选择。单数听起来就像你只得到一张唱片。我发现您喜欢考虑从表中选择列。大多数人认为 select 从表中返回行,因此集合名称听起来很合乎逻辑。 (3认同)
  • 奇异是标准. (2认同)

Bru*_*tin 5

表的SQL定义实际上是表的一个潜在行的定义,而不是集合.因此,该定义中使用的名称必须指定行的类型,而不是集合的名称.喜欢复数的人因为在英语陈述中读得好,需要开始更加逻辑地思考并查看实际使用表所涉及的所有逻辑和编程代码.这些注释中提到的几个很好的理由是使用单数表名.这些包括非常好的理由不使用复数表名."读得好"根本不应该是任何理由,特别是因为有些人可能会以不同的方式阅读这个想法.


jer*_*boy 5

我以前的任何答案都没有清楚地阐明这一点。使用表时,许多程序员没有正式的定义。我们经常就“记录”或“行”进行直观的交流。但是,除非规范化关系外,通常设计表以使非键属性和键之间的关系构成一个集合理论函数。

函数可以定义为两组之间叉积的子集,其中键集中的每个元素在映射中最多出现一次。因此,从该角度出发产生的术语趋于单一。人们在涉及函数(例如,代数和λ演算)的其他数学和计算理论中看到了相同的单数(或至少是非复数)约定。