是否有MySQL的命名约定?

时间:2011-10-26 06:08:38

标签: mysql naming-conventions mysql-workbench

我是这样做的:

  1. 表名是小写的,使用下划线来分隔单词,并且是单数的(例如'foo','foo_bar'等。
  2. 我一般(并非总是)有自动增量PK。我使用以下约定:tablename_id(例如'foo_id','foo_bar_id'等)。
  3. 当表包含作为外键的列时,我只是从它来自的任何表中复制该键的列名。例如,假设表'foo_bar'具有FK'foo_id'(其中'foo_id'是'foo'的PK)。
  4. 在定义FK以强制执行参照完整性时,我使用以下内容:tablename_fk_columnname(例如,进一步示例3,它将是'foo_bar_foo_id')。由于这是表名/列名组合,因此保证在数据库中是唯一的。
  5. 我点这样的列:PKs,FKs,然后按字母顺序排列其余列
  6. 有更好,更标准的方法吗?

7 个答案:

答案 0 :(得分:90)

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

我认为你几乎已经有了你在问题中概述的约定。但有几条评论:

我认为第1点和第2点都很好。

第3点 - 遗憾的是,这并不总是可行的。考虑一下如何处理列foo_barfoo_id的单个表another_foo_id,这两个列都引用了foofoo_id列。您可能想要考虑如何处理这个问题。这虽然是一个小问题!

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

第5点 - 我会避免这种情况。当你想在以后添加或删除表中的列时,它会为你提供很少的东西,并且会变得很头疼。

其他一些观点是:

索引命名约定

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

奇异与多列名称

在列名和表名中解决复数与单一的棘手问题可能是个好主意。此主题通常会导致数据库社区中出现big debates。我会坚持使用表名和列的单数形式。那里。我说过了。

这里的主要内容当然是一致性!

答案 1 :(得分:17)

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

标准本身就是个人偏好 - 所以如果你喜欢你的标准,那么就用它来运行。

直接回答你的问题 - 不,MySQL没有首选的命名约定/标准,所以滚动你自己就好了(你的看似合乎逻辑)。

答案 2 :(得分:7)

MySQL对其或多或少严格的规则进行简短描述:

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

Simon Holywell最常用的MySQL编码方式:

http://www.sqlstyle.guide/

另见这个问题: Are there any published coding style guidelines for SQL?

答案 3 :(得分:4)

值得庆幸的是,PHP开发人员不像我所知道的一些开发社区那样是“Camel case bigots”。

您的惯例听起来不错。

只要它们很简单,并且b)一致 - 我没有看到任何问题:)

PS: 就个人而言,我认为5)是过度杀伤......

答案 4 :(得分:1)

简单答案:

好吧,至少是Oracle或社区鼓励的命名约定,但是,基本上没有,您必须了解标识符的规则和限制,例如MySQL文档中指示的内容:https://dev.mysql.com/doc/refman/8.0/en/identifiers.html < / p>

关于您遵循的命名约定,我认为还可以,只是数字5有点多余,我认为大多数用于管理数据库的可视化工具都提供了对列名称进行排序的选项(我使用DBeaver,并且有它),因此,如果用户对您的桌子有很好的视觉效果,则可以使用我提到的此选项。

根据个人经验,我建议这样做:

  • 使用小写字母。当您将数据库从一台服务器迁移到另一台服务器时,这几乎可以确保互操作性。有时lower_case_table_names的配置不正确,您的服务器仅通过简单地识别您的camelCase或PascalCase标准就开始引发错误(区分大小写的问题)。
  • 短名。简单明了。最简单,最快捷的方法就是识别表格或列。相信我,当您在短时间内进行很多不同的查询时,最好使所有内容都易于编写(和读取)。
  • 避免使用前缀。除非您对不同应用程序的表使用相同的数据库,否则请不要使用前缀。这只会给您的查询增加更多的细节。在某些情况下,这可能很有用,例如,当您要标识主键和外键时,通常将表名用作id列的前缀。
  • 使用下划线分隔单词。如果您仍然想使用多个单词来命名表格,列等,请在 separating_the_words 中使用下划线,这样有助于提高可读性(您的眼睛和紧张的大脑将感谢您) 。
  • 保持一致。一旦有了自己的标准,请遵循它。不要成为制定规则的人,而是第一个违反规则的人,这是可耻的。

“复数与单数”命名又如何呢?好吧,这多数是个人喜好的情况。就我而言,我尝试为表使用复数名称,因为我认为表是元素的集合或包含contains元素的包,因此复数名称对我来说很有意义;和列的单数名称,因为我将列看作是对这些表元素单数描述的属性。

答案 5 :(得分:0)

@ fabrizio-valencia表示使用小写字母。在Windows中,如果您导出mysql数据库(phpmyadmin),则表名将转换为小写,这将导致各种 问题。 参见Are table names in MySQL case sensitive?

答案 6 :(得分:0)

一致性是每个人都强烈建议的,其余的取决于您,只要它可行。

对于初学者来说,它很容易被带走,我们可以命名当时想要的任何东西。在那时,这是合理的,但后来却令人头疼。

foo foobarfoo_bar很棒。 我们尽可能直接为表命名,如果它们是两个不同的词,则仅使用下划线。 studentregistrationstudent_registration

就像@Zbyszek说的那样,拥有一个简单的id足以满足自动递增的需求。越简单越好。为什么需要foo_id?早期我们有同样的问题,我们用表前缀命名所有列。例如foo_idfoo_namefoo_age。现在,我们删除了表名,并仅将col尽可能短。

由于我们仅使用PK的ID,因此将使用foo_bar_fk(表名是唯一的,后跟唯一的PK,后跟_fk)作为外键。我们不将id添加到列名,因为据说名称'id'始终是给定表的PK。因此,我们只有表名和结尾的_fk

对于约束,我们删除所有下划线并与camelCase(表名+姓氏+ Fk)foobarUsernameFk(对于username_fk col)一起加入。这只是我们遵循的一种方式。我们为每个名称结构保留一个文档。

在使col名称简短时,我们还应注意RESTRICTED名称。

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