MySQL是否有命名约定?

我是这样做的:

  1. 表名为小写,使用下划线分隔单词,并且是单数(例如,foofoo_bar等)。
  2. 我通常(并不总是)有一个自动增量PK.我使用以下约定:tablename_id(例如,foo_idfoo_bar_id等)。
  3. 当一个表包含一个外键的列时,我只需从它所来自的任何表中复制该键的列名。例如,假设表格foo_bar具有FKfoo_id(其中foo_idfoo的PK)。
  4. 在定义FKS以实施参照完整性时,我使用了以下内容:tablename_fk_columnname(例如,继续示例3,它将是foo_bar_foo_id)。由于这是表名/列名的组合,因此可以保证它在数据库中是唯一的。
  5. 我像这样排列列:PKS,FKS,然后按字母顺序排列其余的列。

有没有更好,更标准的方法来做到这一点?

162966 次浏览

值得庆幸的是,PHP开发人员并不像我所知道的一些开发社区那样是“骆驼案例偏执狂”。

你的会议听起来不错。

只要它们a)简单,B)一致-我看不出任何问题:)

附言: 就我个人而言,我认为5)是矫枉过正。

一致性是任何命名标准的关键。只要它是合乎逻辑和一致的,你就是99%。

标准本身是非常个人偏好-所以如果你喜欢你的标准,然后运行它。

直接回答你的问题——不,MySQL没有首选的命名约定/标准,所以使用你自己的命名约定/标准是很好的(你的似乎是合乎逻辑的)。

我首先要说的是:保持一致。

我认为你在你的问题中概述的惯例已经差不多了。不过有几条评论:

我认为第一点和第二点是好的。

第3点-遗憾的是,这并不总是可能的。考虑如何处理 foo_bar 的单个表,该表有 foo_idanother_foo_id 两列,这两个列都引用了foo 表的 foo_id 列。你可能要考虑如何处理这件事。不过,这是一个有点极端的情况!

第4点-与第3点类似。您可能希望在外键名的末尾引入一个数字,以满足多个引用列的需要。

第5点-我会避免这样做。它为您提供的功能很少,并且当您以后想要在表中添加或删除列时,它将成为一个令人头疼的问题。

其他几点是:

索引命名约定

您可能希望引入索引的命名约定-这将对您可能想要执行的任何数据库元数据工作有很大的帮助。例如,您可能只想调用索引foo_bar_idx1foo_idx1-完全由您决定,但值得考虑。

单数与复数列名

解决列名和表名中的复数与单数的棘手问题可能是个好主意。该主题经常在DB社区中引起大型辩论。对于表名和列,我将坚持使用单数形式。那里。我说过了。

这里最重要的当然是一致性!

MySQL对其或多或少严格的规则有一个简短的描述:

https://dev.mysql.com/doc/internals/en/coding-style.html.

Simon Holywell的MySQL最常见的编码风格:

http://www.sqlstyle.guide/.

见这个问题: 是否有任何已发布的SQL编码风格指南?

答案很简单:

好吧,至少Oracle或社区鼓励这样的命名约定,不,但是,基本上您必须知道遵循标识符的规则和限制,如MySQL文档中所示:https://dev.mysql.com/doc/refman/8.0/en/identifiers.html

关于您遵循的命名约定,我认为这是可以的,只是数字5有点不必要,我认为大多数用于管理数据库的可视化工具都提供了对列名进行排序的选项(我使用DBeaver,它有这个选项),因此,如果您的目的是对您的表进行很好的可视化演示,您可以使用我提到的这个选项。

根据个人经验,我推荐这家酒店:

  • 使用小写。当您将数据库从一台服务器迁移到另一台服务器时,这几乎可以确保互操作性。有时,lower_case_table_names没有正确配置,并且您的服务器仅仅因为无法识别您的CamelCase或PascalCase标准(区分大小写问题)就开始抛出错误。
  • 简称。简单明了。最容易和快速的是识别你的表或列,越好。相信我,当你在很短的时间内做了很多不同的查询时,写起来(和读起来)都很简单会更好。
  • 避免使用前缀。除非您为不同应用程序的表使用相同的数据库,否则不要使用前缀。这只会给您的查询增加更多的冗余。在某些情况下,这可能很有用,例如,当您想要标识主键和外键时,通常使用表名作为ID列的前缀。
  • 使用下划线分隔单词。如果您仍然希望使用多个单词来命名表格、列等,则使用下划线来表示分隔__单词,这有助于提高易读性(您的眼睛和紧张的大脑将会感谢您)。
  • 保持一致。一旦你有了自己的标准,就要遵循它。不要成为制定规则的人,也不要成为第一个违反规则的人,这是可耻的。

那“复数”和“单数”呢?命名?嗯,这主要是个人喜好的情况。在我的例子中,我尝试为表使用复数名称,因为我认为表是元素的集合或包含元素的包,所以复数名称对我来说是有意义的。以及列的单数名称,因为我将列视为以单数形式描述这些表元素的属性。

正如@Fabrizio-Valencia所说,使用小写。在Windows中,如果您导出MySQL数据库(phpMyAdmin),表名将转换为小写,这将导致各种 问题。 请参阅MySQL中的表名是否区分大小写?

一致性是每个人都强烈建议的,其余的取决于你,只要它能起作用。

对于初学者来说,很容易忘乎所以,我们在那个时候想说什么就说什么。这在当时是有意义的,但之后会让人头疼。

foofoobarfoo_bar过大。 我们尽可能直接地命名我们的表,并且只有当它们是两个不同的单词时才使用下划线。studentregistrationstudent_registration

正如@zbyszek所说,拥有一个简单的id对于自动增量来说已经足够了。越简单越好。为什么需要foo_id?我们在早期遇到了同样的问题,我们用表前缀命名所有的列。如foo_idfoo_namefoo_age。我们现在删除了表名,只保留尽可能短的COL.

由于我们只为PK使用一个ID,因此我们将使用foo_bar_fk(表名是唯一的,后面是唯一的PK,后面是_fk)作为外键。我们没有将id添加到COL名称中,因为据说名称“ ID ”始终是给定表的PK.因此,我们在末尾只有表名和_fk

对于约束,我们删除所有下划线,并使用驼峰式(表名+列名+FK)foobarUsernameFk(对于用户名_FK COL)进行连接。这只是我们遵循的一种方式。我们为每个名称和结构保留了一个文档。

在保持COL名称简短的同时,我们还应关注受限制的名称。

+------------------------------------+
|               foobar               |
+------------------------------------+
| id (PK for the current table)      |
| username_fk (PK of username table) |
| location (other column)            |
| tel (other column)                 |
+------------------------------------+