题 表命名困境:奇异与多个名称[关闭]


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

我不喜欢任何需要方括号的T-SQL,但我重命名了一个 Users 表到单数,永远量刑那些使用表有时必须使用括号。

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

我应该走还是留?


1175


起源


前面的Dup 数据库表命名,复数或单数,但这个得到了更多的关注。 - outis
英语不是我的母语,有人可以给我举个例子 Singular 和 Plural? - GusDeCooL
codeproject.com/Articles/309304/... - Mr Spark
令我感到惊讶的是,更多的人并没有说:这取决于单行代表什么。在单个数据库中,我可能有一个表,其行表示单个窗口小部件,另一个表与该表的一对多关系意味着行代表许多窗口小部件。不这样做会失去表现力。 - andygavin
@andygavin好吧,我在一个单数和复数混合的系统中工作(也许就像你建议的那样,我可能会检查它,但我怀疑它只是太多的厨师),在你做对了它之前需要一段时间(intellisense是对我来说总是太慢......) - Erk


答案:


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


206



我同意。 OrgUsers,AppUsers,任何避免使用关键字的东西。 - MikeW
-1。表用户(和国家/地区,语言)可以同时在少数应用程序中使用。 - OZ_
不会关联架构名称会消除所有的混乱吗? AppName1.Users,AppName2.Users? - Zo Has
这是一种可能性,但可能有很多原因导致有人不想以这种方式使用模式。此外,即使使用模式,您仍然会遇到关键字问题。 - Tom H
我不同意表前缀 - 应该是一个架构? - 但我同意“更具描述性的名称”。即使像“AppUser”这样简单的东西就足够了,而不需要进入整个名称空间辩论。


我有同样的问题,在阅读完这里的所有答案后,我绝对会留在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,...

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


1389



我敢打赌,如果你在袜子抽屉上放一个标签,你就称之为“袜子”。 - Chris Ward
Definetelly。很难得到一个适用于所有人和每个人的标准,重要的是适合你。这对我有用,在这里我已经解释了为什么,但同样,这对我来说,我发现它非常方便。 - Nestor
更大的问题Chris,为什么在命名袜子抽屉时会遵循数据库命名约定? - Kyle Clegg
这个答案需要更多的赞扬。它讨论了我应用于为什么我更喜欢单数名称的一些实际原因。关于适当语言参考集合的替代讨论只是哲学上的,并且模糊了真实的观点。 Singular的效果更好。 - Jason
我家里有一个“袜子”抽屉,而不是“袜子”抽屉。如果它是一个数据库,我称之为“Sock”表。 - jlembke


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

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

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

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


242



我投了票,我会告诉你原因,因为我不同意。 ORM的本质是关于映射。我曾经使用过的每个ORM工具都支持在实体与实体名称不同时指定要用于实体的表名。这很重要,因为我们映射到关系数据库的全部原因是我们可以轻松地创建具有与对象模型不同的形状的即席查询和报告。否则我们现在只是使用对象/文档数据库。 - joshperry
ORM不应该指定它们映射到的对象的名称。 ORM的观点是对象的抽象,赋予了这种灵活性。 - barrypicker
这在工具中占主导地位,还是仅仅是您使用过的工具? - Bruce Alderson
在我的世界中,我尝试在整个项目中使用一致的名称,以避免浪费时间,想知道这个实例是否有最终结果。 ORM的事实 能够 重命名和独立并不意味着这样做有助于您的开发人员。 - John Nicholas
一些ORM(像许多编程工具一样)具有默认行为,可以生成没有配置的实现......具有Productivityity的卖点。因此,创建一个没有显式映射的Employee类将默认生成一个Employee表 - user919426


我更喜欢使用 屈折变化 名词,在英语中恰好是单数。

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

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

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


174



可能是我见过的关于这个主题的最合理的论点,让我很高兴我把时间花在了拉丁语上。 +1肯定。
好吧,我显然需要加强我的词汇量。 - TJ Biddle
+1看,这些是互联网需要更多的答案。无可挑剔的证据使用丰富的词汇来执行完美的逻辑。 - OCDev
我下次用拉丁语编程时会注意到这一点。在此期间,用户将进入users表,将客户进入customers表。 - Caltor
深信不疑。有趣的是,经过这么长时间以来,“奇异”和“复数”的流行选择是 都 错误! - Stuart


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

用户将添加到Users表中。

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

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


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


115



