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