表命名困境:单数名称与复数名称 [已关闭]

Table Naming Dilemma: Singular vs. Plural Names [closed]

提问人: 提问时间:12/4/2008 最后编辑:7 revs, 2 users 63%ProfK 更新时间:5/29/2023 访问量:541711

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

10年前关闭。

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

我不喜欢任何需要在名称两边加上方括号的 T-SQL,但我已将表重命名为单数,永远判定使用该表的人有时不得不使用括号。Users

我的直觉是,使用单数更正确,但我的直觉也是括号表示不受欢迎的,例如带有空格的列名等。

我应该留下,还是应该离开?

sql-server 命名约定

评论

23赞 andygavin 9/22/2015
令我惊讶的是,更多的人没有说:这是由单行代表什么决定的。在单个数据库中,我可能有一个表,该表的行表示单个小部件,而另一个表与该表的一对多关系意味着行表示许多小部件。不这样做会失去表现力。
3赞 1/27/2017
我只想补充一点,在所有这些讨论中,请注意,表格的形状或形式绝不与类相同。表是特定类型的元素的集合,可以对单个属性进行排序、查询等。类是描述特定类型的属性和行为的框架。在 OO 编码术语中,表的关闭表示是对象的集合。(无论您使用什么 ORM)。这是迄今为止关于这个主题排名最高的谷歌答案,所以虽然问题已经关闭,但该页面仍然有价值。
1赞 Benny Code 9/8/2017
我会选择你所工作的生态系统的常见做法。例如:在 Node.js ORM 中,像 Bookshelf.js 或 Objection.js 这样的 ORM 主要基于 “Knex.js”。在“Knex.js”文档中,您将找到复数形式的表名。所以我会在那个领域选择复数。来源:knexjs.org/#Schema-createTable
2赞 Arindam 12/26/2018
是的,我同意。拥有一个用户表并将其命名为“AppUser”是有意义的,同时拥有一个适用于特定类型用户的规则表并将其称为“UserRules”也是有意义的
2赞 bitoolean 4/25/2019
@Arindam“UserRule”或“UsersRule”作为用户相关规则列表的名称听起来绝对不合适。现在,这是反对总是使用单数形式的有力论据!

答:

143赞 2 revsMichael Haren #1

什么约定要求表具有单数名称?我一直以为是复数名称。

用户将添加到“用户”(Users) 表格中。

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

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


正如其他人所提到的:这些只是指导方针。选择一个适合您和您的公司/项目的惯例并坚持下去。在单数和复数之间切换,或者有时缩写单词,有时不缩写单词,这更令人恼火。

评论

51赞 ProfK 12/5/2008
当将集合论应用于表时,集合中的任何实例都代表集合,因此 Apple 是一个 Apple 集合,它对集合中有多少个苹果是不可知的 - 它是一个具有许多实例的 Apple。当一个“袋子”的苹果包含许多苹果时,它不会变成一个“袋子”。
101赞 Christopher Mahan 1/3/2009
如果你有一个装有 5 个苹果的袋子怎么办?你称它为一袋苹果吗?还是一袋苹果?
26赞 Mark Brackett 4/4/2009
我认为理论上是这套被命名为苹果。一个单一的苹果仍然是“一组苹果”——尽管是一组只有一个实例的苹果。多个苹果也是“一组苹果”。
30赞 Ian Mackinnon 10/8/2010
@Christopher,如果袋子存在的理由是装苹果,而且只装苹果,那么它就是一个“苹果袋”,不管里面是1个苹果,还是100个苹果。
15赞 Christopher Mahan 10/8/2010
@Ian:那是因为桌子是通用的,可以比作一个集装箱(几乎可以包含任何东西,从苹果箱到哈雷戴维森摩托车箱)。你说:一个橙子的货物集装箱,而不是一个橙色的货物集装箱。你说:一个汽车配件的货柜,不是汽车配件的货柜。如果你做了一个自定义的数据结构,只保存特定类型的数据,比如苹果的名字,并将其命名为“kungabogo”,那么你可以有一个苹果kungaboko。我知道你在想什么,但首先想到一囊球,并理解含义的差异。
9赞 2 revsDave Markle #2

可能的替代方案:

  • 将表重命名为 SystemUser
  • 使用括号
  • 保留复数表名。

国际海事组织使用括号在技术上是最安全的方法,尽管它有点麻烦。IMO 这是一个 6 个,另一个是六个,您的解决方案实际上只是归结为个人/团队偏好。

评论

2赞 ProfK 12/5/2008
我喜欢你的“前缀”想法,但会称它为 SystemUser。
7赞 James Curran #3

我一直认为这是一个愚蠢的惯例。我使用复数表名。

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

评论

14赞 ProfK 12/5/2008
这个约定在ORM出现之前很久很久就已经是关系理论的一部分了。
2赞 barrypicker 9/15/2011
ORM 不应指定它们映射到的对象的名称。ORM 的要点是对对象的抽象,赋予了这种灵活性。
5赞 BenAlabaster #4

指导方针确实存在。这不是“一成不变的”,这就是为什么您可以选择忽略它们的原因。

我想说的是,使用复数表名在逻辑上更直观。毕竟,表是实体的集合。除了提到的其他替代方案外,我经常在表名上看到前缀......

  • tbl用户
  • tbl这个
  • tbl那
  • tblThe其他

我并不是说这是要走的路,我也看到我讨厌的表名中经常使用空格。我什至遇到过带有愚蠢字符的字段名称,例如?好像在说这个领域回答了一个问题。

评论

