复数表与单数表名


41

创建新数据库时应如何命名表?

单数:Client或复数:Clients


我曾经有一个同事坚持表名应为单数,视图名应为复数。
勒内Nyffenegger

1
还有其他思想流派。1)使用允许人用自然语言表达查询的动词,例如person NAMED 'fred' EARNS 20,000(其中大写名称是表格)。2)用企业的名称为集例如PERSONNELPAYROLLORG_CHART
onedaywhen

Answers:


44

由你决定。只是要保持一致。

就个人而言,我更喜欢基于每个“行”存储的单数:订单,产品,用户,物品等。

这与我使用单个实体/类型的建模(通过对象角色建模)匹配。

编辑:

原因之一是,当你有链接表复数失败:
OrdersProducts会给OrderProductsOrdersProducts。听起来都不正确

或历史记录表(当然,您可以为此使用模式):
Orders-> OrdersHistory或(否!)OrdersHistories?会不会Order- > OrderHistory更好吗?


2
它应该总是归结为个人选择吗?如果有两个人在一个数据库设计中工作,那么一个人可能将表命名为复数,而另一个表命名为单数。是否有合理的理由说明为什么要使用SingularPlural
约翰·以赛亚·卡莫纳

2
@JohnIsaiahCarmona:增加了一个理由
GBN

3
我同意将单数作为最明智的选择。如果您在此处以及在SO等上查找类似的问题,这似乎不是流行的观点。很多人似乎都将表作为集合的程序员观点,因此应该具有复数名称。我认为,也许ORM可能开始打破这种(不良)习惯的人们。如果您的表以复数名称开头,则很难区分父级和子级导航属性以及表的实例和集合对象。
乔尔·布朗

4
支持单数的另一个原因是,如果您有一个规则,即以表名命名PK,例如TablenameIDor TablenameCodetablename_id。使用复数表名,您最终Orders.OrdersID会看到(看起来不正确),或者Orders.OrderID使用复数表名,但是将列前缀更改为单数。
ypercubeᵀᴹ

同样的观点
杰克·道格拉斯

8

关于单数或复数表名,该主题似乎有争议,但事实并非如此。

表是多个记录的集合,而表则以其包含的一种记录类型的定义命名。如果允许一个表的名称与其表所包含的记录类型的名称不同,则可以为该表赋予复数名称,例如,可以使一个Employees表包含多个Employee记录。但是SQL的设计者没有为表和记录类型提供单独的名称。

如果记录类型的名称(以及表名的扩展名)保持单数形式,则对于使用数据的面向对象程序来说,事情就更合乎逻辑了,因为它将与您用来描述一条记录的类的名称相对应。

如果随后要在程序中标识集合,则可以使用复数形式,或者更好的方法是使用适当的修饰符,例如EmployeeList或EmployeeArray。

用于自动代码生成的不规则复数以及具有不同语言背景或关于程序中的复数形式的思想的程序员也存在问题。

英语不是一种很好的编程语言,并且试图使数据库和程序语句符合英语,因为读取其中一条语句听起来更好,这是一个错误。


5

就像@gbn的答案一样,我认为这主要是个人喜好,就像他一样,我建议您做出的任何选择都应应用到所有地方(至少在该数据库中)。一致性是值得的。

但是,我更喜欢在SELECT陈述中复数听起来更好:

SELECT Id, Name, Status 
FROM   Persons
WHERE  Status <> 5  --5 meaning deleted

我的意思是,在这种情况下,至少有几个人在桌子上,其中有几个人还给了客户。


2
+ 1尽管从技术上说Person是People的复数,这是我使用单数的原因之一。某些ORM会自动为您创建表,并且您会遇到类似这种奇怪的情况,其中在语言上命名是不合逻辑的。
布朗斯顿先生

5

“订单”是保留字。“订单”不是

“用户”是保留字。“用户”不是

“会话”是保留字。“会话”不是

“结果”是保留字。“结果”不是

“相对”是保留字。“亲戚”不是

...

这些似乎很常见,可能会出现在业务线数据库中。复数单词作为关键词似乎不如单数单词常见。因此,使用复数表名以避免与SQL关键字冲突可能是有益的。


1
这太清楚了。只要远离保留词(单数或复数)即可。在调试可互换使用多个保留字的错误消息时,这确实有帮助。理想情况下,从应用程序领域中选择单词,使其与使用/用户更加相关。
Emacs用户

“太清楚了”是什么意思?
尼尔·麦圭根

