数据库命名约定

时间:2011-09-18 12:09:38

标签: php database-design naming-conventions

我一直遵循以下数据库命名约定。

  1. 所有表名的小写字母和复数。
  2. 表中的
  3. _(下划线)定义了与父表的关系。
  4. 列中的
  5. _(下划线)定义了外键。
  6. 由于我更喜欢​​使用表和列的描述性名称,我经常发现自己使用camelCasing来表示具有两个或更多单词并且没有定义任何关系的实体。例如。

    lastVisitIp
    lastVisitDate
    registrationDate
    
    坦率地说,我真的不喜欢使用camelCasing的想法,因为我觉得这样做有些难看,我不明白为什么。

    我想从专家那里了解在这种情况下您对列的命名有何看法?如果我使用Underscore(_)或任何其他替代品,我应该继续使用骆驼套管吗?

    P.S:我查看了Wordpress中使用的命名约定,他们使用(_) Underscore用于多种用途。 :)

    谢谢。

5 个答案:

答案 0 :(得分:3)

我发现复数可能会使某些事情变得复杂因为如果表名是“公司”,那么在用户表或“ies”的情况下可以是's'。所以最好一直坚持单数。同样在sql加入语句时我倾向于使用Users.user_id = Companies.owner_id而不是User.user_id = Company.owner_id错误,因为你必须始终关注's'和'ies'。

下划线是首选方式,因为列名可以由多个单词构成

is_user_registered_last_yearisUserRegisteredLastYear

你可以看到更多的字母表 更难读骆驼案。

答案 1 :(得分:2)

我很欣赏这是一篇旧帖子,但我想补充两分钱。

如果可能的话,数据库表应该被命名为复数表,但要尽量保持对它们的某种敏感性,以便名称表示内容,以便易于识别。

举例如下。

您的应用程序中有用户,您的模型将是User,因为它引用单个用户,数据库表将是users,因为它是各个用户的集合。现在说你有这些用户的配置文件,有一些选项可以命名这个,但我觉得非常合适。

  1. 您可能想要将此表命名为users_profiles,但在阅读时,这可能意味着一对多关系,因为它是用户个人资料。
  2. 你也可能想要命名这个表user_profile,这确实表明它是一对一的关系,但另一方面,它确实暗示这个表不是一个集合,而是一个单独的单个用户的个人资料。
  3. 相反,最好的命名约定是user_profiles,因为它是用户配置文件的集合,因为一个配置文件与一个用户相关。
  4. 在此个人资料表格中,您需要引用原始用户,因此您有一个名为user_id的列,而不是users_id,而是user_id。对于任何其他列名称,您应该尝试将其保留为单个单词,全部为小写。如果您无法使用单个单词命名此列,请将其视为变量并使用下划线命名。这是有益的,因为在你有多个第一个单词相同的列的情况下,它会创建一种暗示它们相关的子集合,这是正确的。

    下划线暗示一种关系是正确的,这就是为什么表被称为user_profiles,并且该字段被称为user_id,但是10次中有9次,你将没有关系在一个不是id的字段上,所以暗示的问题就消失了。

    上面提到总是使用单数,因为复数可能令人困惑。争论的焦点是复数可以sies结尾。值得注意的是ies确实以s结尾,所以这个问题用词不当。最重要的是,将表名保持为单数,实际上会产生更多的混淆,因为它不会立即暗示集合,它确实意味着表名可以以任何其他字母结尾。

    有些表的名称将隐含复数而不以s结尾。例如,这可能类似于user_history。此表名是一个完全可接受且易于识别的名称,因为历史记录默认为复数,此表包含用户的历史记录。

    不做的事

    • 混合下划线和案例。选择一个标准并遵循它,没有将CamelCase列与下划线结合使用,因为它可能会让人感到困惑并且看起来很混乱。
    • 将所有内容保持小写。不需要使用大写字母,因为它只会增加混淆,处理表和列名称,如口语或书面句子的提取,但显然用空心替换空格。

    从这里的所有回复中可以看出,有许多不同的选择,一些有优点,有些没有。这种特殊的方法是我虔诚地遵循的方法,据我所知,它是PHP中最常用的方法。它保持整洁,易于理解,很少,如果有的话,我看到一个表名,不知道它的作用。

    希望能有所帮助。

答案 2 :(得分:1)

保持一致

如果您打算使用前缀,请随处使用。如果要将外键用于另一个表,请在任何位置使用相同的列名。如果你要用下划线分隔单词,那就到处都这样做。

你如何构建你的命名约定取决于你,只要保持逻辑,所以当你几个月后回来时你知道这个表是做什么的。

我自己,我使用下划线,我到处都这样做,所以一切都有意义。

答案 3 :(得分:1)

我正在考虑昨天对我即将开始的一个新的大项目的想法,我得出了相同的结论:使用_来定义关系和FK,其他一切都是驼峰。一个例子:

party
partyPerson
partyOrganization
partyPerson_partyOrganization (how a person relates to an organization)
partyOrganizationLegal
party_address
party_contactMechanism
address
contactMechanism

如果你强调一切,那么很难发现什么是参考,什么不是。

我还认为你应该在任何地方使用单数名称(它更符合逻辑,更不容易让你迷惑)。

答案 4 :(得分:0)

您没有提到正在使用哪个SQL软件,但是由于您提到了WordPress,所以我猜想这主要适用于MySQL。

我想补充一下其他建议,建议表名全部使用小写字母,而不是camelCase。

虽然可以使用大写字符,但是在将数据库环境从UNIX-y更改为Windows时,或者更具体而言对不区分大小写的OS区分大小写时,您可能会陷入难以追踪的问题。

在Windows中将内容从远程数据库推送或拉到本地开发计算机时,通常会遇到这种情况。

有关此的更多信息,请参见MySQL手册:

为避免此类差异引起的问题,最好采用 一致的约定,例如始终创建和引用 使用小写名称的数据库和表。这个约定是 建议最大程度地提高便携性和易用性。

-https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html