5赞 Dave Markle 12/4/2008
同意。空格和前缀来自魔鬼。
2赞 James Curran 12/4/2008
MSAccess 鼓励使用空格的表名。我怀疑空间中的许多MSSQL表都是从那里导入的。
4赞 Cruachan 12/4/2008
再次+1。以空格命名的表格和字段是神童 Office Junior 在帐户中为 Beryl 制作真正的 kool 访问应用程序的标志:-)。
1赞 BenAlabaster 12/4/2008
嘿,我喜欢账户中的绿柱石......但它永远不会导致我在表名中放置前缀或空格......它也不会导致我在我的字段名称中添加问号或感叹号。我不在乎她有多可爱。:P
3赞 ProfK 12/5/2008
TBL 作为前缀是 Devilspawn 和 Smelly Carrion 的儿子,但语义前缀要好一些。在我们的主应用程序中,我们 Chase Software 将所有表都以“ca”或“cs”作为前缀,即 chase 应用程序或 chase 系统。
9赞 Borzio #5

这可能有点多余,但我建议谨慎行事。并不一定是重命名表是一件坏事,但标准化就是这样;一个标准——这个数据库可能已经“标准化”了,无论:)多么糟糕——我建议一致性是一个更好的目标,因为这个数据库已经存在,而且它可能由不止 2 个表组成。

除非你能标准化整个数据库,或者至少计划朝这个目标努力,否则我怀疑表名只是冰山一角,专注于手头的任务,忍受命名不当的对象的痛苦,可能符合你的最大利益——

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

my2cents ---

3赞 friol #6

没有“约定”要求表名是单数。

例如,我们在评级过程使用的数据库上有一个名为“REJECTS”的表,其中包含从程序的一次运行中被拒绝的记录,我看不出有任何理由不为该表使用复数(将其命名为“REJECT”会很有趣,或者过于乐观)。

关于另一个问题(引号),它取决于 SQL 方言。Oracle 不需要在表名两边加上引号。

评论

1赞 Jimmy 12/4/2008
Sql Server 只需要保留关键字名称的大括号(“User”为一个)。我相信 Oracle 也有同样的政策
9赞 Chris #7

正如其他人在这里提到的,约定应该成为增加易用性和可读性的工具。不是作为折磨开发人员的枷锁或棍棒。

也就是说,我个人更喜欢对表和列都使用单数名称。这可能来自我的编程背景。类名通常是单数的,除非它们是某种集合。在我的脑海中,我正在存储或读取相关表中的单个记录,因此单数对我来说是有意义的。

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

我也尽量避免在表名和列名中保留字。在此所讨论的案例中,与 Users 的单数约定相反更有意义,以避免封装使用 User 保留字的表的需要。

我喜欢以有限的方式使用前缀(tbl 表示表名,sp_ 表示 proc 名等),尽管许多人认为这会增加混乱。我也更喜欢 CamelBack 的名字而不是下划线,因为我在输入名称时总是以 + 而不是 _ 结束。许多其他人不同意。

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

请记住,约定中最重要的因素是它对与相关数据库交互的人有意义。在命名约定方面,没有“一环统治所有人”。

评论

19赞 Will Dieterich 12/8/2008
忽略匈牙利符号的恐怖。永远、永远、永远不要在存储过程前面使用 sp_,因为 MS-SQL 将其用于系统存储过程并对其进行特殊处理。由于sp_存储在主表中,因此即使限定了位置,MS-SQL 也始终首先显示它们。
15赞 stephbu #8

我们运行类似的标准,在编写脚本时,我们要求 [ ] 围绕名称,并在适当的情况下使用架构限定符 - 主要是它对冲了你对 SQL 语法未来名称抓取的赌注。

SELECT [Name] FROM [dbo].[Customer] WHERE [Location] = 'WA'

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

评论

1赞 Kjetil S. 2/21/2019
似乎是仪式性的自我鞭笞。有没有发生过这样的抢名事件?
17赞 Eugene Yokota #9

我不喜欢复数表名,因为英语中的一些名词是不可数的(水、汤、现金),或者当你让它可数时,含义会发生变化(鸡对鸡;肉对鸟)。 我也不喜欢使用缩写来表示表名或列名,因为这样做会给已经很陡峭的学习曲线增加额外的斜率。

具有讽刺意味的是,我可能会因为 USER (Transac-SQL) 而破例并调用它,因为如果不需要的话,我也不喜欢在表周围使用括号。UserUsers

