2.为什么需要规范的数据库设计
您也许会问,在第一阶段,根据业务需求,我们直接建库、建表,插入测试数据,然后再查询数据,为什么现在需要强调先设计再建库、建表呢?
原因非常简单,正如我们修造建筑物一样,如果您是盖一间茅屋或一间简易平房,您会花钱请人设计房屋图纸嘛?毫无疑问,没人请。
但是,如果是房地产开发商开发一个楼盘,修建多栋楼房的居住小区,他会情人设计施工图纸嘛?答案是肯定的。
不但开发商会考虑设计施工图纸,甚至恨专业的购房者也会在看房时要求开发商出示设计图纸。
同样道理,在实际的项目开发中,如果徐彤的数据存储量较大,设计的表也比较多,表和表之间的关系比较复杂,我们就需要过滤规范的数据库设计,然后再进行具体的建库、建表工作。
不管是创建动态网站,还是创建桌面窗口应用程序,数据库设计的重要性都不言而喻。
如果设计不当,查询起来就非常吃力,程序的性能也会受到影响。
无论您是用的是SQL Server还是Oracle数据库,通过进行规范化的数据库设计,都可以使您的程序代码更具有可读性,更容易扩展,从而也会提升项目的应用性能。
2.1 什么是数据库设计
数据库设计就是规范和结构化数据库中的数据对象以及这些数据对象之间关系的过程。
如图是一个KTV数据库的结构,示例该数据库包含歌手、歌手类型、歌曲、歌曲分类的信息,图中还显示了各个对象之间的关系。
2.2 设计数据库非常重要
数据库中创建的数据结构的种类,以及在数据对象之间建立的复杂关系是数据库系统效率的重要决定因素。
糟糕的数据库设计表现为以下几点:
- 效率低下
- 更新和检索数据时会出现许多问题
良好的数据库设计表现为以下几点:
- 效率高
- 便于进一步扩展
- 应用程序开发更容易
经过了SQL Server基础的学习,我们对项目的开发有了一个整体的感性认识,项目开发需要经过需求分析、概要设计、详细设计、代码编写、运行测试和打包发布几个阶段。
重点讨论在各个阶段,数据库的设计过程:
- 需求分析阶段:分析客户的业务和数据处理需求
- 概要设计阶段:绘制数据库的E-R模型图,用于在项目团队内部、设计人员和客户之间进行沟通,确认需求信息的正确和完整
- 详细设计阶段:将E-R图转换为多张表,进行逻辑设计,确认各表主外键,并应用数据库设计的三大范式进行审核。经项目组开会讨论确定后,还需要根据项目的技术实现、团队开发能力以及项目的经费来源,选择具体的数据库(如SQL Server或Oracle等)进行物理实现,包括建库、建表并创建我们后面学习的存储过程和触发器等。创建完毕后开始代码编写阶段,开发前端应用程序。
现在,我们共同讨论:在需求分析阶段,后台数据库的设计步骤。
- 需求分析阶段的重点是调查、收集并分析客户业务数据需求、处理需求、安全性与完整性需求。
- 常用的需求调查方法有:在客户的公司跟班实习、组织召开调查会、邀请专人介绍、设计调查表并请用户填写、查阅业务相关数据记录等。
- 常用的数据分析方法有:调查客户的公司组织情况、各部门的业务需求情况、协助客户分析系统的各种业务需求、确定新系统的边界。
无论数据库的大小和复杂程度如何,再进行数据库的系统分析时,都可以参考下列几本步骤:
- 收集信息
- 标识对象
- 标识没个对象需要存储的详细信息
- 标识对象之间的关系
3.1. 收集信息
创建数据库之前,必须充分理解数据库需要完成的任务和功能。
简单的说,我们需要了解数据库需要存储哪些信息(数据),实现哪些功能。
以BBS论坛系统为例,我们需要了解BBS论坛的具体功能,与后台数据库的关系:
- 用户注册和登录:后台数据库需要存放用户的注册信息和在线状态信息
- 用户发帖:后台数据库需要存放帖子相关信息,如帖子内容、标题等
- 论坛版块管理:后台数据库需要存放各个板块信息,如版主、板块名称和帖子数量等
3.2 标识对象(实体)
在收集需求信息后,必须标识数据库要管理的关键对象或实体。
我们曾在Java中学习过对象的概念,对象可以是有形的事务,如人或产品。也可以是无形的事务,如商业交易、公司部门或发薪周期。
在系统中标识这些对象以后,与他们相关的对象就会理清楚。
以BBS论坛系统为例,我们需要标识出系统中的主要对象(实体),注意:对象一般是名词,一个对象只描述一件事情,不能重复出现含义相同的对象:
- 论坛用户:包括论坛普通发帖、回帖用户、各板块的版主
- 帖子:用户发的帖子或是回的帖子
- 板块:论坛的各个板块信息
数据库中的每个不同的对象都拥有一个与其相对应的表,也就是说,在我们的数据库中,会对应至少三张表,分别是用户表、帖子表和板块表。
3.3 标识每个对象需要存储的详细信息(属性)
将数据库中的主要对象标识为表的候选对象以后,下一步就是标识每个对象存储的详细信息,也称为该对象的属性,这些属性将组成表中的列。
简单的说,就是需要细分出每个对象包含的子成员信息。
以BBS论坛系统为例,我们逐步分解每个对象的子成员信息,在分解时又发现发帖合回帖不同,所以把帖子细分为发帖合回帖两个对象(实体)。