当将集理论应用于表时,集合中的任何实例都代表集合,因此Apple是Apple集合,它不知道集合中有多少苹果 - 它是具有许多实例的Apple。苹果的“袋子”在包含许多苹果时不会成为“袋子”。 - ProfK
如果你有一个装有5个苹果的袋子怎么办?你叫它一袋苹果吗?还是一袋苹果? - Christopher Mahan
我认为该理论将该集合命名为Apples。一个奇怪的苹果仍然是“一套苹果” - 虽然是一个单一的实例。多个苹果也是一套“苹果”。 - Mark Brackett
@Christopher,如果袋子的存在理由是拿苹果而且只有苹果,那么它就是一个“苹果袋”,无论它是包含1个苹果,100个苹果还是没有苹果。 - Ian Mackinnon
@ Ian:那是因为桌子是通用的,可以与运输容器进行比较(几乎可以包含任何东西,从苹果箱到Harley Davidson摩托车的箱子)。你说:一个橙色货物集装箱,而不是橙色货物集装箱。你说:汽车零件的货物集装箱,而不是汽车零件货物集装箱。如果您创建了一个自定义数据结构,只包含特定类型的数据,例如苹果的名称,并将其命名为“kungabogo”,那么您可以拥有一个苹果kungaboko。我知道你的想法,但首先考虑一个球囊,并理解意义上的差异。 - Christopher Mahan


这是一个简单的例子:

SELECT Customer.Name, Customer.Address FROM Customer WHERE Customer.Name > "def"

SELECT Customers.Name, Customers.Address FROM Customers WHERE Customers.Name > "def"

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

我投票支持 单数


55



在那个例子中,是的,但在实际的SQL中,它永远不会那样写。你有一个表别名,所以它更像 SELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def' - Michael Haren
+1,(一年后)你引用了一个关于奇异有意义的TERRIFIC例子。这有点宗教辩论。几年前,我的一位数据架构师在我的大四学年时,我被转向了这个单数,这对我来说是正确的(在我需要很多令人信服的转换之后)。 - Chris Adragna
我认为sql听起来更好复数。你不会为每一列都有表名,为什么要输入这么多。 SELECT Name,Address FROM Customers WHERE Name>“def”您从客户池中选择名称大于def的客户。 - Jamiegs
如何使用别名/ AS解决这个问题? SELECT Customer.Name,Customer.Address FROM Customers AS Customer WHERE Customer.Name>“def” - James Hughes
第二个听起来好多了,单数的声音就像一个不会说英语的人。 - HLGEM


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

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


53



我特别喜欢SQL语句注释。在这里使用单数对读者来说并不直观。 - hochl
关于ERD的优点。我怀疑这就是为什么,对于通过DBA眼睛看世界的人来说,奇异的命名是有道理的。我怀疑他们没有得到,正如你所指出的,实体和它们的集合之间的区别。 - William T. Mallard
表不是记录集合;表是记录的外观定义。所有复数/奇异的民众似乎都有这种脱节。 - rich remer


我坚持 单数 用于表名和任何编程实体。

原因?事实上,英语中有不规则的复数形式 老鼠⇒老鼠 和 羊⇒绵羊。然后,如果我需要一个 采集,我只是用 鼠标 要么 ,继续前进。

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

所以,我的规则是:一切都是单数的,每一个东西都是单数的 小号 追加。也帮助ORM。


35



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


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

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

所以 AppUser 关系告诉哪些实体 AppUsers

AppUserGroup 关系告诉我哪些实体 AppUserGroups

AppUser_AppUserGroup 关系告诉我如何 AppUsers 和 AppUserGroups 有关系。

AppUserGroup_AppUserGroup 关系告诉我如何 AppUserGroups 和 AppUserGroups 是相关的(即群组成员)。

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

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

我喜欢把它看成是凌乱的,但却是系统的 - 这种方式总是会为我想表达的关系系统地生成名称,这对我来说非常重要。


29



究竟。这里很多人都不知道的主要是他们命名的东西......你给关系命名(表中的单个记录),而不是表中的记录集。 - Alexandre Martini
不能不同意。 '从名为'J%'的用户中选择*,因为我选择名称以'J'开头的所有用户。如果你的论点是你想写'... User.Name like ...'那么只需使用别名。同样的原因,我说'给我一双可用的袜子。' - MarqueIV
如果我是那个特别的,我的表名将是sock_pair - Manuel Hernandez


我也会去 复数,并与上述 用户 困境,我们采取方括号方法。

我们这样做是为了在数据库体系结构和应用程序体系结构之间提供一致性,并具有基本的理解 用户 表是一个集合 用户 价值与a一样多 用户 代码工件中的集合是一个集合 用户 对象。

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


19



我同意..为什么代码和存储之间的不一致?我永远不会在代码中命名用户对象“User”的集合...那么我为什么要调用一个表呢?这个不成立。当我阅读上面关于它的论点时,他们关注的是实体,而不是表格......表格中的表格与表格本身的区别在于我。 - Jason
你如何处理像这样的表名 companies 其他表有一个名为的引用字段 company_id?虽然它拼写正确,但对于那些对表命名约定挑剔的人来说似乎不一致。 - Jake Wilson
通过记住那个单数 companies 是 company,而且这个id是对单个项目的引用。它不应该在代码中困扰我们,而不是用英语困扰我们。 - David


恕我直言,表名应该是 复数 喜欢 顾客

类名应该是单数的 顾客 如果它映射到的一行 顾客 表。


17