我还喜欢将所有 ID 列命名为 ,而不是 or(复数人对此有何看法?IdChickenIdChickensId

这一切都是因为我对数据库系统没有适当的尊重,我只是出于习惯和懒惰而重新应用了像 Java 这样的 OO 命名约定的一招制胜知识。我希望对复杂的 SQL 有更好的 IDE 支持。

评论

8赞 mpen 4/4/2009
我们复数的人要么像你一样将“id”列命名为“id”,要么命名为“singular_id”。我相信表应该是复数的(将它们想象成数组),但列名应该是单数的(单个元素的属性)。
0赞 hochl 10/5/2011
plu_ral/PluRal 表示表名,singular_id/singularId 表示主键。
266赞 Tom H #10

就“标准”而言,其他人给出了很好的答案,但我只是想补充一下......“用户”(或“用户”)是否有可能实际上不是对表中数据的完整描述?并不是说你应该对表名和特异性过于疯狂,但也许像“Widget_Users”(其中“Widget”是你的应用程序或网站的名称)这样的东西会更合适。

评论

9赞 MikeW 3/13/2009
我同意。OrgUsers、AppUsers,任何要避免使用关键字的内容。
8赞 OZ_ 9/27/2011
-1.表用户(以及国家/地区、语言)可以同时在几个应用程序中使用。
157赞 Zo Has 10/25/2011
关联架构名称不会消除所有混淆吗?AppName1.Users、AppName2.Users ?
10赞 2/11/2012
我不同意表前缀 - 这也许应该是一个模式?——但我同意一个“更具描述性的名字”。即使是像“AppUser”这样简单的东西也足够了,无需进入整个命名空间的争论。
34赞 Viliami 1/1/2017
这个被接受的答案更像是一个旁白,并没有回答这个问题。
1赞 dkretz #11

我通过将表命名为“Employee”(实际上是“Employees”)解决了同样的问题。我尽量远离任何可能与保留词的冲突。即使是“用户”对我来说也令人不舒服。

评论

1赞 stephbu 12/4/2008
挑战来了,你只在编写应用程序时才知道保留字 - 随着语言的增强,这个词池会随着时间的推移而漂移。用方括号限定一个单词作为名称是减轻这种痛苦的唯一方法。
0赞 dkretz 12/4/2008
以牺牲可读性为代价,这在 sql 语句中已经足够有问题了。
0赞 stephbu 12/4/2008
完全同意 - 关键字的 CAPS、名称的 Camelcase 等有助于改善这一点,但仍然会降低可读性。
2赞 ProfK 12/5/2008
员工可能并不总是用户。
2赞 dkretz 12/6/2008
不,所以对于这些情况来说,这是不合适的。但对于其他情况,也许还有另一个词(如“成员”、“人”等)可以让你避开“用户”,并且不太可能与某些东西发生冲突。
2赞 2 revsmarkus #12

如果您使用某些框架,例如 Zend Framework (PHP),那么对表类使用复数,对行类使用单数是明智的。

因此,假设您创建了一个表对象 $users = new Users() 并将行类声明为 User,您也可以调用 new User()。

现在,如果您使用单数作为表名,则必须执行类似 new UserTable() 的操作,该行为 new UserRow()。在我看来,这比仅仅为表设置一个对象 Users() 和为行设置一个对象 User() 对象更笨拙。

评论

2赞 Bill Karwin 12/4/2008
事实并非如此。Zend_Db不会对数据库表名、表类名或行类名强加命名约定。我自己删除了那个考虑不周的变形代码。
1赞 Bill Karwin 12/4/2008
但我确实支持表类名是复数,行类名是单数的约定。只是 Zend_Db 框架不强制执行任何约定。
1赞 markus 3/13/2009
刚刚重新访问了我的帖子并更正了它。的确,它没有强加任何东西。它只是暗示它。
0赞 Bruce Patin 12/1/2012
表没有类。映射到表的任何类实际上描述的是行,而不是表。与表的类的唯一对应关系是显式描述集合的对应关系。
4赞 Patrick Harrington #13

如果你去,会有麻烦,但如果你留下来,那将是双倍的。

我宁愿违背一些假定的非复数命名约定,也不愿以可能是保留词的东西来命名我的表。

14赞 2 revs, 2 users 67%Michel #14

服务器本身的系统(、、、等)几乎总是复数的。我想为了保持一致性,我会跟随他们的脚步。tables/viewsSYSCAT.TABLESdbo.sysindexesALL_TABLESinformation_schema.columns

评论

0赞 Bruce Patin 12/1/2012
Microsoft之所以如此,首先是出于商业原因(通常是不道德的原因),最后是逻辑原因。我关注他们的唯一原因是他们是大猩猩,其他人都走这条路。当我有选择时,我会选择另一种方式。
4赞 Paulo Freitas 5/29/2018
应该注意的是,这是 SQL 标准 ISO/IEC 9075-11 的一部分。是的,它确实使用复数表/视图名称。information_schema
34赞 2 revs, 2 users 71%Paulo Freitas #15

我也会选择复数形式,对于前面提到的用户困境,我们确实采用了方括号方法。

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

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

评论

11赞 Jason 3/13/2012
我同意。。为什么代码和存储不一致?我永远不会在代码中将用户对象的集合命名为“User”......那么我为什么要这样称呼表呢?这毫无意义。当我读到上面关于它的论点时,他们关注的是实体,而不是表......在我看来,表格中的内容与表格本身是有区别的。
3赞 Jake Wilson 2/16/2016
您如何处理表名,就像其他表具有称为的引用字段一样?虽然它的拼写正确,但对于那些对表命名约定挑剔的人来说,它似乎不一致。companiescompany_id
2赞 David 1/5/2018
通过记住单数 是 ,并且此 id 是对单数项的引用。它不应该在代码中打扰我们,就像在英语中打扰我们一样。companiescompany
0赞 Datz 6/22/2022
过去,我经常看到代码中的复数形式是出于这个原因。但这将不再适用于执行拼写检查😉的 IDEcompanycompanys
282赞 Brian Boatright #16

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

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

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

我发现一个不符合我使用的新命名的表是 UsersInRoles。但是总会有这几个例外,即使在这种情况下,它看起来也很好,就像 UsersInRoles.Username 一样。

评论

61赞 joshperry 8/21/2010
我投了反对票,我会告诉你为什么,因为我不同意。ORM 的本质是关于映射的。我曾经使用过的每个 ORM 工具都支持指定用于实体的表名,当它与实体的名称不同时。这很重要,因为我们映射到关系数据库的全部原因是,我们可以轻松地使用与对象模型不同的形状进行临时查询和报告。否则,我们现在都只会使用对象/文档数据库。
34赞 barrypicker 9/15/2011
ORM 不应指定它们映射到的对象的名称。ORM 的要点是对对象的抽象,赋予了这种灵活性。
24赞 John Nicholas 5/1/2012
在我的世界里,我尝试在整个项目中使用一致的名称,以避免浪费时间想知道这个实例的末尾是否有 s。事实上,ORM 可以重命名并独立,但这并不意味着这样做可以帮助你的开发人员同事。
3赞 tinonetic 2/15/2015
一些 ORM(像许多编程工具一样)具有默认行为,无需配置即可生成实现......以生产力为卖点。因此,默认情况下,在没有显式映射的情况下创建 Employee 类将生成一个 Employee 表
3赞 Samuel Danielson 2/24/2017
@barrypicker。复数名称在 ORM 代码中不仅看起来很愚蠢。复数在 SQL 中看起来也很糟糕,尤其是在引用唯一属性时。谁从未写过从用户那里选择 user.id?或者也许......从用户离开加入 thingy.user_id = user.id...?
46赞 2 revs, 2 users 78%Paulo Freitas #17

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

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

它确实有助于多元化脱颖而出,我可以轻松且有程序地确定事物的集合会是什么样子。

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

评论

8赞 Anthony 8/28/2009
以“s”结尾的单词呢?如果你有一个名为“新闻”的表(仅举个例子),你会怎么称呼新闻集合?新闻?或者你会称这张表为“新”吗?
20赞 Ash Machine 8/29/2009
我将表称为 NewsItem 和集合 NewsItems。
5赞 Hamish Grubijan 6/8/2010
如果您必须对所有代码进行拼写检查,否则它将无法编译;)怎么办?
3赞 barrypicker 9/15/2011
ORM 不应指定它们映射到的对象的名称。ORM 的要点是对对象的抽象,赋予了这种灵活性。
20赞 Valentino Vranken 2/8/2012
然后@HamishGrubijan停止使用 Word 编写代码!;)
73赞 2 revsAdam Carr #18

