《软件技术基础》之《数据库设计》
数据库设计理论
关系模式设计问题
关系模式的五元组表示:R(U, D, DOM, F)
- R:关系名
- U:组成该关系的属性名集合
- D:属性组U中属性所来自的域
- DOM:属性向域的映像集合
- F:属性间数据的依赖关系集合
关系模式的简化三元组表示:R(U, F )
不好的模式举例
这个模式存在两个问题:
- 数据冗余:浪费存储空间,引起异常
- 操作异常:更新异常、删除异常、插入异常
模式分解
模式分解是解决数据冗余和操作异常的一种方法。
将前面的表按依赖关系集合F分成三个子表:
数据依赖
概念
- 是现实世界属性间相互联系的抽象;
- 是数据内在的性质;
- 是语义的体现。
类型
- 函数依赖(Functional Dependency,简记为 FD)
- 多值依赖(Multivalued Dependency,简记为 MVD)
函数依赖
概念
- 是属性(列)之间的联系;
- 是属性之间在语义上的关联特性;
- 是两个属性或属性集之间的约束。
符号说明
- R表示一个有关系的模式
- U={A1,A2,…,An}是R的所有属性的集合
- F是R中函数依赖的集合
- r是R所取的值
- t[X]表示元组t在属性X上的取值,例如:t[Dname]= ‘ 杨勋 ’
定义
函数依赖图
左部(X)称为决定因子,右部(Y)称为依赖因子。
类型
逻辑蕴涵
定义
文字描述
若一个新的函数依赖不在集里,但能从集合里根据一定的规则推导出来,就说那个集合逻辑蕴涵这个新的函数依赖。
如果一个函数依赖能够由集合中的其他推出,则该函数依赖是多余的。
用函数依赖定义码
包含在任何候选码中的属性称为主属性(Prime Attribute)。不包含在任何候选码中的属性称为非主属性(Non-Key Attribute)。
有时,单个属性是码;有时,整个属性组是码,称为全码(All-Key)。
模式分解
定义
作用
- 对关系模式进行分解,使之表达的语义概念单纯化;
- 帮助消除不良设计中的一些问题,如冗余、不一致和异常。
时间代价
分解之后,检索操作需要做笛卡尔积或连接操作。
规范化
规范化主要作为验证和改进逻辑数据库设计的工具,使得逻辑设计能够:
- 满足特定约束;
- 避免不必要的数据重复。
范式(Normal Forma,NF)
概念
范式是一种关系的状态,是衡量关系模式的标准。
种类
1NF,2NF,3NF,BCNF
范式的种类与数据依赖有着直接的联系。
作用
数据冗余浪费存储空间,导致数据库难以保持一致性。
范式确保数据库模的一致性。
为确定特定关系是否符合范式,需要检查关系中属性间的函数依赖,而不是检查关系中的当前实例。
1NF
在关系模式R的每个关系r中,如果每个属性值都是不可再分的原子值,那么称R是第一范式(1NF)的模式。
满足1NF的关系称为规范化的关系,否则称为非规范化的关系。
关系数据库研究的关系都是规范化的关系。
1NF不允许出现“表中有表”的现象。
2NF
只有在主键是复合属性下才可能不符合2NF
2NF分解算法
将关系模式R分解成2NF模式子集。
3NF
需要满足的两个条件:
- R中的非主属性相互独立;
- R中的非主属性函数依赖于主键。
3NF分解算法
将关系模式R分解成3NF模式子集。
2NF & 3NF
定理:如果R是3NF模式,那么R也是2NF模式。
局部依赖和传递依赖是关系模式产生数据冗余和异常的两个重要原因。由于3NF模式中不存在非主属性对候选键的局部依赖和传递依赖,因此3NF消除了很大一部分存储异常,具有较好的性能。而对于非1NF、1NF和2NF的关系模式,由于它们的性能较差,通常不宜作为数据库模式,需要将这些关系模式变换为3NF或更高级的范式,这种变换过程称为“关系的规范化处理”。
BCNF
原因:3NF模式中并未排除主属性对候选键的传递依赖。
BCNF分解算法
将R无损分解且保持依赖地分解成3NF模式集。
模式设计原则
关系模式分解一般应具有3个特性:
- 达到BCNF,或3NF;
- 无损分解;
- 保持函数依赖。
一个好的模式设计方法应符合3条原则:
- 表达性:数据等价和语义等价,即无损分解和保持依赖集
- 分离性:关系中只存储有直接关系的属性值;清除冗余和异常现象
- 最小冗余性:模式个数和模式中属性总数应最少
优化流程:
数据库应用设计方法
E-R模型
- 面向问题的概念模型
- 用简单的图形方式(E-R图)描述显示世界中的数据
- E-R图中不涉及数据在数据库中的表示和存取方法
- 非常接近人的思维方式
实体
- 是客观世界中描述客观事物的概念,是一个数据对象
- 用方框表示,方框内注明实体的名称
属性
- 实体具有的某种特性,用来详细描述一个实体
- 用椭圆形框表示,椭圆形框内注明属性的名称,并用无向边将属性与对应的实体连接起来
- 实体的主键用下划线加以标注
联系
- 一个或多个实体之间的关联关系
- 用菱形框表示,菱形框内注明联系的名称,并用无向边将其与相关的实体连接起来
- 联系也可能会有自己的属性,用于描述联系的特征,但联系本身没有标识符
数量关系表示
两个实体型之间的联系:
-
一对一联系(1:1)
-
一对多联系(1:n)
-
多对多联系(m:n)
同一实体型之内的联系:
多个实体型之间的联系:
属性分类
简单属性和复合属性
简单属性是不可再分的属性
复合属性是可以再划分为更小的部分(即属性可以嵌套)
单值属性和多值属性
多值属性的2种变换方法:
- 方法一:将原来的多值属性用几个新的单值属性来表示。例如患者的联系电话可以用家庭电话、办公电话、移动电话等进行分解
- 方法二:将原来的多值属性用一个新的实体类型表示。这个新的实体类型和原来的实体类型之间是 1∶N联系,新的实体依赖于原来的实体而存在,因此称新的实体为弱实体。
在E-R模型中,弱实体用双线矩形框表示,与弱实体相关的联系用双菱形框表示
派生属性
- 通过具有相互依赖的属性推导出来的属性称为派生属性
- 用虚线椭圆形框表示,虚线椭圆形框内注明派生属性的名称,并用无向边将派生属性与对应的实体连接起来
空值属性
当实体在某个属性上没有值时应该用空值(Null Value)。
数据库设计方法
软件的生命周期可以分为6个阶段:
需求分析
在软件的生命周期中,需求分析阶段是最为重要的一个阶段。
需求分析步骤:
数据字典
模型设计(概念、逻辑、 物理)
概念设计
概念设计的目标是生成能够准确反映用户组织和使用信息需求的抽象结构,即概念模式。
设计人员把客观世界的具体需求通过提炼和抽象,转换为信息世界的概念模式,再将概念模式转换为数字化的数据模型。
最常用的模式就是 实体-关系模型(E-R)
E-R方法
全局E-R视图集成过程中的冲突消除
逻辑结构设计
ER转换
实例:
模式优化
用关系规范化理论对数据模型进行优化
- 确定范式的使用
采用各级范式来确定关系模式中的各种关系是否符合规范,检测数据依赖关系、函数依赖关系,传递依赖等。 - 实施规范化
根据需求规则说明书,分析实际应用环境中,确定对关系模式的选择和使用是否得当,以及是否需要调整和改进。
物理设计
运行与维护
DB连接访问
ODBC的体系结构:
ODBC的开发使用:
ADO
JDBC
数据库高级开发技术
游标
游标操作
存储过程
存储过程类型:
示例:
触发器
触发器操作:
函数
函数的优点:
自定义函数:
存储过程和自定义函数的区别:
嵌入式SQL(ESQL)