1
这意味着不必要的更高开销来破译错误消息。例如,语法错误消息中的order by和order。或尝试调试身份验证错误消息中的用户。
Emacs用户

IMO PurchaseOrder,PortalUser,UserSession不仅比Order,User,Session好,因此在这种情况下,单数可能效果很好
John Jai

1

我相信SQL表应该具有复数名称。它读起来好多了。

记录表应该称为书籍。ORM应该使用相同的约定。Books对象是一个集合,并负责Books表中的所有记录。Book对象负责单个记录。

这使编码更加自然。

select name, publication_date from books where publication_date > '2000-01-01';

books = Books()
for book in books.get("publication_date >= '2000-01-01'"):
    print book.name

直到您必须在seep.get中为羊写东西时,才有意义。弯曲规则,要灵活。
Emacs用户

确实,某些容器是带有非复数形式的词,如名词-如“ access”。但可以使用以下方法进行修改:“用于访问中的access_record”。
dlink

看到链接对象使我有些生气。书籍和作者之间的链接表怎么样?“ BooksAuthors”的外观和声音听起来很恐怖,但是“ BookAuthor”的外观和声音听起来更好。然后,您会发现单词的后缀为奇数的复数形式(状态)或不规则名词(子代与子代)。IMO眼痛的世界!
1998年

嗨,@ blobbles的复数形式是BookAuthors,而不是BooksAuthors。因此它仍然很自然。BookPublishers,BookFormats等
DLINK

可读性始终很好,但与句子无关,与我们从中获取数据的地方无关。例如table.field,所以author.authorName完全可以。从作者表中获取authorName。当只有一位作者时,复数看起来也很糟糕。authors.authorName什么时候只有一位作者?更加令人困惑的imo。当然,现在我们已经取消了句子样式mysql_,有了更好的方法来访问数据,这当然会变得更好:)
James

1

经过几年的编程工作,我得出的结论是多元化是不必要的复杂性。我的观点是,根据KISS的哲学,程序员应出于时间和效率的原因,为所有问题寻求最懒惰和最简单的解决方案。因此,单数形式可以减少所有情况下所需的工作。


这个答案并没有真正在整个线程中添加任何内容!例如,您无法通过调用表“ order”来回答问题!就个人而言,当英语无法解决问题时,我会使用法语单词-ordre,groupe ... 始终使用表的注释字段来解释您的选择!但是,在真正重要的事情是有一个公约,并坚持下去
Vérace

它怎么不添加任何东西?我补充说,单数是较少的工作。如果您的意见与我的意见不同,请不要贬低我的意见。“订单”不是问题,问题是更复杂的多元化,而不是诸如“类别”之类的-s,我已经看到它以各种组合方式拼写错误,从而导致不必要的工作。
ColacX

0

这是非常个人的事情。我使用单数形式已有30年了。但我明白为什么人们喜欢复数。书籍-作者很有趣,因为我认为书籍作者没有错。一本书可以有一个或多个作者。并且作者可能已经写了一本书或多本书(例如合着)。这也取决于您如何处理多位作者撰写的书籍。我同意其他答案;选择一个并保持一致。关于保留字问题。我认为不难解决的名称并不难。用户-> app_user,会话-> app_session,订单->客户订单


0

我们从不同的角度看待事情,我认为两个阵营的识别依据是:

单数(“用户”)
在表名和表名表示容器的事实之间建立关联的人员。

因此,“用户容器”可以包含多行。

复数(“用户”)
不在表名和表名表示容器之间建立关联的人。当然,他们知道这是一个容器,但它的名称并不存在。

例如,
一个“鸡蛋纸箱”中可以有多个鸡蛋,但是这很明显,因为容器的名称中有提及,为多个鸡蛋提供了潜力。但是,使用单表名称“ user”时,名称中不包含容器引用。例如,“ user_container”对于喜欢复数名称的人来说可能是可以接受的。

我认为这也是因为多年的复数惯例和大多数在线教材中的惯例。


综上所述,我认为从技术上讲单数形式更准确,因为我们要命名单个容器,并且容器可以包含多个(或单个)行。
对于人们来说,这似乎是错误的,因为他们在思维上将表名链接到内容(多个行需要一个复数名称),而不是在思维上将命名容器链接到内容(一个容器允许多个)。

与往常一样,通常没有对与错,而更多的是适合什么情况,重要的是要与您选择的内容保持一致。

如果您只是在做项目,则没有真正的理由去做任何您认为最好或只是偏爱的事情。在开发团队中应用相同的方法,只是做出一致的决定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.