我坚信,在实体关系图中,实体应该用单数名称来反映,类似于类名是单数。实例化后,该名称将反映其实例。因此,对于数据库,当实体变成表(实体或记录的集合)时,实体是复数的。Entity, User 被制作成表 Users。我同意其他人的建议,也许可以将名称 User 改进为 Employee 或更适用于您的方案的名称。

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

评论

4赞 hochl 10/5/2011
我特别喜欢SQL语句注释。在这里使用单数对读者来说并不直观。
2赞 William T. Mallard 5/9/2014
关于ERD的好点。我怀疑这就是为什么,对于一个通过DBA眼睛看世界的人来说,单数命名是有意义的。正如你所指出的,我怀疑他们不明白实体和它们的集合之间的区别。
2赞 rich remer 9/22/2016
表不是记录的集合;表是记录外观的定义。这就是所有复数/单数的人似乎都有的脱节。
1赞 Harley 7/8/2019
一个old_lady有很多猫,或者old_ladies养猫。我认为 ERD 读起来更像复数。还有实体表,表有很多实体,所以我认为复数听起来不错。
2赞 Rich Remer 8/21/2021
查找关系数据库术语,以及为什么我们应该使用“关系”一词而不是“表”。
21赞 chaos #19

单数。我将包含一堆用户行表示对象的数组称为“users”,但该表是“用户表”。认为该表只不过是它所包含的行的集合是错误的,IMO;表是元数据,行集是分层附加到表上的,它不是表本身。

当然,我一直在使用 ORM,它有助于用复数表名编写的 ORM 代码看起来很愚蠢。

评论

0赞 Bill Karwin 1/4/2009
我猜每个人都有自己的。根据定义,关系数据库表是一个标题(即命名属性的元数据)和一组与标题匹配的元组。您可以专注于元数据,而其他人则专注于元组。:-)
0赞 Camilo Martin 5/9/2010
嘿,User_Table是我喜欢的名字!:)
5赞 barrypicker 9/15/2011
ORM 不应指定它们映射到的对象的名称。ORM 的要点是对对象的抽象,赋予了这种灵活性。
2赞 Jason 3/13/2012
我是这样看的..如果你在代码中创建任何内容的数组/列表/字典,我敢打赌,你用它所包含的任何内容的复数名称来命名它。如果你使用 ORM 来抽象你的数据库,表是用某种集合来表示的,那么你为什么要对它们有任何区别呢?使用单数名称听起来不错,但你总是在与自己的直觉作斗争,即一个表包含许多相同的东西,就像代码中的集合一样。为什么不一致?
1赞 maaartinus 5/5/2018
@barrypicker 语法不应该决定编程约定(你知道java bean是/变得愚蠢吗?只要它不成为现实,就应该遵循它。在需要的情况下,可以在 ORM 中使用不同的映射。语法是不规则的,像“矩阵”与“矩阵”这样的东西是罕见但有力的例子,说明为什么代码不应该被它感染。
12赞 Shane Delmore #20

我是单数表名的粉丝,因为它们使我使用 CASE 语法的 ER 图更易于阅读,但通过阅读这些响应,我感觉它从来没有很好地流行起来?我个人很喜欢它。有一个很好的概述,其中包含一些示例,说明当您使用单个表名、向关系添加动作动词以及为每个关系形成好句子时,模型的可读性如何。对于一个 20 个表的数据库来说,这有点矫枉过正,但如果你有一个包含数百个表和复杂设计的数据库,如果没有一个好的可读图表,你的开发人员将如何理解它?

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

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

评论

1赞 Kenny Evitt 11/9/2010
在对象名称前面加上“type”限定符的陷阱的好例子!
5赞 2 revs, 2 users 83%nicruo #21

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

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

-- Select every fields from 'user' table
SELECT * FROM user

我需要 21 岁的用户姓名:

-- Select every fields from 'user' table which have 21 years old
SELECT * FROM user WHERE age = '21'

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

评论

3赞 cosbor11 6/20/2015
我不同意;在 oracle 数据库中,有一个名为 USER 的系统表,现在您必须决定将其称为“APP_USER”或类似的东西。但是,鉴于无论如何说“SELECT ALL FROM USERS”听起来更好,我只将所有表命名为我的实体的复数形式,以免与任何系统表冲突。
3赞 Thupten 7/15/2015
我喜欢select from or ,但不喜欢。使用单数,听起来您只得到一张唱片。我看到你喜欢从表中选择列。大多数人喜欢认为 select 从表中返回行,因此集合名称听起来很合乎逻辑。usersuserTableuser
1赞 Mike M. 12/12/2015
我会给你我的 2 美分,你的数据库表是由 1 行还是多行组成?这就像在说:我两只手里有五个苹果。然而,我们俩都同意正确的短语是:我双手里有五个苹果。为什么我们要改变数据库的这个问题?一旦您将“userTable”指定为名称,我们就有 1 个表,它实际上已经定义了多个数据行的存在。但是,我也不会坚持这样做。我宁愿说用复数。由于 age = '21' 很可能会返回超过 1 行,不是吗?
2赞 Melroy van den Berg 1/26/2016
单数是标准。
1赞 Kelsey Hannan 1/26/2018
看看像 Rail 的 ActiveRecord 这样的应用语言。它严格执行表名为复数,其对象实体为单数的分离。遵循这个约定会产生很多令人惊奇的东西,而你不遵循它正在伤害你的应用程序团队即将对他们的系统进行推理。
112赞 3 revs, 3 users 83%james #22

举个简单的例子怎么样:

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

与。

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

后者中的SQL听起来比前者更奇怪。

我投票给单数

评论

72赞 Michael Haren 8/22/2009
在那个例子中,是的,但在实际的 sql 中,它永远不会以这种方式编写。你会有一个表别名,所以它更像是SELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def'
35赞 jamiegs 4/6/2011
我认为sql听起来更好。你不会有每列的表名,为什么你这么喜欢打字。SELECT Name, Address FROM Customers WHERE Name > “def” 您正在从名称大于 def 的客户池中进行选择。
7赞 James Hughes 6/16/2011
使用别名/AS 来解决这个问题怎么样?SELECT Customer.Name, Customer.Address FROM Customers AS Customer WHERE Customer.Name > “def”
4赞 HLGEM 8/30/2013
第二个听起来好多了,单数听起来像一个不会说英语的人。
1赞 Marco 10/1/2019
我知道这已经很老了,但如果你仔细想想,它是从客户表中选择每个客户的姓名、客户的地址。通过使用复数,您将始终记住它将是一个返回的集合,即使此集合仅包含一个项目。
52赞 4 revs, 2 users 64%Gulzar Nazim #23

恕我直言,表名应该是复数形式,如 Customers

如果类名映射到 Customers 表中的行,则类名应为单数,如 Customer

3赞 2 revs, 2 users 80%Vinz #24

我总是使用单数表名,但如前所述,最重要的是保持一致,并对所有名称使用相同的形式。

我不喜欢复数表名的一点是,组合名称可能会变得很奇怪。例如,如果您有一个名为 的表,并且想要存储用户的属性,这将产生一个名为 ...UsersUsersProperties

评论

5赞 Mark A. Donohoe 7/9/2015
不,它实际上被称为“UserProperties”,因为它们是存储在表中的用户对象(行)的属性,而不是用户本身的属性。说“UsersProperties”意味着它们是用户表的属性(即 RowCount、MaxRows 等),而 UserProperties 明确表示与用户相关的属性(即 UserName、Age、SSN 等)。
15赞 Andrew #25

表:复数

用户表中列出了多个用户。

模型:单数

可以从 users 表中选择单个用户。

控制器:复数

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

无论如何,这就是我的看法。

评论

1赞 ProfK 11/26/2009
更接近我的看法,但我的观点是,表对多个用户的存储实际上是偶然的,任何单个用户都由表表示,或者更确切地说,关系是表示用户实体的一组元组。
0赞 4/5/2020
我想我倾向于同意这一点。唯一让我感到困惑的是,为什么模型应该是单一的?仅当模型仅涉及单个用户时。如果我要查询数据库以获取所有用户,那么我是否需要访问该模型?单个实例获取所有记录是没有意义的,例如: $user->get_all() //没有意义
8赞 helloworlder #26

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

我想我目前倾向于单数,因为英语中的复数不规则。在德语中,由于没有一致的复数形式,情况更糟——有时你无法判断一个单词是否是复数,而它前面没有指定的冠词(der/die/das)。反正汉语中没有复数形式。

评论

0赞 Marco 10/1/2019
在大学里,我被教导表的复数形式,我这里也有一本书,90年代的DB管理第三版,表是单数的;虽然我还有一个更新的副本,11e,单数和一些缩写名称,而XML部分使用复数。\n 但是,如果您检查 RDBMS 部分的实际内容,它实际上仍然是相同的文本,有些图像已经改头换面。\n “数据建模清单”没有说明复数与单数,只是实体应该只映射到单个对象,这可能是他们试图在书中强制执行的。
23赞 2 revs, 2 users 50%Randy #27

实际上,我一直认为使用复数表名是流行的惯例。在此之前,我一直使用复数形式。

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

一张汽车表的名称为汽车,每一行都是一辆汽车。我承认,以某种方式指定表和字段是最佳实践,并且使用单数表名更具可读性。但是,在以下两个示例中,前者更有意义:table.field

SELECT * FROM cars WHERE color='blue'
SELECT * FROM car WHERE color='blue'

老实说,我将重新考虑我在这个问题上的立场,我将依赖我正在开发的组织使用的实际约定。但是,我认为出于我个人的惯例,我将坚持使用复数表名。对我来说,这更有意义。

评论

9赞 Sap 7/14/2011
这不也是 RoR 中的惯例吗?表的复数名称和 ORM 类的单数名称?这对我来说很有意义。表之所以被称为“汽车”,是因为它有许多“汽车”的实例,而类之所以被称为“汽车”,是因为它将容纳一个汽车的实例!
0赞 asgs 10/10/2016
@Sap 对句子后半部分的细微更正 - 类“Car”是表示现实生活中汽车的抽象数据类型。它是保存一个实例还是多个实例取决于它的使用方式。
0赞 Toskan 1/4/2017
让我们面对现实吧,桌子是单车结构的定义。如果你看一下表格的结构,它基本上会吐出“id int, color string etc”,此外:假设你有一个带有外键的表(或者对于你的复数版本,它会是)?!那是什么愚蠢的狗屎?没有必要让我思考。我强烈偏爱单数carcar_vendorcars_vendorcars_idcar_id
4赞 arnoudhgz 1/6/2017
我真的很喜欢这个答案!让我解释一下。如果集合是,并且您想要 that 中的所有内容,则结果应该是这样的。然后它变得令人困惑,因为所有结果都来自 .所以表名应该是(或者,随心所欲)carcarbluetire, mirror, enginepartscarcarpartscar_partsCarParts
0赞 Kelsey Hannan 1/26/2018
任何强制使用单一表名的数据库设计者基本上都是在向任何将来可能接触到该数据库的 Ruby on Rails 应用程序开发人员宣战。Rail 严格坚持类使用单数词,表使用复数名称,这使得 Ruby 生态系统中的许多 gem 中都具有许多强大的行为。因此,即使你认为单数听起来更好,为了兼容性,你也应该坚持使用复数。我想这也适用于许多其他对象关系映射器。
317赞 2 revs, 2 users 80%Ian Mackinnon #28

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

对表名的编号进行变形会导致正字法问题(正如许多其他答案所示),但选择这样做是因为表通常包含多行,在语义上也充满了漏洞。如果我们考虑一种基于大小写来屈折名词的语言,这一点会更加明显(就像大多数人所做的那样):

既然我们通常会对行做一些事情,为什么不把名字放在宾格中呢?如果我们有一个表,我们写的比我们读的多,为什么不把名字放在格里呢?这是一张桌子,为什么不使用属格呢?我们不会这样做,因为表被定义为一个抽象容器,无论其状态或用法如何,它都存在。在没有精确和绝对的语义原因的情况下对名词进行屈折是胡言乱语。

使用无屈折名词是简单的、合乎逻辑的、有规律的和独立于语言的。

评论

49赞 4/23/2013
这可能是我见过的关于这个主题的最合乎逻辑的论点,让我很高兴我花了那段时间在拉丁语上。+1 当然。
90赞 TJ Biddle 5/21/2013
好吧,我显然需要增加我的词汇量。
23赞 OCDev 10/27/2013
+1 看,这些是互联网更需要的答案。无可挑剔的证明,使用丰富的词汇来执行完美的逻辑。
14赞 Caltor 8/4/2015
下次我用拉丁语编程时,我会注意到这一点。同时,用户将进入 users 表,客户将进入 customers 表。
11赞 Stuart 8/21/2015
深信不疑——不屈不挠。有趣的是,经过这么长时间,“单数”和“复数”的流行选择是错误的!
13赞 2 revs, 2 users 67%Just Some Guy #29

我一直使用单数,因为这是我被教导的。然而,在最近创建一个新模式时,很长一段时间以来,我第一次主动决定保持这个约定,仅仅是因为......它更短。在我看来,在每个表名的末尾添加一个“s”就像在每个表名前面添加“tbl_”一样无用。

42赞 2 revs, 2 users 80%Jacob Lorensen #30

单数。我不相信任何涉及哪个最合乎逻辑的论点——每个人都认为自己的偏好是最合乎逻辑的。不管你做什么都是一团糟,只要选择一个惯例并坚持下去。我们试图将具有高度不规则语法和语义(正常口语和书面语言)的语言映射到具有非常特定语义的高度规则(SQL)语法。

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

因此,该关系告诉哪些实体是 .AppUserAppUsers

这种关系告诉我哪些实体是AppUserGroupAppUserGroups

关系告诉我 和 是如何相关的。AppUser_AppUserGroupAppUsersAppUserGroups

这种关系告诉我如何和是相关的(即组的成员)。AppUserGroup_AppUserGroupAppUserGroupsAppUserGroups

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

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

我喜欢把它看作是凌乱的,但系统性的——这样一来,我想要表达的关系总是有一个系统生成的名称,这对我来说非常重要。

评论

4赞 Alexandre Martini 12/4/2014
完全。许多人在这里不知道的主要事情是他们在命名什么......您正在为关系(表中的单个记录)命名,而不是为表中的记录集命名。
3赞 Mark A. Donohoe 7/9/2015
不能再不同意了。'从名称如'J%'的用户中选择*,因为我选择的是名称以'J'开头的所有用户。如果你的论点是你想写“......User.Name 喜欢的地方......”然后只需使用别名即可。我说'从所有可用的袜子中给我一双'的原因是一样的。
0赞 Manuel Hernandez 5/3/2017
如果我是那么特别,我的表名将是sock_pair
0赞 Nuno André 3/21/2020
@AlexandreMartini 没错。就像有些人将表中的单个记录称为“关系”一样。
2238赞 11 revs, 10 users 84%Nestor #31

我有同样的问题,在阅读了这里的所有答案后,我绝对会留在 SINGULAR,原因:

原因 1(概念)。你可以把装苹果的袋子想象成“AppleBag”,不管是包含0个、1个还是一百万个苹果,它总是同一个袋子。表就是这样,容器,表名必须描述它包含的内容,而不是它包含多少数据。此外,复数概念更多的是关于口语(实际上是为了确定是否存在一种或多种)。

原因 2.(方便)。用单数名称比用复数名称更容易。对象可以有不规则的复数形式,也可以根本不是复数形式,但总是有一个单数形式(除了少数例外,如新闻)。

  • 客户
  • 次序
  • 用户
  • 地位
  • 新闻

原因 3.(审美与秩序)。特别是在大纲-细节方案中,这读起来更好,按名称更好地对齐,并且具有更多的逻辑顺序(主控在前,细节在后):

  • 1.订单
  • 2.订单明细

相比于:

  • 1.订单详情
  • 2.订单

原因 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 = 103

您已经保存了 3 个字母、3 个字节、3 次额外的键盘点击:)

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

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

