第六章系统总体设计
6.l系统总体结构设计
6.1.1系统总体结构设计的任务
系统总体结构设计的任务,是根据系统分析的逻辑模型设计应用软件系统的物理结构。系统物理模型必须符合逻辑模型,能够完成逻辑模型所规定的信息处理功能,这是物理设计的基本要求。
系统应具有可修改性,即易读,易于进行查错、改错、可以根据环境的变化和用户的要求进行各种改变和改进。系统是否具有可修改性,对于系统开发和维护影响极大。据统计,在系统生命周期中各阶段的应用软件费用及人力投入大体分布如下:
。系统开发:20%
。系统维护:80%
6.1.2结构化设计的基本思想
1.结构化设计的要点
系统是否具有可修改性与其结构有着密切的关系。“结构化设计”的构想,成为系统设计的基本思想。其要点如下:
(1)模块化。
(2)由顶向下,逐步求精。系统划分模块的工作应按层次进行:①把整个系统看做一个模块,然后把它按功能分解成若干第一层模块,它们各担负一定的局部功能,共同完成整个系统的功能。②每个第一层模块又可以进一步分解成为更简单一些的第二层模块,越下层的模块,其功能越具体、越简单。
(3)上层模块分解为下层模块,有三种不同的结构形式,即顺序结构、选择结构和循环结构。
控制结构图也称为软件结构图或模块结构图,它表示出一个系统的层次分解关系、模块调用关系、模块之间数据流和控制信息流的传递关系,它是系统物理结构的主要工具。
2.控制结构图的基本符号和规定
(1)每个模块有自身的任务,只有接收到上级模块的调用命令时才能执行。
(2)模块之间的通信只限于其直接上、下级模块,任何模块不能直接与其他上下级模块或同级模块发生通信联系。
(3)若有某模块要与非直接上、下级的其他模块发生通信联系,必须通过其上级模块进行传递。
(4)模块调用顺序为自上而下。在控制结构图中,把一个系统分解为若干模块,实质上是把一件比较抽象、其物理内容不大确定的任务,分解为若干件比较具体的、物理内容比较确定的任务。
控制结构图既可以反映系统整体结构,又能反映系统的细节,能准确反映各组成部分(各模块)及它们之间的联系。
6.1.3模块分解的规则
1.模块独立性
所谓两个模块彼此完全独立,是指其中任一模块在运行时,与另一个模块存在无关。独立性只是一个相对的概念。具有独立功能而且和其他模块之间相互作用少的模块,称为独立性高的模块。
保证模块独立性高是设计一个系统的关键,它具有以下优点:
(1)系统容易开发。系统开发往往由若干人分工合作完成,由于模块之间联系少,接口简单,可以简化合作者之间的协调工作。
(2)系统可靠性高。模块之间的相互影响小,当一个模块出错时,产生波动效应的概率低,从而提高了系统的可靠性。
(3)系统容易维护。在对一个模块进行修改和维护时,不必担心其他模块的内部是否会受到影响。
要衡量模块自身联系是否紧密、与外部的联系是否合理,需引入模块凝聚、模块耦合的概念。
2.模块凝聚
模块凝聚是用以衡量一个模块内部自身功能的内在联系是否紧密的指标,也是衡量模块质量好坏的重要标准。模块按凝聚程度的高低可分为以下五级:
(1)偶然凝聚。一个模块内部各组成部分的处理彼此无关,偶然地组合在一起,这是一种组织得较差的模块,凝聚程度较低。
(2)逻辑凝聚。一个模块内部各组成部分的处理逻辑相似,但功能却彼此不同。这种模块通常包含一个选择控制和若干彼此独立的处理功能。先执行选择功能,再根据选择的结果,控制执行不同的处理功能。由于它的逻辑途径比较复杂,修改困难,因此凝聚程度较差。
(3)时间凝聚。这是指若干处理由于执行时间彼此有关,集中在一起组成的模块。如初始化模块,各处理内容必须在特定时间内执行,而各处理内容彼此无关,故凝聚程度较差。时间凝聚的模块通常要影响到其他许多模块的运行,因此与其他模块之间联系多,修改比较困难。
(4)数据凝聚。模块内部包含若干处理,它们按一定的顺序执行,且前一处理所产生的输出数据,是后一处理的输入数据,这称为数据凝聚模块。这种模块可较明确表述其功能,内部结构较密切,与其他模块联系一般较少,凝聚性较好。
(5)功能凝聚。一个模块只执行一个明确的功能,即上级模块调用它时,它只完成一项确定的任务。这种模块独立性强、便于修改。凝聚程度高,是结构化设计模块的理想目标。一个模块的内部凝聚程度。
3.模块耦合
模块间的信息联系方式,称为模块的耦合,它是衡量模块间结构性能的重要指标。耦合有三种类型:
(1)数据耦合。两个模块间通过调用关系传递被处理的数据称为数据耦合。
(2)控制耦合。两个模块间通过调用关系,不仅传递数据,还传递对运行过程有影响的控制信号。下层模块执行校验功能,校验结果的控制信号传回上层模块,以控制其他模块的运行。如数据正确,调用正常处理模块;如数据异常,或遇到文件尾等不同情况时,调用不同处理模块,这种耦合使一个模块的执行直接影响到接受该控制信号的模块的运行。这对于系统的修改工作是不利的,特别是对自下向上传递的控制信号,影响面更大。因此,应当尽量将这种耦合减少到较低限度。
(3)非法耦合。一个模块与另一个模块内部发生联系,即一个模块中的某些内容在另一模块中以某种方式被引用,称为非法耦合。例如,不经过调用关系,直接使用或修改另一模块中的数据,将控制选择指向另一模块中的某一标号(节、过程)等。
模块间数据耦合是较正常的方式,为保持模块的独立性,模块之间互相传递的数据要尽量少;要努力避免控制耦合,特别是避免自下而上传递控制信号;应消除任何形式的非法耦合。
6.1.4控制结构图的绘制
绘制控制结构图的依据是数据流程图。绘制控制结构图,首先是将上层数据流程图映射为上层控制结构图,由顶层数据流程图开始,逐级下推。
每一层数据流程图(DFD)中的“处理功能”,映射为相应层次控制结构图中的“模块”;而DFD中流人“处理功能”的数据流映射为输入模块的数据流,DFD中流出“处理功能”的数据流映射成从“模块”中输出的数据流。能结构;另一方面应按照模块分解的规则,将凝聚程度低的、或具有控制耦合、非法耦合的结构进行分解。
低层次模块结构的分解,一方面可参照低层次数据流程图的功
分解时采用以下两种不同的方式:
1.以转换为中心结构的分解
如果待分解的模块是一个数据凝聚的模块,即内部包含若干顺序执行且对某些数据进行转换处理,称为以转换为中心的结构。这种模块可分解为输入、处理、输出三大部分。
2.以业务为中心结构的分解
待分解的模块要处理几项逻辑上相似的业务,即它是一个逻辑凝聚的模块。这种模块可以将之分解为一个检查业务类型的模块和一个调度模块,根据不同的业务类型,调度模块调用不同的下层模块,进行不同的处理。
以上两种分解方式常常要混合使用,以达到模块凝聚程度高、模块之间独立性强、易于修改的目的。
6.2数据库设计
6.2.1数据库设计的要求和步骤
1.数据库设计的要求
数据库设计的目标是建立一个合适的数据模型。这个数据模型应当是:
(1)满足用户要求:既能合理地组织用户需要的所有数据,又能支持用户对数据的所有处理功能。
(2)满足某个数据库管理系统的要求:能够在数据库管理系统中实现。
(3)具有较高的范式:数据完整性好、效益高,便于理解和维护,没有数据冲突。
2.数据库设计步骤
数据库设计可以分为概念结构设计、逻辑结构设计和物理结构设计三个阶段。
(1)概念结构设计。这是数据库设计的第一个阶段,在管理信息系统的分析阶段,已经得到了系统的数据流程图和数据字典,现在要结合数据规范化的理论,用一种数据模型将用户的数据需求明确地表示出来。
概念数据模型是面向问题的模型,反映了用户的现实工作环境,是与数据库的具体实现技术无关的。建立系统概念数据模型的过程叫做概念结构设计。
(2)逻辑结构设计。根据已经建立的概念数据模型,以及所采用的某个数据库管理系统软件的数据模型特性,按照一定的转换规则,把概念模型转换为这个数据库管理系统所能够接受的逻辑数据模型。不同的数据库管理系统提供了不同的逻辑数据模型,如层次模型、网状模型、关系模型等。
(3)物理结构设计。为一个确定的逻辑数据模型选择一个较适合应用要求的物理结构的过程,就叫做数据库的物理结构设计。数据库在物理设备上的存储结构和存取方法称为数据库的物理数据模型。
6.2.2概念结构设计
描述概念数据模型的主要工具是E-R(实体一联系)模型,或者叫做E-R图。利用E-R图实现概念结构设计的方法就叫做E-R方法。
1.概念模型的表示方法
E-R图主要是由实体、属性和联系三个要素构成的。在E-R图中,使用了下面四种基本的图形符号。
2.确定系统实体、属性及联系
利用系统分析阶段建立的数据字典,并对照数据流程图对系统中的各个数据项进行分类、组织,确定系统中的实体、实体的属性、标识实体的码以及实体之间联系的类型。
在数据字典中“数据项”是基本数据单位,一般可以作为实体的属性。“数据结构”、“数据存储”和“数据流”条目都可以作为实体,因为它们总是包含了若干的数据项。作为属性必须是不可再分的数据项,也就是说在属性中不能包含其他的属性。
3.确定局部(分) E-R图
根据上面的分析,可以画出部分实体-联系图。
在这些实体中有下画线的属性可以作为实体的码,这几个实体之间存在着1:1、l:n和m:n几种联系。
4.集成完整(总) E-R图
各个局部(分) E-R图画好以后,应当将它们合并起来集成为完整(总) E-R图。在集成时应当注意如下几点:
(1)消除不必要的冗余实体、属性和联系。
(2)解决各分E-R图之间的冲突。
(3)根据情况修改或重构E-R图。
6.2.3逻辑结构设计
逻辑结构设计的任务,就是把概念结构设计阶段建立的基本E-R图,按选定的管理系统软件支持的数据模型(层次、网状、关系),转换成相应的逻辑模型。这种转换要符合关系数据模型的原则。
E-R图向关系模型的转换是要解决如何将实体和实体间的联系转换为关系,并确定这些关系的属性和码。这种转换一般按下面的原则进行:
(1)一个实体转换为一个关系,实体的属性就是关系的属性,实体的码就是关系的码。
(2)一个联系也转换为一个关系,联系的属性及联系所连接的实体的码都转换为关系的属性,但是关系的码会根据联系的类型变化,如果是:
1:1联系,两端实体的码都成为关系的候选码。
1:n联系,n端实体的码成为关系的码。
m:n联系,两端实体码的组合成为关系的码。
(3)具有相同码的关系可以合并。
1.转换关系
2.合并关系
6.3数据库的物理实现
数据库设计的较后阶段是确定数据库在物理设备上的存储结构和存取方法,也就是设计数据库的物理数据模型。
6.3.1建立VFP的数据表
数据表也简称表,在VFP中数据表一般应当包含在数据库中,叫做数据库表(简称库表);但是也可以独立存在,叫做自由表。
数据库逻辑数据模型的一个关系对应了VFP软件中的一个表,关系的属性对应了表的字段,关系框架对应了表结构,关系元组对应了表记录。
1.建立数据表结构
(1)设计数据表。在利用VFP创建一个新的数据表文件以前,应当根据逻辑模型和数据字典先分析和设计数据表。需要确定数据表名称,所含字段名称、类型、宽度以及应当建立的索引字段等。
(2)创建数据表。在VFP的主窗口,单击工具栏“新建”按钮,打开“新建”对话框。在文件类型框中选定“表”选项,单击“新建”按钮,打开“创建”新文件的对话框。
在表设计器中我们已经可逐次键入字段名、类型、宽度及小数位数的信息。
2.数据表记录的输入
在创建数据表时可以根据系统提示直接输入记录,但是也可以暂时不输入记录。没有记录只有结构的数据表叫做空表。
文件有两种打开方式,“以只读方式打开”的文件是不能编辑修改的。因为不需要“共享”数据,我们选择用“独占”方式打开文件。单击“确定”按钮后数据表文件被打开。
(3)追加记录。首先在主菜单的“显示”下拉菜单中,单击“刘览”选项,打开表的浏览窗口。
①追加一条记录。②连续追加。③成组追加。
3.浏览数据表记录
6.3.2建立VFP的数据库
前面建立的表都是自由表,而实际上一个应用系统总是由多个相关表构成的。要在多个自由表之间建立联系,必须通过数据库来实现。
数据库本身是不存储数据的,它只存储表、视图及它们之间的关系等。在数据库中的表叫做数据库表,数据库为数据表提供了数据字典、各种数据保护和数据管理功能,所以数据库表比自由表要完善得多。一个数据库是由数据库文件(。DBC)、数据库备注文件(。DCT)和数据库索引文件(。DCX) H类文件组成的。
l.建立数据库文件
2.创建数据库表
可以直接在数据库中建立数据表,也可以将自由表添加到数据库中,但是不能将另一个数据库中的表拉到当前数据库中来。可以在同一个数据库中建立多个表。
(1)添加数据表。打开选定数据库的“数据库设计器”窗口,在“数据库设计器”工具栏中,单击“添加表”选项,将会弹出“打开”窗口,选择要添加的表后,单击“确定”按钮,就可以把一个自由表添加到当前数据库中,并将自由表变成数据库表。
(2)创建数据库表。也可以在数据库设计器中直接创建数据表。首先单击“数据库设计器”工具栏的“新建表”按钮,然后在对话框中单击“新建表”按钮,将打开数据库“表设计器”。
通过这几个控制区信息的描述,可以实现数据库对数据表的管理功能。
数据库表添加或创建完成以后,关闭数据库设计器窗口。包含了数据表的数据库文件就保存在外存储器中。
3.数据库文件的打开与关闭
(1)数据库文件的打开。一般通过单击主菜单“文件”下拉菜单的“打开”功能。在弹出的“打开”对话框窗口选定数据库文件后,单击“打开”按钮打开。
在打开一个数据库表的时候,系统也会自动先打开其数据库文件,然后再打开选定的表。
(2)数据库文件的关闭。除了可以通过像关闭其他Windows窗口一样,关闭“数据库设计器”窗口来关闭当前数据库以外,还可以使用专门的命令来关闭数据库。
6.3.3设置数据表的索引
1.索引表和索引文件
用户对数据表常常会有不同的需求,为了加快数据的检索、显示、查询和打印速度,就需要对文件中的记录顺序进行重组。实现的方法一般有两种:一种叫做排序;另一种叫做索引。
排序的作用是按指定字段或字段组中数据值的大小顺序,以递增(升序)或递减(降序)方式重新排列全部数据记录,并生成一个新的数据表文件。
索引不建立一个新的数据表文件,只是按照给定字段表达式值的大小,生成一个索引表,并使数据表中的记录按索引表的要求以递增(升序)或递减(降序)顺序显示。
索引技术除可以重新排列数据表记录的前后顺序外,在建立数据表间的关联时,或者利用SQL语言建立查询、视图时,都必须靠索引技术来支持。
2.索引关键字的类型
索引关键字:是由一个或若干个字段构成的索引表达式。索引表达式的类型决定了不同的索引方式。VFP系统提供了四种不同的类型,它们分别是主索引、候选索引、普通索引和惟一索引。
(1)主索引。主索引是能够惟一地确定数据表中一条记录的字段或字段组合表达式;要求该字段或字段组合表达式的值,在数据表的全部记录中都不能出现重复。
主索引只能在数据库表中创建和使用,而且一个数据表只能指定一个主索引。表的主索引就相当于关系的主码。
(2)候选索引。候选索引像主索引一样,是能够惟一地确定数据表中一条记录的字段或字段组合表达式。但是,一个数据表允许建立多个候选索引,可以在数据库表或自由表中创建候选索引。如果将一个包含了重复数据的字段指定为候选索引,系统会返回一个出错信息,并禁止创建该索引。表的候选索引相当于关系的候选码。
(3)普通索引。普通索引允许数据表中各记录的索引字段或字段组合表达式的值相同,而且既允许在数据库表中创建,也允许在自由表中创建。
(4)唯一索引。唯一索引是VFP为保持与低版本软件的兼容性而保留的一种索引类型,一般情况下很少使用。它允许数据表中各记录的索引字段,或字段组合表达式的值相同,但是在索引表中只保留数据表中与索引字段值相同的第一条记录。
3.创建索引文件
可以使用命令建立索引文件,但是利用表设计器创建索引文件更加直观、方便。结构复合索引文件可以在创建数据表时建立,也可以对已经建立好的数据表创建或修改索引。
4.索引的操作
(l)打开与关闭。要使用索引,必须先要打开索引。结构复合索引总是随着数据表打开,一旦数据表文件关闭,相应的索引文件也就自动关闭了。
(2)确定主索引。结构复合索引打开后,其中的索引标识(Tag)并不起作用,数据表记录顺序仍然保持着原始自然排列。必须要执行确定主索引的操作后,数据表记录的排列顺序才会跟着变化。
在程序中常常使用命令方式确定当前主索引。
(3)删除索引标识。要删除结构复合索引文件中的索引标识,应当打开数据表文件,并打开其表设计器对话框。在“索引”页卡中选定要删除的索引标识后,单击“删除”按钮删除。
6.3.4创建数据表之间的关联
对于数据库中各相关数据表之间的联系必须通过建立关联来实现。
数据表是和关系相对应的,所以数据表之间的联系也可以分为一对一、一对多和多对多三类。但是在实际处理时,往往把一个多对多的联系分解成两个一对多的联系处理。
1.创建关联
在VFP中,表间的联系有“永久性关联”和“临时性关联”两种:临时性关联只是在使用时临时建立的表间联系,一旦关闭数据表则临时性关联也就消失了;永久性关联是被存放在数据库中的数据表间联系,它将随数据库长期保存,随着数据库的打开而打开、关闭而关闭。
在创建数据表之间的关联时,当前表叫做父表,要关联的表叫做子表。必须保证两个要建立关联的数据表中存在同名字段;同时要求每个数据表事先分别对该字段建立了索引。
(1)建立表间的一对一关系。首先,要使两个表都具有同一属性的字段;其次,定义父表与子表中同名宇段为主索引字段或候选索引字段。由于两个表中的同一属性的字段值都是惟一的,因此两个表之间的关联就是“一对一”的。
(2)建立表间的一对多关系。首先,要使两个表都具有同一名称、属性的字段;其次,定义父表中该字段为主索引字段或候选索引字段(其字段值是惟一的),子表中与其同名的字段为普通索引字段。由于两个表中的同一属性的字段值是一对多的关系,因此可以创建两个表之间的“一对多”的关系。
2.调整或删除关联
修改主要有两个方面:
(l)删除关联。在数据库设计器对话框窗口中,用鼠标左键单击关联线,该连线变粗了则说明它已经被选中。如果要删除可敲[Del]键,也可以单击鼠标右键在弹出对话框窗口中单击“删除关系”选项。
(2)编辑关联。在数据库设计器对话框窗口中,用鼠标左键单击关联线,该连线变粗了则说明它已经被选中。在主菜单“数据库”选项的下拉菜单中单击“编辑关系”选项,也可以单击鼠标右键在弹出对话框窗口中单击“编辑关系”选项,这样将会打开其对话框窗口。
可以在“表”和“相关表”的下拉列表框中重新选择新的相应索引字段。
6.3.5创建视图
在数据库的概念结构设计中,用户的局部概念模式是全局概念模式的子集,叫做用户模式、外模式,它是从用户的观点看到的数据库,所以也叫做用户的视图。
在VFP中,视图是数据库的一个部分,分为本地视图和远程视图两类。本地视图是利用本地数据库表、自由表及其他视图建立在本地服务器上的视图。远程视图是利用远程服务器中的数据建立的视图。视图也以文件的形式保存在存储器中,文件扩展名为。VUE.视图是一种特殊类型的数据表,它往往由一个或多个表(或视图)中的部分字段或部分记录组成。虽然从用户的角度看,视图也像数据表一样有自己的名字,相应的字段、记录,具备了一般数据表的特征,可是在实际存储器中并没有这样的数据实体;在数据库中仅存放了与关联数据表相应的连接关系和操作要求。所以该视图可称为“虚表”或逻辑表。一般建立视图的目的有三个:
①数据库系统是供多用户使用的,不同的用户只能查看与自己相关的一部分数据,以保障数据的安全和完整。视图可以为每个用户建立自己的数据集合。
②为了保证数据表具有较高的范式,往往将一个数据集合分解成多个相关的数据表。而在使用多个表的数据时,将各表中有用的数据集中到一个视图是较方便的办法。
③简化对数据库的操作管理。只要事先将各表中相关数据项集中放在一个视图中,通过视图就可以同时更新各表中的数据。
6.4代码设计
代码是计算机和人都容易理解的符号(或语言),能够实现人和计算机的沟通。代码的重要性表现在以下几个方面。
。可以惟一地标识一个分类对象(实体)。
。加快输入,减少出错,便于存储和检索,节省存储空间。
。使数据的表达标准化。简化处理程序,提高处理互效率。
代码也叫信息编码,是作为事物(实体)惟一标识的、一组有序字符组合。它必须便于计算机和人识别、处理。
6.4.1代码设计方法
1.代码设计的原则
。惟一性:是区别系统中每个实体或属性的惟一标识。
。简单性:尽量压缩代码长度,可降低出错机会。
。易识别性:为便于记忆、减少出错,代码应当逻辑性强,表意明确。
。可扩充性:不需要变动原代码体系,可直接追加新代码,以适应系统发展。
。合理性:必须在逻辑上满足应用需要,在结构上与处理方法相一致。
。规范性:尽可能采用现有的国标、部标编码,结构统一。
2.代码的类型
代码的类型是指代码符号的表示形式,进行代码设计时可选择一种或几种代码类型组合。
(1)顺序码。它也叫序列码,用连续数字作为每个实体的标识。编码顺序可以是实体出现的先后,或实体名的字母顺序等。其优点是简单、易处理、易扩充、用途广;缺点是没有逻辑含义、不能表示信息特征、无法插人、删除数据将造成空码。
(2)重复码。采用与原来手工系统相同的编码,叫做重复码。其优点是容易被原系统人员接受、易实现、便于推广;缺点是不能任意更改、可能不尽合理。
(3)成组码。它是较常用的一种编码、它将代码分为几段(组),每段表示一种含义,每段都由连续数字组成。其优点是简单、方便、能够反映出分类体系、易校对、易处理;缺点是位数多不便记忆,必须为每段预留编码,否则不易扩充。例如:身份证编码共17位:
(4)表意码。它将表示实体特征的文字、数字或记号直接作为编码。其优点是可以直接明白编码含义、易理解、易记忆;缺点是编码长度位数可变,给分类、处理带来不便。例如:网站代码:
(5)专用码。它是具有特殊用途的编码,如汉字国标码、五笔字型编码、自然码、ASCll代码等。
(6)组合码。它也叫合成码、复杂码。它由若干种简单编码组合而成,使用十分普遍。其优点是容易分类、容易增加编码层次、可以从不同角度识别编码、容易实现多种分类统计;缺点是编码位数和数据项个数较多。
3.代码的校验
为了减少编码过程中的错误,需要使用编码校验技术。这是在原有代码的基础上,附加校验码的技术。校验码是根据事先规定好的算法构成的,将它附加到代码本体上以后,成为代码的一个组成部分。当代码输入计算机以后,系统将会按规定好的算法验证,从而检测代码的正确性。
常用的简单校验码是在原代码上增加一个校验位,并使得校验位成为代码结构中的一部分。系统可以按规定的算法对校验位进行检测,校验位正确,便认为输入代码正确。