业务和系统开发领域绝对不能容许设计上的重大失误可是很多开发人员却因为不了解设计步骤而恰恰轻视乃至完全忽略了整个设计过程而实际上我们中的大多数人也确实缺乏必要的有关技能和知识结果令我们往往旁路了项目开发中最重要的阶段说真的有本事敢直接绕过设计阶段的人还没诞生呢
如果我们不花点时间创建一个逻辑模型那么要实现一套高效和优秀的设计是完全不可能的略过设计步骤会产生大量的错误而这些错误又会令我们耗费大量的时间在发现它们的时候反复调试和纠正下面我就大致讨论下设计的逻辑和物理模型然后引领读者经过逻辑模型的创建全过程本文是有关主题系列的开篇在后续的第部分里我会根据已经发现的缺陷修改我们的原始设计
数据库的设计方法
在对数据库项目的需求着手评估和分析周接下来的一步就是设计出一套方案帮助你达到项目的要求和目标在开发领域这一步骤被称做数据库设计方法它是一种结构化的措施支持设计流程同时还包括了诸如公司业务流程规定和文档等一系列工具步步进阶的整套流程帮助开发人员计划管理和控制设计及其实现从而高效地完成任务
这意味着你拥有一整套方法也就是按照特定顺序安排的项目列表这些方法指引你经过数据模型创建的全过程请不要错误地把这个过程理解为平常的过程实际上它是完全必要的阶段你应该从完全理解数据和用户需求这一目的出发研究该过程
每一个项目无论其规模大小都能从以下三种模型中获益
概念明确和说明创建数据全局视图的主要对象同时辅以一定的轻微细节许多企业都局限于特定的数据库管理系统(DBMS)所以这一步可以忽略或者放到逻辑模型一组
逻辑构造采用特定数据的模型但还不用考虑最终保存数据以及运营应用程序的具体数据库系统由于SQL Server是一种关系型数据库管理系统(RDBMS)所以我们要依赖于实体关系模型(EREntityRelationship)在这一阶段你必须明确实体关系属性并对你的数据实行规格化逻辑模型建立在数据集合的基础之上为了更深入地了解ER模型不不妨访问下 ITS数据库服务网站 或者参考
Mapping an ER Model to the Relational Model Web site(是一个PDF文件)
物理根据所采用的具体RDBMS设计实现逻辑模型的具体模型在这一阶段你需要说明数据表索引等数据库对象而物理模型就是根据数据表建立的
建立逻辑模型的真实用意无非是为了确认应用程序能满足最终的需求(包括输入和输出两方面)换句话说逻辑模型必须能产生所有已知的报告查询等结果此外用户还应该能够以合理的方式输入和操作数据一旦逻辑模型到位你就应开始把你所了解的情况应用到项目的物理需求方面——比如说——物理模型图A就描述了逻辑和物理模型在这一阶段的差别
图A
逻辑和物理数据模型
逻辑模型的实现
目前阶段的所谓实现其实就是完成逻辑模型的组件在明确了实体关系和属性的情况下你应该揭示出那些在工作环境下可能会产生问题的缺陷
缺少的实体
表示同一概念实体的多个实体
需要额外实体来解决问题的多对多关系
多值和冗余的属性
现在我们就以一个实际项目为例看看该如何创建一个合理的逻辑模型通过这个模型帮助你避免今后的问题假设你的这个最新项目是供旅行社使用的一项足够简单处理定单的数据库应用程序这家旅行社针对类客户实行批发或者零售服务
Agency授权接受定单上任务的另一家旅行社
Aggregator一家俱乐部其成员可以享受打折服务
Corporate代表其职员下定单的公司它们不能享受的打折优不过需要获得旅行社的全方位服务支持比如说旅行社必须帮助它们解决一些诸如取消计划飞机票订位过多等方面的问题企业客户总是一样的而旅行者只能是其职员
Retail不能享受任何折扣优惠的单独客户
这时你应该准备定义应用程序的主要对象或者实体为了针对客户类型应用以上的业务规则你可能会把每一种客户类型当作单独的实体如表A所示数据类型和其他信息都是针对SQL Server考虑的
表A
定义应用实体
看图B你可以简化当前的模型
客户订单
某种特定类型的客户
图B
不同实体之间的关系
正如我们在上面所提到的那样业务规则要求我们对客户实现区别对待结果客户不能总是具有同样的属性我们的第个解决方案是创建一个数据表其中包含了各类客户的特定属性这一原始设计带来了下列问题
所有的客户数据表都采用系统生成的主键大致以种子值开始递增那就是说你完全会遭遇重复的ClientID值结果我们就无法恰当地把每一定单关联到特定的客户因为每一客户表都包含了重复的值
因为每一客户表重复公共字段(如ClientIDClientNameAddress和Telephone)而产生了一些冗余的属性
客户会有更多的地址吗?也许他们会具有一个当地地址和一个付费的单位地址
客户只有一个电话号码?也许你应该列出多个电话号码乃至传真号码
有必要根据客户的类型来标识定单吗?显然你不能
找出和解决设计问题
你首先采取的行动可能和我们用的不同但那还不是关键的问题最重要的是你可能没有认识的到设计中隐藏的问题在后续的文章里我会采用已知的业已得到证明的方法来寻找和解决设计问题免得它们在今后的工作中引出不少漏子