或者使用臭名昭著的方括号 [User]

评论

803赞 Chris Ward 2/6/2012
我敢打赌,如果你在袜子抽屉上贴上标签,你会称它为“袜子”。
90赞 Nestor 2/14/2012
当然可以。很难找到一个适合所有人和所有人的标准,重要的是它适合你。这对我有用,在这里我已经解释了原因,但同样,这对我来说是,我觉得它非常方便。
597赞 Kyle Clegg 7/26/2012
更大的问题是,Chris,为什么在命名袜子抽屉时要遵循数据库命名约定?
111赞 Jason 10/9/2012
这个答案需要更多的赞美。它讨论了一堆实际原因,我应用这些原因来解释为什么我更喜欢单数名称。关于集合的适当语言的替代讨论只是哲学上的,并且模糊了真正的意义。单数效果更好。
381赞 jlembke 4/12/2013
我家里有一个“袜子”抽屉,而不是“袜子”抽屉。如果它是一个数据库,我会称它为“Sock”表。
9赞 jleviaguirre #32

我的看法是语义取决于你如何定义你的容器。例如,“一袋苹果”或简称为“苹果”或“苹果袋”或“苹果”。

例: “college”表可以包含 0 个或多个学院 “学院”表可以包含 0 个或多个学院

a "student" table can contain 0 or more students 
a table of "students" can contain 0 or more students.

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

