欢迎访问文稿网!

建立数据库

范文之家 分享 时间: 加入收藏 我要投稿 点赞

建立数据库

    8.6 建立数据库

    数据库是任何基于数据的系统的核心,在创建高质量数据库方面投入的时间多少将在很大程度上决定系统整体的质量和成功与否。

    建立一个数据库可以分成以下四个部分:

    (1)表关系的规范化和完善。

    (2)实体、数据和关系完整性的判别。

    (3)创建数据的物理示意图。

    (4)创建数据库对象(触发器、存储过程和索引)。

    开发物理示意图使用数据分析的产物来表示表、列和表间的关系。列分配了相应的数据类型,甚至可能有扩展属性,例如编辑样式、初始值、有效性验证规则、显示格式等。要得到关于扩展属性完整的描述。

    每个表(table)有或者应该有一个主键。主键是表中带有唯一标志的列或多列。关系数据库的本质是通过到另一个表的主键的数据引用来表示表之间的逻辑关系。引用的列是外键,而且它指的是外表的主键。大多数表连接与外键和主键的匹配有关。

    表间的关系同主键和外部键都可以在此定义,表分析将决定大部分表关系和如何实现它们。用户可以而且也应该使用规范化技术来优化实体和它们之间的相互关系。

    8.6.1 规范化

    在数据建模阶段,用户使用规范化技术来消除实体之间某种类型不必要的依赖性。这种技术还突出了数据中的约束和独立性,有助于数据建模人员了解数据的本质。

    通过规范化数据库设计,可以减少存储的冗余数据量,减轻数据维护工作,减少存储的要求,大大提高数据库完整性。利用规范化,数据完整性更容易增强,因为数据在数据库中只驻留在一个位置。

    正如本章后面说明示例中那样,实体记录的大小也随着规范化而减少。对于像Sybase或Microsoft SQL Server这样的DBMS,行的长度越小,则每个数据页面可存储的数据越多。

    由于只须读取较少的页面,因此改善了存储要求的I/O处理。

    但这个过程仍有一些缺点。由于用户分解了属性并将它们放入单独的实体中,因此用户要访问一个完整的信息记录就必须执行这些实体之间的连接。这样,用户就在访问多个实体的数据页面,影响了I/O活动的CPU资源,因为服务器不得不确定接收指定信息的最好方法。

    有关此方面的技术讨论超出了本书的范围,可参看专门的DBMS书籍。

    可达到的较高层次的常规范式(如3NF)及以上产生设计良好的数据库,具有较高级别的数据独立性。数据库模型中的实体如果满足某种条件的话被称作拥有某种范式。每一层范式都建立在前一层的基础上。

    为了帮助用户更好地理解规范化技术,下面用示例来说明规范化的每一步。

    数据规范化的五个层次如下:

    (1)消除重复的数据组(1NF,或第一范式)。

    (2)消除多余的数据(2NF,或第二范式)。

    (3)消除不依赖于键的列(3NF,或第三范式)。

    (4)分离独立的多个关系(4NF,或第四范式)。

    (5)分离语义相关的多个关系(5NF,或第五范式)。

    本节用于说明规范化方法的示例包括以下信息:

    (1)订单输入系统的非规范化属性。

    (2)订单号。

    (3)订单生成日期(定单生成日期)。

    (4)顾客名(顾客名)。

    (5)顾客地址。

    (6)托运号。

    (7)托运地址。

    (8)产品说明1 to n。

    (9)产品定量1 to n。

    (10)产品折扣1 to n。

    1.第一范式

    要消除重复的数据组,为每个相关属性的数据组创建一个单独的实体,并且为此新实体分配一个主键和外部键将其链接到父实体。

    在非规范化属性的示例中,每个订单可以拥有多个产品,但只能有一名顾客,所以每个订单可以有五种不同的产品供应给一名顾客。

    如果将这些订单流水项目属性移到一个单独的实体中,那么对于每个产品就不必重复其他信息。就这一点来说,这些实体处于第一范式。

    用户现在能够使用订单号很容易访问到订单和订单流水项目两个实体:

    订单号在订单实体中起主键的作用,在定单流水项目实体中作为外部键。

    如表8-7所示说明了订单订单流水项目实体,订单号作为主键和两个实体之间的关系。

    表8-7 主键和两个实体之间的关系

    img150

    注释:

    当用户不想取消重复数据组时,有时应用这个规则稍微有点困难。如果重复值的数目有限需要按列访问而不是按行访问,那么就将它们留在父实体中。例如,考虑对于每个定单用户跟踪四个服务代理。如何输入和报告这些数据将决定它们是留在父实体中还是接收自己的实体。

    2.第二范式

    要消除冗余的数据,用户需要为那些不完全依靠实体全部主键的属性创建单独的实体。

    在示例中,订单实体的属性顾客名和顾客地址仅仅依靠于顾客Number,而其余的列则完全依赖于订单号。

    因此,可以从实体中删除顾客名和顾客地址并创建它们自己的实体,如表8-8所示。这些实体处在第二范式下。

    表8-8 顾客实体添加到实体池

    img151

    

    进一步检查还导致用户修改定单流水项目实体,因为属性产品说明和产品折扣只依赖于产品号,而定单定量则依赖于订单号和产品号。

    因此用户可以删除产品说明和产品折扣,创建它们自己的实体,如表8-9所示。这些实体处在第二范式下。

    表8-9 将产品实体添加到实体池

    img152

    3.第三范式

    要消除不是相互依赖的非键列,则为这些属性创建单独的实体。

    托运地址不仅依赖于订单号键而且也依赖于托运号。

    因此需要创建一个新实体Invoice来保存这个属性并将其从订单实体中删除。这些实体现在处于第三范式下,如表8-10所示。

    表8-10 将Invoice 实体添加到实体池

    img153

    第三范式对于大多数数据库来说已足够了,但它还不能完全处理下面的情形:一个实体有两个或多个候选键,它们是组合键并且至少有一个公用属性。为了弥补这种不足,引入了修正的第三范式,称为Boyce Codd Normal Form(BCNF)。

    另外还有两个更高级的范式。一些数据模型可能需要使用这些范式来建立更完善的数据库模型。

    4.第四范式

    第四范式是用来分离多个独立关系的。

    一般情况下,一个实体不能拥有多于一个的一对多(1∶n)或多对多(n∶m)的关系并且该关系不直接与另一个关系相联系。

    5.第五范式

    第五范式用于分离语义相关的多个关系。用户可能想要分离逻辑相关的多对多关系。使用第五范式可以做到这一点。

    技巧:为了实现3NF的数据库设计,一个简单的规则就是记住每个属性都必须依附于该键且只能包含定义该键的那些项目。

    以前提到过,第三范式对于大多数数据库已足够了,但也有一些需要进一步的规范化。

    到此规范化阶段,用户拥有了一个可操作的数据库结构,用户所需要的是一个访问它的系统。

    用户必须用在分析阶段所收集的需求来创建一为实现而开发的设计。另一步是创建一个数据库设计,实际上,这是与最终层次的规范化相反的一步。这个过程叫做非规范化。

    8.6.2 非规范化

    非规范化考虑了表和数据的实际用途,打破了一个些规范化规则以在某些实体中提供重复的或无关的属性。

    非规范化的优点是减少了连接,有助于解决一些导致大量计算的聚类问题。如果对比一下附加列的大小和单独表及相关属性的系统开销,则非规范化可能要求更少的存储空间。

    然而如果这些列位于它们自己的表中,则要求的存储内容为:一个主键,它的一部分是父表的一个外部键,以及由于每个行的四字符列。例如,如果父表的主键是一个八字符列,存储三行的总存储需求为36字节。

    但是非规范化通常是用于数据访问而不是数据修改,因此用户有关权衡两者的利弊以及数据库的重点是什么:是查询还是数据输入。

    8.6.3 确保数据完整性

    如果完成了所有的分析、设计甚至实现工作,结果所得到的整个系统和数据却随着时间的推移而崩溃,这将是一件不幸的事。

    有各种各样的技术来帮助保证数据的完整性,但首先定义一下数据完整性的内容:

    (1)实体完整性。

    (2)域完整性。

    (3)参照完整性。

    实体完整性的特点是每个行是包含该行的实体的唯一实体。这类完整性通常是通过在主键字段生成一个唯一索引强行实现的。

    域完整性确保实际数据值的正确性。这类完整性是通过设置数据类型、空值能力和数据库规划以及缺省而强制实现的。

    参照完整性是数据库确认什么时候一个数据行引用另外一个已存在的数据行的能力。

    Oracle和其他的数据库管理系统通过表上的完整性约束或通过启动公共事件,比如插入、更新和删除的触发器来管理数据库的大多数参照完整性。在可能的情况下,应该将这种确认移到数据库服务器,以便所有的应用程序都共享它。保留应用程序的有效代码。

    8.6.4 创建触发器、存储过程和索引

    触发器、存储过程和索引使数据库保持参照完整性、易操作性和适应性。触发器能够用于维护数据的完整性、子一母表的关系,有时还用于列的有效性验证规则和其他的事情。存储过程用于在应用程序背后反复工作的机制,它为经常使用的SQL语句提供预编译的形式。

    索引通过排序模式来提高对数据的快速访问能力。

    为单个表可以设计以下三种操作类型的触发器:

    (1)删除。

    (2)插入。

    (3)更新。

    这些操作能够用一个、两个或多个触发器来表现出来(触发器的实现方式是DBMS所特有的)。当这些操作在表中执行时,就会触发相应的触发器。

    存储过程用于重复的任务,例如从一个不同的数据库中抽取数据来更新另一个数据库,数据库以及复合查询等。

    索引用于更快和更方便地访问数据。当用户创建一张表时,将会想到建立一个主键。也许存在一个或更多的列,它们提供了惟一的值或值的集合来标记单个信息记录。在此主键上创建索引将强制执行实体完整性。

    除主键以外,索引还能在列上创建。例如,如果用户需要访问Customer表中所有顾客名=字的字母顺序,在此表中Customer ID是主键,用户就应该将索引建立在顾客名字列上。这样将会减少按顺序显示这些姓名的访问时间或是访问单个记录的时间。外部键(来自其他表的主键)也适合作为索引,因为它们常常用于表之间的连接中。

    当然,用户还需要选择哪些列应该被索引,哪些列不被索引。同其他情况一样,太多的索引将会在性能上产生相反的效果,特别是当执行数据更新的时候,因为DBMS必须对每个受影响的索引和实际数据页面都作出改变。

    8.6.5 数据库设计的文档化

    用户应该经常使用某些形式的数据库设计的文档化。有许多工具和方法如OracleDesigner、ERWin/ERx、PowerDesigner Data Descliption Languages(DDL)等等直接从数据库生成,能为用户捕捉所有的信息。这几种工具通常提供许多报表的形式,使用户能够用不同的方法来观察数据库,这样做允许用户更容易的维护设计和以非正规方式做出改变。

    (赵 凯 张淑红)

    

221381
领取福利

微信扫码领取福利

微信扫码分享