数据库、表、字段等所有名称的可用字符范围为:A-Z,a-z, 0-9 和_下划线,除此外不允许使用其它字符作为名称。数据库及表名均不允许出现数字,字段名除非特殊情况不允许出现数字。
一、MySql开发数据库命名规范问题,一般怎么操作
数据库、表、字段等所有名称的可用字符范围为:A-Z,a-z, 0-9 和_下划线,除此外不允许使用其它字符作为名称。数据库及表名均不允许出现数字,字段名除非特殊情况不允许出现数字。
在前面介绍关系范式时曾提到过一个破坏范式的例子:平时的多图片上传功能,可能只设计一个字段存储图片名称,这样字段值中就会包含多个图片的名称,里面用|或其它符号分隔。像这种情况,其实也可以设计成三五个字段image_name1、image_name2、image_name3……分别存储,然后限制可上传图片个数,这就是字段名中可出现数字的特殊情况——虽然也不建议这样设计或取名。
数据库、表、字段等所有名称使用英文单词或英文短语或相应缩写,禁止使用汉语拼音,且均使用单数名,例如:对存储客人信息的表命名为customer而不是customers。名称应该清晰明了,能够准确表达事物的含义,遵循见名知意的原则。
Oracle表、字段等名称统一使用大写,单词间用_下划线分隔;SQLServer数据库、表等名称采用Pascal命名法,字段名称采用Camel命名法,大小写字母混排;MySQL数据库、表、字段等名称统一使用小写,单词间用_下划线分隔。至于为何这样规定,下一个模块会有详细介绍。
Oracle相对特殊,通常的操作顺序是,先创建数据库实例,然后创建表空间,然后创建用户并设定此用户的默认表空间,最后在此用户下建表。多数情况下我们都是只建一个实例,然后在此实例下建不同的表空间、不同的用户,根据不同的用户来区分不同的库。关于实例、表空间及用户的命名方式并无限制,可以采用大小写混排,也可以只用大写或小写,但对于表和字段,我们要求统一为大写。
我们要求统一为大写或小写的名称,两个单词间用_下划线分隔,SQLServer使用Pascal或Camel方式命名。这些不仅仅是为了数据库设计的可读性,也是为了最终生成代码的可读性。这里简单介绍下编程中常用的三种类、变量、函数等的命名方式:
a. 匈牙利命名法
由微软的一位匈牙利程序员Charles Simonyi 提出,相对复杂,首字母小写,基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。匈牙利命名法主要在C或C++这种面向过程的程序语言中使用,如果用在Java、C#这种面向过程的语言中就很别扭。
不过自己在写Web前端页面或脚本时,借用了这种命名方式,form表单中涉及的常用HTML标签不外乎如下几种:label、text、button、submit、password、textarea、radio、checkbox、select等,那我在给表单元素命名或者说是给id或name赋值时,就会将元素类型做前缀,例如用户名输入框为textName、性别单选按钮名为radioGender。这样做的好处是我在编写脚本时,根据id或name名称一眼就可以看出这个表单元素是什么类型。在修改页面中初始化表单数据时我可以直接遍历表单元素、根据元素名称判断出元素的类型进而采用适当的赋值动作,而不用逐个选择元素去赋值。
在http://ASP.NET编程中,如果使用微软的服务器控件,在命名时我会用控件类型做名称后缀,例如Name_TextBox、Gender_RadioButtonList等。之所以不再将类型做前缀,一来是VisualStudio本身默认的服务器控件命名方式即时如此,控件类型做后缀;二来是因为服务器控件的类型名称太长,而自己又不愿用缩写,因为没必要,VisualStudio的提示功能强大,后缀的长度不会影响到编程速度。
b. Camel命名法
即骆驼式命名法,首字母小写,采用该命名法的名称看起来就像骆驼的驼峰一样高低起伏。Camel命名法有两种形式:
名列前茅种是混合使用大小写字母,例如englishName、fartherCode。在Java中,属性名和方法名一般都采用这种命名方式,在C#中只有属性名采用这种命名方式,我们在前面也规定,SQLServer中字段的命名也采用这种方式。第二种是单词之间加下划线,例如english_name、farther_code。我们在前面规定,Oracel和MySQL表、字段的命名都采用这种方式,不过我们要求Oracle全部使用大写字母,MySQL全部使用小写字母。再者,无论是在Java还是C#,甚至是在JavaScript中,所有的常量,都使用这种命名方式,但和Oracle表字段的命名方式一样要全部使用大写字母,比如前面的设计规范中介绍数据字典表时,字典类型、字典项的编码和文本信息需要即时获取,以往的习惯在程序中建立一个常量类,所有用到的字典数据在里面用常量标明,这时常量的命名方式即是如此。
c. Pascal命名法
即帕斯卡命名法,与Camel命名法类似,不过是首字母大写。在C#中,类名和方法名一般采用这种命名方式,在Java中类名一般采用这种方式。在前面也规定,SQLServer中数据库、表的命名也采用这种方式。
除数据库的设计外,不同编程语言、前端HTML标签、JavaScript脚本、样式等等部分都会涉及命名的问题,如果细细整理,项目开发中每个子模块的命名规范都够再出一份长篇文档的。这里只简单介绍下三种常用的命名方式,其它部分的命名方式只是一提,重点还是在数据库的命名规范上。前面说过多次,程序、文档甚至前端页面有大部分通过工具自动生成,只有数据库严格按要求来命名,才能根据不同的编程语言编写不同的代码模板,统一控制生成部分各处的命名方式。比如,我们要求在MySQL数据库中,表名都使用小写,单词间用下划线分隔,交易记录表名称为trade_log,那可以设定生成规则,对应生成的实体类名就是TradeLog,对应生成的Dal层就是TradeLogDal,对应的Service名就是TradeLogService,等等。可如果设计没有规范、不统一,那文档生成规则、代码生成规则、程序编写规则等等也就无法统一制定了。
延伸阅读:
二、数据库的查询功能实现原理
数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优异的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。