3赞 Red #33

TABLE 名称是表结构的一个定义。 VIEW 或 QUERY 名称是(一个或多个)表的视图或查询的一个定义。 TABLE、VIEW 或 QUERY 可能包含以下内容之一:

0 条记录 1 条记录 许多记录。

你到底为什么要在单个对象名称的末尾加上一个“s”? 通过将这个“s”放在对象名称的末尾,您想表示什么?

如果要区分,请添加“_tbl”。 视图是“_vew”(不是愚蠢的“_v”约定)。

至少 3 个字符的后缀 - 这会阻止此讨论。

表是一个数据库对象 - 与其他任何对象没有什么不同。

保存 3 个字符除了含义清晰之外什么也没保存。

红色 ;-)

评论

5赞 ProfK 5/28/2012
添加“Table”比添加“_tbl”要难多少?
0赞 Bruce Patin 12/1/2012
为了更清楚起见,表定义实际上是一个潜在行的定义。
1赞 Mark A. Donohoe 7/9/2015
根据你自己的定义,你给两个不同的东西起了同样的名字......将放置在表中的对象,以及保存这些对象的表。如果我说 Car,我指的是表还是该表中的记录?如果我说汽车,很明显我的意思是容纳零个或多个汽车物体的东西。使用复数可以正确地将物品与持有它们的事物区分开来。如果你说CarTable,那是单数的。但是如果没有后缀“table”,你必须给它起一个名字来代表它所包含的内容。“袜子抽屉”(单数)上有标签(名称)“袜子”。
8赞 bobby #34

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

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

15赞 2 revs, 2 users 85%Richard #35

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

Oracle 的系统表以 命名。尽管其中一些是复数。 Oracle 建议对用户定义的表名使用复数形式。 他们推荐一件事并遵循另一件事没有多大意义。 这两家软件巨头的架构师使用不同的约定来命名他们的表,也没有多大意义......毕竟,这些家伙是什么......博士?singular

我记得在学术界,这个建议是单一的。

例如,当我们说:

select OrderHeader.ID FROM OrderHeader WHERE OrderHeader.Reference = 'ABC123'

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

评论

