数据库设计规范标准.docx
《数据库设计规范标准.docx》由会员分享,可在线阅读,更多相关《数据库设计规范标准.docx(14页珍藏版)》请在冰豆网上搜索。
数据库设计规范标准
关系型数据库设计规范
文档类别使用对象
文档类别
该文档是通用软件公司的关系型数据库的设计规范,是技术文档。
使用对象
该文档使用人员包括:
Ø开发本部总经理
Ø各产品部、事业部的经理、项目经理、设计人员
Ø软件中心负责人、设计人员
Ø公司总经理
1.概述
1.1简介
本文档总结了公司进行多年来的SYBASE数据库设计经验,目的将公司进行数据库设计的经验积累下来,实现设计经验的复用,为项目评审与项目质量保证提供进行检查的依据。
本规范从数据库设计的目的、数据库的各个特征、数据库的规范化等各个方面进行论述,对进行SYBASE数据库的设计提供了很好的依据。
1.2术语定义
1.3参考资料
《Powerbuilder开发设计中的数据库设计》晓通数据库研究与发展中心公司
1.4版本更新记录
版本/修订版
日期
修改记录
备注
1.0
10/10/99
初始版本
2.数据库设计的目标
好的数据库物理设计应当充分考虑应用的需求和开发工具的特征,应当充分利用和挖掘数据库的功能。
一流的数据库设计会给整个应用系统带来以下的好处:
Ø维护容易。
当需求发生变化时,优良的数据库设计会使应用系统容易地适应这种变化。
Ø编程简单。
由于数据库设计充分挖掘了数据库的功能,所以应用程序的复杂度可以明显降低。
Ø加快开发速度。
因为数据库设计充分地考虑了需求和开发工具的特征,所以开发人员会感到左右逢源,得心应手,从而可以加快开发速度。
Ø系统具有良好的整体运行效率。
3.数据库的特征
Ø完整性约束。
完整性约束允许在表上定义某种约束条件,这些条件作为表定义的一部分存在,从而强制表中的数据满足一定的规则。
Ø存储过程。
存储过程是由流控制语句(if…else)和SQL语句书写的过程,这个过程经过编译和优化后存储在数据库服务器中,使用时只要调用即可。
Ø触发器。
触发器是一种特殊的存储过程,不同的是这种过程不是由程序调用来执行,而是通过数据库数据的更新自动地“触发”执行。
Ø事务处理:
事务是最小的逻辑工作单元,在这个单元中对数据库所有的更新要么全成功要么全失败。
Ø并发处理。
允许用户在没有冲突的情况下更新表中不同的行。
行级锁和页级锁对联机事务处理非常有用。
Ø序号生成器。
数据库可以自动生成连续的序号供应用程序使用。
Ø遵守工业标准的SQL。
Ø视图。
视图是原始数据库表的变换,可给应用程序带来安全性、简单性和独立性。
Ø分布处理。
数据可以分布在网络的多个点上,数据本身支持分布查询和分布修改。
Ø数据复制。
数据可以在网络的多个数据库点相互复制。
3.1完整性约束
完整性约束是数据库用于维护数据库完整性的一种机制。
这种约束是表定义的一部分,是内部的。
与在应用程序中维护数据库的完整性不同,它的代价小而且性能高。
完整性约束有以下两点作用:
1.使企业的规则与数据库联系起来。
2.防止操作员或终端用户输入错误的数据,破坏数据库的完整性。
完整性约束有以下几种:
●notnull约束
缺省值
●unique约束
●primarykey约束
●foreignkey约束
●check约束
3.1.1notnull约束
notnull的含义是列中不能有空值。
notnull在创建表时定义。
notnull约束限定了列中必须有值,但不能限定列中可以有什么值,因此它常常与其它的约束配合使用。
3.1.2缺省值
缺省值是在数据录入时,若用户没有输入数据,数据库自动输入的值。
下面是定义缺省时应注意的一些事项:
要确保列宽对缺省值来说足够大。
要注意缺省值与规则间的冲突,确保缺省值为规则所允许,否则,缺省值会被规则忽略掉。
3.1.3unique约束
唯一列是这样的列,它的值不能在表中重复出现。
注意,唯一列与主键不同,主键可用来唯一地标识表中的一行(不能有空值),而唯一列仅仅表示该列的值不能在表中重复出现(可以有空值)。
可以在一个列上定义唯一列,也可以在表上定义唯一列,也可以在表上对多个列定义唯一列。
3.1.4primarykey约束
每个表中都应有主键,主键唯一标识表中的行。
选择主键应注意以下几点:
●选择数据是唯一的列。
●选择数据值不会改变的列。
主键的目的是唯一地标识一行,不含有用于其它目的的数据,选择一般不需要改变主键值的列。
●选择不含有空值的列。
根据定义,主键列不允许输入空值。
●选择短的和数值型的列。
●避免选择联合主键。
虽然允许联合主键,但很难满足以上四点要求。
3.1.5参照完整性约束
参照完整性约束用来约束两个表间的关系。
1.空值和外部键
对于缺省(无notnull或check语句)的情况,外部键约束为组合外部键实施“无匹配”规则。
通过使用check和notnull也可使用全部或部分规则:
●在组合外部键中实施全匹配规则,要求键的全部要么都为空要么都不为空。
●在一般情况下,不能使用参照完整性在组合键中实施部分匹配规则。
部分匹配规则要求键的非空部分出现在引用表的主键的对应部分上,这种情况一般要用触发器来处理。
2.父表和子表的关系
父表和子表的关系决定于在子表的外部键上定义的其它类型的完整性约束。
●在外部键上没有约束。
●在外部键上有非空约束。
●在外部键上有unique约束。
●在外部键上有unique和notnull约束。
3.1.6check约束
当需要根据逻辑表达式来限定列的值域时,可以用check完整性约束。
check约束的写法和where子句的写法一样,但它有如下的限制:
●条件必须是能够利用更新行中的值来求值的表达式。
●条件中不能有子查询或序号。
●条件中不能含有函数。
●条件中不能含有伪列。
3.2存储过程
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,使用时只要调用即可。
使用存储过程有以下优点:
●存储过程的能力大大增强了SQL语言的功能和灵活性。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
●可保证数据的安全性和完整性。
♦通过存储过程可以使没有权限的用户在控制之下间接地寸取数据库,从而保证数据的安全。
♦通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
●在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。
这种已经编译好的过程可极大地改善SQL语句的性能。
由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
●可以降低网络的通信量。
●使体现企业规则的运算程序放入数据库服务器中,以便:
♦集中控制。
♦当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。
3.3触发器
触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
数据库触发器有以下的作用:
●安全性。
可以基于数据库的值使用户具有操作数据库的某种权利。
♦可以基于时间限制用户的操作。
♦可以基于数据库中的数据限制用户的操作。
●审计。
可以跟踪用户对数据库的操作。
♦审计用户操作数据库的语句。
♦把用户对数据库的更新写入审计表。
●实现复杂的数据完整性规则。
♦实现非标准的数据完整性检查和约束。
触发器可产生比规则更复杂的限制。
与规则不同,触发器可以引用列或数据库对象。
♦提供可变的缺省值。
●实现复杂的非标准的数据库相关完整性规则。
触发器可以对数据库中相关的表进行连环更新。
♦在修改或删除时级联修改或删除其它表中的与之匹配的行。
♦在修改或删除时把其它表中的与之匹配的行设成NULL值。
♦在修改或删除时把其它表中的与之匹配的行级联成缺省值。
♦触发器能够拒绝或“回退”那些破坏相关完整性的变化,取消试图进行数据更新的事物。
当插入一个与主键不匹配的外部键时,这种触发器会起作用。
●同步实时地复制表中的数据。
●自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。
3.4事务处理
事务是这样一种机制,它确保多个SQL语句被当作单个工作单元来处理。
事务具有以下的作用:
●一致性:
同时进行的查询和更新彼此不会发生冲突,其他用户不会看到发生了变化但尚未提交的数据。
●可恢复性:
一旦系统故障,数据库会自动地完全恢复未完成的事务。
3.4.3事务与一致性
事务是完整性的单位,一个事务的执行是把数据库从一个一致的状态转换成另一个一致的状态。
因此,如果事务孤立执行时是正确的,但如果多个事务并发交错地执行,就可能相互干扰,造成数据库状态的不一致性。
在多用户环境中,数据库必须避免同时进行的查询和更新发生冲突。
这一点是很重要的,如果正在被处理的数据能够在该处理正在运行时被另一用户的修改所改变,那么该处理的结果会是不明确的。
不加控制的并发存取会产生以下的几种错误。
丢失修改(lostupdates)
当多个事务并发修改一个数据时,不加控制会得出错误的结果,一个修改会覆盖掉另一个修改。
这种丢失修改叫“写—写依赖”(Write—WriteDependency)。
读的不可重复性
当多个事务按某种时间顺序存取若干数据时,如果对并发存取不加控制,也会产生错误。
这叫做“读—写依赖”(Read—WriteDependency)。
脏读(dirtydata),读的不一致性
这种脏读或说读的不一致性叫“写—读依赖”(Write—ReadDependency)。
光标带来的当前值的混乱
事务在执行过程中它在某个表上的当前位置是由光标表示的。
光标指向当前正处理的记录。
当处理完该条记录后,则指向下一条记录。
在多个事务并发执行时,一个事务的修改可能产生副作用,使与这些光标有关的事务出错。
未释放修改造成连锁退出
一个事务在进行修改操作的过程中可能会发生故障,这时需要将已做的修改回退(Rollback)。
如果在已进行过或已发现错误尚未复原之前允许其它事务读已做过的修改(脏读),则会导致连锁退出。
一事务在对一表更新时,另外的事务却修改或删除此表的定义。
3.4.4事务和恢复
数据库本身肩负着管理事务的责任。
事务是最小的逻辑工作单元,在这个工作单元中,对数据库的所有更新工作,要么必须全部成功,要么必须全部失败(回退)。
只要应用程序指定了某段程序为一个事务并做了相应的处理,数据库系统会自动维护事务本身的特性。
3.5并发处理
数据库的特点就是数据的集中管理和共享。
在通常情况下总是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。
因此,数据库管理系统的一个重要任务就是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确的结果。
事务并发执行时若不加控制的话将导致不正确的结果和数据库的不一致状态。
为保证数据库数据正确地反映所有事务的更新以及在一事务修改数据时其它事务不同时修改这个数据,数据库系统用锁来控制对数据的并发存取。
3.5.3死锁
当事务T1想要锁住的资源已被事务T2锁住,而T2想要锁住的资源也被T1锁住时,T1要等待T2释放资源,T2要等待T1释放资源。
这样,两个事务互相等待造成死锁。
当数据库检测到死锁时,检测到死锁的事务被告知出错,回退当前语句。
通常被告知出错的事务应显式地回退整个事务,但用户也可不管被锁住的资源直接提交或等会儿再重新做。
数据库会自动检测到死锁并恢复。
在应用中,为避免死锁,应在事务的开始加尽量强的锁。
在应用系统中,存取同一张表的各种程序应使用相同的次序,这会避免死锁。
3.5.4读一致性
读一致性是数据库事务处