MySQL是否有命名约定?


162

这是我的方法:

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

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


6
将自动增量PK用作“ id”是否错误?为什么?列名仅在表的上下文中才有意义。因此我在每个表中都有一个“ id”,并且对于FK可能有许多id_ <table_name>。
Zbyszek

3
@Zbyszek我认为最简单的原因只是为了保持一致性/简单性。而不是id_tableB=> 哦,不, 不同名称的列 id,一致性id_tableB=> id_tableB只是看起来整洁......或OP做的:foo_id=> foo_id而不是foo_id=>id
唐·钱德尔

Answers:


106

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

我认为您在问题中概述的约定几乎都在那里。不过有几点评论:

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

第3点-遗憾的是,这并不总是可能的。考虑一下您将如何处理一个foo_bar具有列foo_id并且another_foo_id都引用foofoo_id列的表。您可能要考虑如何处理此问题。不过,这有点死角!

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

第5点-我会避免这种情况。它给您带来的好处很少,并且以后想要在表中添加或删除列时会感到头痛。

其他一些要点是:

索引命名约定

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

单列名称与复数列名称

在列名和表名中解决复数和单数的棘手问题可能是一个好主意。这个主题经常引起数据库界的激烈争论。对于表名和列,我会坚持使用单数形式。那里。我说过了

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


有什么比第5点更好的呢?为什么会变得头疼?
2014年

7
要跟进,我发现这个柠利于那些谁以后会来到这里:launchbylunch.com/posts/2014/Feb/16/sql-naming-conventions/...
Enissay

1
我很难找到一个好的“方案”来命名我的表,该表包含由两个名称(DocumentChapter,DocumentVersion,DocumentType等)组成的模型对象。例如,对于DocumentType,我可以将其命名为documenttypedocument_type。我希望使用后者,但是大多数时候我有很多对很多的关系,我需要一张像这样的桌子document_document_type。有什么建议如何处理吗?
lexith '16

@ rsb2097回复:第5点-在最后添加一列后,该订单可能无效。您不应该添加任何需要对列进行重新排序的约束,因为这是不必要的开销。
谢泼德

21

一致性是任何命名标准的关键。只要是合乎逻辑且一致的,您就可以达到99%。

标准本身就是个人喜好-因此,如果您喜欢标准,则可以使用它。

要彻底回答您的问题-不,MySQL没有首选的命名约定/标准,因此自行滚动是可以的(并且看起来很合逻辑)。



4

幸运的是,PHP开发人员不像我所知道的某些开发社区那样“笨拙”。

您的约定听起来不错。

只要它们是a)简单且b)一致-我看不到任何问题:)

PS:就我个人而言,我认为5)太过分了...


2
骆驼式案例绝非孤注一掷,实际上它被许多数据库社区所反对,因为某些RDBMS在区分大小写(或将所有内容更改为大写)方面不区分大小写,因此事情真的很快就变得丑陋。
mal-wan

@mwan:您可以指定哪个RDBMS吗?我本人是骆驼骑师。大写仅在我的架构中用于表示连接表和(在字段的情况下)表示单词边界,因此_只能用于表示othertable_id(即表名= othertable,并且该表中的字段= id) )。此外,如果其他RDBMS不区分大小写,那到底有什么关系呢?我永远不会在同一张桌子上使用大写和小写版本!哦,我不希望使用不区分大小写的RDBMS-我宁愿编写一致的代码
Samuel Fullman 2014年

7
我喜欢MySQL用户反感CamelCase和我们使用的产品名称的讽刺意味:用CamelCase编写的MySQL
DBX12

1
@ DBX12令人讨厌的是PascalCase,而不是camelCase,但您的观点仍然成立。
MarredCheese

@MarredCheese没想过,但是你是对的。camelCase一开始应该没有驼峰。
DBX12 '19

1

简单答案:

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

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

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

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

那么“复数vs单数”命名又如何呢?好吧,这多数是个人喜好的情况。在我的情况下,我尝试对表使用复数名称,因为我认为表是元素的集合或包含containsig元素的包,因此复数名称对我来说很有意义;和列的单数名称,因为我将列视为属性,这些属性对表元素进行单数描述。

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.