2赞 Bruce Patin 12/1/2012
Microsoft之所以如此,首先是出于商业原因(通常是不道德的原因),最后是逻辑原因。我关注他们的唯一原因是他们是大猩猩,其他人都走这条路。当我有选择时,我会选择另一种方式。
1赞 Mark A. Donohoe 7/9/2015
两件事。第一,您通常不会使用表名,而是会写“select ID FROM OrderHeaders WHERE Reference = 'ABC123',因为您正在”从 OrderHeaders 中选择所有 ID,其中某些内容为真“,但如果由于连接或其他原因而不得不使用表名,则可以使用这样的别名......'select OrderHeader.ID FROM OrderHeaders as OrderHeader WHERE OrderHeader.Reference = 'ABC123'
6赞 3 revsSorgfelt #36

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

评论

1赞 Mark A. Donohoe 7/9/2015
不,表的 SQL 定义是该表中所有行的定义,而不是您所说的一个潜在行。举个例子,如果我说这个周末对一个潜在约会的描述是红发女郎,那么使用你的定义,这并不意味着我不能和黑发女郎一起出去。然而,如果说本周末所有潜在的日期都是红发女郎,那就排除了这一点,而这正是一张桌子的作用。它限制所有行以匹配该描述,或者换句话说,它是所有行的描述 - 单词“rows”是复数,因此表也应该是复数。
0赞 Bruce Patin 11/4/2017
扩展这个想法,定义中的每一列也应该是复数。
0赞 Mark A. Donohoe 11/4/2017
我知道你是怎么到达那里的,但我认为那是因为你把柱子看作一个容器,但事实并非如此。换句话说,列只是用于存储行属性的元数据。列式数据本身不存在于行之外,因为行是它的存储位置。当您查询列时,您正在查询该列数据的行。您不是自动查询列。行是实体。该表是这些实体的集合。列只是该实体上的一个属性。
0赞 Bruce Patin 11/8/2017
我很有面子。表可能包含行的集合,但表定义不是集合的定义,而是表行的定义,因此必须是单数。如果您开始将表定义转换为处理它的程序的类定义,那么所有这些都将非常清楚。
12赞 Bruce Patin #37

我曾经在用户表中使用过“Dude”——同样短的字符数,与关键字没有冲突,仍然是对通用人类的引用。如果我不担心那些可能看到代码的闷闷不乐的头脑,我会保持这种状态。

评论

1赞 puerile 1/22/2022
你刚刚给了我一个主意!不。
0赞 Can Rau 2/21/2023
哈哈我喜欢它,只是它不那么通用和包容,尽管我知道有很多人对女人说伙计,但不一定每个人都😉如此
7赞 jerseyboy #38

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

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

26赞 someone #39

我个人更喜欢使用复数名称来表示一个集合,它只是“听起来”更适合我的关系思维。

此时此刻,我正在使用单数名称来为我的公司定义数据模型,因为大多数工作人员都对它感到更舒适。 有时,您只需要让每个人的生活更轻松,而不是强加您的个人喜好。 (这就是我最终进入这个线程的方式,以确认命名表的“最佳实践”)

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

我喜欢我的蜂蜜煎饼,不管大家最喜欢的口味是什么。但是,如果我为其他人做饭,我会尝试为他们提供他们喜欢的东西。

评论

0赞 noonex 8/2/2015
在关系模型世界中使用这种约定是不明智的,尤其是当你描述对象之间的关系时,例如“每个团队可能只有一个主教练和许多辅助教练”,它被描述为: Team->MainCoach , Team->>SecondaryCoach
3赞 Angelin Nadar #40

在寻找好的命名方式时,会出现以下混淆,我应该命名:

1) 根据表所包含的内容,例如:用户表。它总是复数的。所以,用户

2) 根据记录所包含的内容,例如:用户表中的记录将是一个用户。所以,用户

现在,主要users_roles的问题。 案例 1:根据第一个命名约定,users_roles 这个名字意味着什么,用户及其角色。

案例 2:根据第二命名约定,user_role 这个名字意味着什么,用户和他的角色。

好的命名约定是提供实体关系的额外概念,尤其是在存储多对多关系时

在这里,根据场景,我们应该标识为信息集。

在 users 表中,形成的所有集合都是唯一的用户。 在“角色”(Roles) 表格中,形成的所有集合都是唯一的角色。 在用户和角色关系表中,可以形成具有不同角色的用户集,从而给出存储的一对多关系的概念。

I would prefer,
Users table => user
Roles table => role
users role relationship table => user_roles
4赞 4 revs, 3 users 90%hmartinezd #41

两个网站上都有不同的论文,我认为你只需要选择你的立场。就我个人而言,我更喜欢 Plurar 进行表命名,当然也更喜欢单数进行列命名。

我喜欢你如何阅读这个:

SELECT CustomerName FROM Customers WHERE CustomerID = 100;

实际上,我们有OOP,而且很棒,但大多数人继续使用关系数据库,没有对象数据库。无需遵循关系数据库的 OOP 概念。

另一个例子,你有一个表 Teams,它保留了 TeamID、TeamColor 和 PlayerID,并且对于一定数量的 PlayerID,将具有相同的 teamID 和 TeamColor......

球员属于哪支球队?

SELECT * FROM Teams WHERE PlayerID = X

所有来自X队的球员?

SELECT * FROM Players INNER JOIN Teams ON Players.PlayerID = Teams.PlayerID WHERE Teams.TeamID = X

这一切对你来说听起来不错?

无论如何,还要看看 W3Schools 使用的命名约定:

http://www.w3schools.com/sql/sql_join_inner.asp

评论

1赞 Nuno André 3/21/2020
听起来联赛数据库需要一些规范化,但我同意你的观点。