前言
今天有个前同事去面试,被面试官问了一个这样的问题:如果让你去设计数据库你改怎么设计?或者有哪些步骤?被问到这里可能我们就懵逼了,是啊,该怎么去设计呢。
在软件开发的过程中,数据库设计是非常重要的,它需要根据需求分析抽象出E-R图,概念结构设计、逻辑结构设计、物理结构设计,实施及运维。
在公司中一般的流程是:
- 对问题以及可行性进行分析
- 进入需求分析阶段,由产品相关人员去和客户沟通落地形成PRD
- 最后跟开发相关人员沟通之后,根据需求分析做数据库设计了
接下来通俗易懂的方式对数据库设计的步骤以及每个阶段要完成的内容进行讲解
数据库设计基本步骤
需求分析阶段
要进行数据库设计首先要了解用户的需求,理解用户的需求,需求分析常用SA(Structured Analysis:结构化分析方法)随着开发的进行,还需要经常与用户沟通,交流意见,以保证其需求仍然在开发的目的之中。
进行需求分析,首先是调查用户的实际要求,与用户达成共识。然后再进行实际调查。调查用户的机构情况、人员情况、业务情况等等,确定系统的任务。在进行需求调查时,可以绘制数据流图(用户业务流程图),进一步明确系统的边界。
例如:职工工资管理系统”数据库系统是一个用来管理职工工资的数据库系统。既然是管理职工工资的数据库,那么职工、部门、工资是必不可少的,这些属性都有一些特有的特征:
- 职工:编号、部门编号、姓名、性别
- 部门:部门编号、部门名称
- 工资:员工编号、基本工资、奖金
概念设计阶段
概念结构设计就是将需求分析得到的信息,抽象化为概念模型。
在实际的开发中,常用E-R(Entity-Relationship:实体关系)图来表示。
常用的工具PowerDesigner,可以实现CDM(概念数据模型)-----> LDM(逻辑数据模型)-----> PDM(物理数据模型)-----> DataBase的自动转换,这个过程称为正向工程,如果有DataBase建库脚本,也可以通过PowerDesigner工具生成CDM,即Database -----> PDM -----> LDM -----> CDM,称为反向工程。
概念设计通常采用自底向上,首先定义各系统局部的概念模型,然后再将他们集成合并起来,得到全局的概念模型。
局部E-R图:
全局E-R图:
逻辑结构设计阶段
逻辑结构设计阶段的任务就是把概念结构设计好的基本E-R图转换为与指定DBMS产品所支持的数据模型相符合的逻辑结构,并将进行优化常用关系模型。
在此阶段,各子模块的E-R图之间的冲突主要有三类:属性冲突,命名冲突和结构冲突,同时E-R图向关系模型的转换,要解决如何将实体性和实体间的联系转换为关系模式,确定这些关系模式的属性和码,实际开发中,逻辑设计阶段不是必须的。
将全局的E-R图转换为关系模型如下:
职工(编号、部门编号、姓名、性别、部门编号);
部门(编号、部门名称);
工资(职工编号、基本工资、奖金)
物理结构设计阶段
逻辑设计阶段和数据库选型完成之后就可以选择存储结构,确定存取方法,选择存取路径,确定数据的存放位置
- 确定数据库的物理机构(存储机构,存储方法)
- 对物理机构进行评估(时间,空间)
职工表:
部门表:
工资表:
数据库实施阶段
对数据库的物理设计初步完成后就可以开始建立数据库了,数据库当中创建表需要进行规范性检查,通过之后就可以创建表结构,而Yearning,Archery都可以支持SQL的规范性检测,Yearning支持MySQL数据库,而Archery支持多种数据库
规范性检查可以借助开源的SQL审核工具,如Yearning,Archery都可以设置规则,检查之后会给出整改建议,能够帮我们自动实现SQL Review。Yearning是用go开发,目前只支持MySQL数据库,Archery可以支持多种数据库。下面是Yearning检测SQL的示例:
数据库运行与维护阶段
数据库试运行合格后,数据库开发工作就基本完成,即可以投入正式运行了。在数据库运行阶
段,对数据库还要进行经常性地维护,如下图: