Is there a naming convention for MySQL?
我是这样做的:
表名是小写,使用下划线分隔单词,并且是单数(例如"foo"、"foo_bar"等)。
我通常(不总是)有一个自动递增的pk。我使用以下约定:tablename_id(例如"foo_id"、"foo_bar_id"等)。
当一个表包含一个作为外键的列时,我只是从它来自的任何表中复制该键的列名。例如,假设表"foo_bar"具有fk"foo_id"(其中"foo_id"是"foo"的pk)。
在定义FK以实现引用完整性时,我使用以下内容:tablename_fk_columnname(例如,进一步的示例3,它将是"foo_bar_foo_id")。由于这是表名/列名的组合,因此保证在数据库中是唯一的。
我按如下顺序排列列:pks、fks,然后按字母顺序排列其余列
有没有更好、更标准的方法来做到这一点?
- 自动增量pk只使用"id"是错误的吗?为什么?列的名称仅在表的上下文中有意义。所以我在每个表中都有一个"id",对于fk,可能有多个id_uuuTable_Name>。
- @Zbyszek我认为最简单的理由就是为了一致性/简单性。与命名列id_tableB=>oh没有不同的命名列id相比,id_tableB=>id_tableB的一致性看起来更整洁……或者像操作一样:foo_id=>foo_id,而不是foo_id=>id
我首先要说的是:始终如一。
我认为你已经接近你在问题中概述的惯例了。不过,有几条评论:
我想1点和2点不错。
第3点——遗憾的是,这并不总是可能的。考虑如何处理一个单表foo_bar,该表有列foo_id和列another_foo_id,这两个列都引用foo表foo_id列。你可能想考虑如何处理这个问题。不过,这有点不切实际!
第4点-与第3点类似。您可能需要在外键名的末尾引入一个数字,以满足具有多个引用列的需要。
第5点-我会避免的。它为您提供了很少的信息,当您以后想要在表中添加或删除列时,它将成为一个头痛的问题。
其他一些要点包括:
索引命名约定
您可能希望为索引引入一个命名约定——这对于您可能希望执行的任何数据库元数据工作都是一个很大的帮助。例如,您可能只想调用索引foo_bar_idx1或foo_idx1,这完全取决于您,但值得考虑。
单数与复数列名
在列名和表名中处理复数与单数的棘手问题可能是一个好主意。这个主题经常在数据库社区引起大的争论。对于表名和列,我将坚持使用单数形式。在那里。我已经说过了。
这里的主要内容当然是一致性!
- 什么比第5点更好?为什么会变成头痛?
- 为了跟进,我发现这对以后来这里的人很有帮助:launchbylunch.com/posts/2014/feb/16/sql-naming-conventions/…
- 我很难找到一个好的"方案"来命名我的表,它包含两个名称(documentchapter、documentversion、documenttype等)组成的模型对象。例如,对于documenttype,我可以将其命名为documenttype或document_type。我更喜欢后者,但大多数时候我有多对多的关系,我需要一张像document_document_type那样的桌子。有什么建议吗?
- @RSB2097回复:第5点-添加一列(到末尾)后,订单可能无效。您不应该添加任何需要重新排序列的约束,因为这是不必要的开销。
一致性是任何命名标准的关键。只要它是合乎逻辑和一致的,你就有99%在那里。
标准本身是非常个人的偏好-所以如果你喜欢你的标准,那么就用它来运行。
要直接回答您的问题-不,MySQL没有首选的命名约定/标准,所以滚动您自己的命名是可以的(而且您的命名似乎是合乎逻辑的)。
MySQL对其或多或少严格的规则有一个简短的描述:
https://dev.mysql.com/doc/internals/en/coding-style.html
Simon Holywell为MySQL编写的最常见编码样式:
http://www.sqlstyle.guide/
另请参见此问题:是否有任何已发布的SQL编码风格指南?
值得庆幸的是,PHP开发人员并不像我认识的一些开发社区那样"驼峰案例偏执者"。
你的习俗听起来不错。
只要它们a)简单,b)一致-我看不出任何问题:)
PS:就我个人而言,我认为这太过分了…
- 事实上,camel-case并不是偏执狂,但很多DB社区都不喜欢它,因为有些RDBMS对大小写不敏感,他们会将大小写去掉(或将所有内容都改为大写),所以事情很快就会变得非常糟糕。
- @你能指定哪一个RDBMS?我自己也是一个驼队的骑师。在我的模式中,caps仅起到一个作用,用于指示联接表和(在字段的情况下)指示单词边界,以便u可以专门表示另一个表的id(即表名=其他表,该表中的字段=id)。另外,如果其他RDBMS不区分大小写,那么它真正重要的是什么?我永远不会得到同一张桌子的大小写版本!哦,我不喜欢不区分大小写的RDBMS-我宁愿编写一致的代码
- 我喜欢mysql用户不喜欢camelcase的讽刺和我们使用的产品名称:mysql,用camelcase编写
- @DBX12要学究,那是帕斯卡酶,不是骆驼壳,但你的观点仍然存在。
- @结婚没想过,但你是对的。骆驼壳一开始应该没有隆起。