【实践】数据库命名规范

前言

程序员圈子里流传着一个段子,说编程只有两个难题:缓存失效和变量命名。而我们中国有句古话,说:名不正则言不顺。这里面都提到了一个至关重要的问题,就是“取名字”。我认为,名字问题之所以如此重要,是因为,“名字”其实是对客观世界中实体的符号化表示。而这些符号,成为人类语言描述和思维的主要原料。如果名字有问题,就会严重干扰人类的思维。

目前的计算机,还只能按照完全确定性的方式去运行,而与之相对,人类的思维运转却存在极大的不确定性和任意性,如果说,编程实践总是由一个人完成,写出来的代码即可以运行,而不再需要阅读和与人合作,各种各样的规范,根本不需要存在;而事实恰恰相反。约束是为了更大程度的自由,所以,编码规范、命名规范,就是为了给所有共同合作的程序员一个基础。这个基础,可以帮助大家去提高效率,促进理解。

在最近两年的编码实践中,我感受到,数据库因为其特殊性(主要是总以服务形式出现,通过SQL语句操纵),其命名规范,别具一格,并不完全遵循一般编码规范的命名规则。而且,有时候,特意分开,反倒可以提高效率和促进理解。后面,我就展开列举一下,我们在实践过程中,习得的一些经验,这些做法未必是大家实践的准绳,但是希望可以给读者提供一个有效的参考。

通用

规范:全部使用小写字母

  • 编程一般都在计算机上,使用印刷体,小写字母有着很好的辨识度,而实际上,大家对小写字母的反应也比较快
  • 小写字母输入速度比较快,下文列举的一些规则,可能会导致字段名字比较长,都使用小写可以提高输入速度
  • 使用SQL语句操作数据的时候,我们喜欢大写SQL语句中的保留字(SELECT FROM WHERE等),使用小写命名表名、字段名,可以有效区分开

规范:使用下划线分隔而不是空格或者别的什么

  • 下划线可以分隔单词
  • 下划线在各种语言或系统中,一般都是有效的标识符的组成部分
  • 下划线是可见字符,不容易引起误会

规范:避免在名字中使用数字

  • 看起来很不好看

规范:尽量不要使用缩写、简写

  • 比如不要用addr,而是使用address
  • 做到顾名思义,避免误会和不必要的记忆负担

表名

规范:一般不使用前缀

  • 我之前待过的团队,曾有一种习惯,表名前加tbl_前缀,可能是为了与字段名区别开来,或者自动转化成变量名的时候,可以清楚地知道这个变量名来自于数据库,当然,实际上,这个前缀并没有显示出过多的价值,因为表名直接自动转化为变量名的机会比较少(分库分表的时候,表名容易成为变量名),另有一些方法,使得表名很容易区别于字段名和变量名
  • 对于视图(View),使用v_作为前缀,有助于程序员对数据库的理解和预防错误(比如,看到v_就不必尝试去update其中的字段了)

规范:采用单数名词

  • 一种争辩是:一张表,是一个集合,用复数更为符合客观实际,然而,实际上,并不能产生太好的效果,很简单,中国人对英语的掌握,以及英语本身作为一门自然语言的不确定性,都让复数表名变得麻烦重重,连英美人士都不认可,不要提中国人了,是 es 结尾,还是 s 结尾,特殊变形如 y 变成 ies,更有甚者,有些单词不可数,如何处理?
  • 很多框架,都设置了ORM层,单数的表名,比较有利于框架自动生成代码

规范:尽量短,最好不要超过两个单词,不要使用冷僻词

  • 主要是因为我们采用了用表名前缀字段名,表名短很重要
  • 容易记忆和书写
  • 写业务时候,不要用网络汉英字典去找名词,可以多看些业务相关的技术文章,或者找外国友人帮忙
  • 中国人理解和拼写较弱,如果选用难的、少见的词汇,容易给代码引入bug

字段名

规范:使用表名作为字段名的前缀

  • 以前我们团队里,给所有的字段前面加F,感觉没什么用
  • 使用表名作为字段前缀名,可以有效防止保留字冲突,比如order
  • 在联表查询时候,几乎不需要表名的alias,例如,很多表都有id、type、status等等字段,在联表写SQL语句时候,为了防止它们的混淆,经常要做额外的工作

规范:特殊字段类型添加后缀

  • 比如,在日期(Date)字段后面加_on,在时间(DateTime)字段后面加_at,也可以是加date或time作为后缀,关键是全团队的认可和保持一致
  • 可以有效提醒SQL撰写者字段的内涵,防止混淆

规范:外键前面也要灌上表名前缀

  • 比如,博客文章(表名为post),里面需要有一个作者id,命名为 post_author_id,而author_id是作者表(表名为author)的主键,post和author联表的时候,完全不会爆出任何字段名混淆(field name ambiguous)的错误

总结

我试图去搜索或寻找一些所谓的数据库命名方面的最佳实践,有些网友会推荐,采用微软SQL Server的范例数据库中的命名规范,并作出了相应的分析,但是我简要阅读了一下,凭直觉是无法比我们现在的做法带来更多的好处的。

另外也参考了一些StackOverflow上面高支持率的答案内容,感觉国外这个领域,也没有一个相对权威的说法,所以,我个人觉得,这个里面是如人饮水冷暖自知的一个情况,各个团队,还是要找到跟自己团队比较契合的一个规范。

不过,有一点我是相当确定的,就是有规范一定好于没有规范,现在一般都是团队作战了,规范的约束,可以提高整个团队的效率,避免了一些没有必要的学习成本。

参考:

http://justinsomnia.org/2003/04/essential-database-naming-conventions-and-style/