数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求。数据库设计过程中命名规范很是重要,命名规范合理的设计能够省去开发人员很多时间去区别数据库实体。
最近也因为工作需要所以整理出了这个Word文档,望大家指正。
2数据库设计数据库规划→需求分析→数据库设计→应用程序设计→实现→测试→运行于维护
2.1数据库规划定义数据库应用系统的主要目标,定义系统特定任务,包括工作量的估计、使用资源、和需求经费,定义系统的范围以及边界。
2.2需求分析2.1.1需求分析步骤与成果涉及人员:用户和分析人员
任务:对现实世界要处理的对象进行详细的调查,收集基础数据及处理方法,在用户调查的基础上通过分析,逐步明确用户对系统的需求,包括信息的要求及处理的要求。
方法与步骤:1.通过与用户的调查,对用户的信息需求进行收集。
2.在收集数据的同时,设计人员要对其进行加工和整理,以数据字典和数据流图的形式描述出来,并以设计人员的角度向用户讲述信息,根据用户的反馈加以修改并确定(该过程是反复的过程)
成果:数据流图,数据字典,各种说明性表格,统计输出表以及系统功能结构图。
2.1.2数据流图基本元素与数据流图外部实体:存在于软件系统之外的人员或组织(正方形或立方体表示)。
加工:数据处理,表示输入数据在此进行变换,产生输出数据(圆角巨型或圆形表示)。
数据流:表示流动着的数据(箭头线表示)。
数据存储:用来表示要存储的数据(开门矩形或两条平行横线表示)。
订单处理系统顶层流程图:
0层数据流图:
2.3数据库设计2.3.1概念结构设计实体:现实中的事物例如,学生,老师
联系:两个实体之间的关系,1:1、1:N、M:N三种关系
属性:实体所具有的属性,例如 学生的学号、姓名、性别等
例如:一个学生属于一个班级,一个班级拥有多名学生,E-R图如下
网上购物系统E-R图,该系统数据之间存在下列约束
图2.2
2.3.2逻辑结构设计2.3.2.1E-R图转换成关系模式将每个实体转换成一个关系模式,实体的属性即关系模式的属性,实体的标识即关系模式的键。
根据E-R图实体之间的联系可以转换成以下关系模式:
客户(客户编号,姓名,电话,E-mail)。关系的主键:客户编号;外键:无
订单(订单编号,订购时间,客户编号)。关系的主键:订单编号;外键:客户编号
订购细目(订购明细编号,订购数量,支付金额,订单编号)。关系主键:订购明细编号;外键:订单编号。
出现(订购明细编号,商品编号,类型)。关系的主键:订购明细编号,商品编号;外键:订购明细编号,商品编号。
商品:(商品编号,商品名称,单价,生产日期,商品类别号,商品类别名)。关系的主键:商品编号;外键:无
在关系模式设计中可能会出现以下几个问题:数据冗余、数据修改不一致、数据插入异常、数据删除异常,所以提出范式的要求,目的就是最低限度地冗余,避免插入、删除、修改异常。
2.3.2.2范式主属性:包含键的所有属性。
第一范式(1NF):若关系模式R的每一个分量是不可分的数据项,则关系模式属于第一范式。即每个属性都是不可拆分的.
第二范式(2NF):R属于1NF,且每一个非主属性完全依赖于键(没有部分依赖),则R属于2NF
例如:选课关系(学号,课程号,成绩,学分)
该关系的主键是(学号,课程号),但是课程号→学分,所以学分属性部分依赖于主键,即关系部满足第二范式,可以拆分为(学号,课程号,成绩),(课程号,学分)两个关系
第三范式(3NF):R属于2NF,且每个非主属性即不部分依赖于码,也不传递依赖于码
例如:学生关系(学号,姓名,所属系,系地址)
该关系的主键是:学号
学号→所属系,所属系→学号,所属系→系地址;根据函数的依赖公理,系地址传递函数依赖于学号,即关系不满足第三范式,可以拆分关系为(学号,姓名,所属系),(所属系,系地址)
如果不拆分会存在数据修改异常,比如该学生的换了系,修改了所属系,但是系地址没有修改,这样就造成了修改异常
BCNF:R属于3NF,且不存在主属性对码的部分和传递函数依赖
例如:关系R(零件号,零件名,厂商名),如果设定每种零件号只有一个零件名,但不同的的零件号可以有相同的零件名,每种零件可以有多个厂商生产,但每家厂商生产的零件应有不同的零件名。这样可以得到:
零件号→零件名,(厂商名,零件名)→零件号
所以主属性包括(零件号,厂商名,零件名),但是“零件名”传递依赖于码“厂商名,零件名”,所以关系R不满足BCNF,当一个零件由多个生产厂商生产时,由于零件号只有一个而零件名根据厂商不同而又多个,零件名与零件号之间的联系将多次重复,带来数据冗余和操作异常现象
可以将关系分解为(零件号,厂商名),(零件号,零件名)
4NF:关系模式R属于1NF,若对于R的每个非平凡多值依赖X→→Y且Y不包含于X时,X必含码,则R属于4NF
5NF:对关系进行投影,消除关系中不是由候选码所蕴含的连接依赖
对于上面的商品关系,由于关系的主键是商品编号,而商品类别号→商品类别名
所以商品关系部满足第三范式,非主属性商品类别名传递依赖于商品编号,会存在数据冗余,数据修改异常问题。将商品关系分解为:
商品(商品编号,商品名称,单价,生产日期,商品类别号)
商品类别(商品类别号,商品类别名)
2.3.3物理结构设计为一个给定的逻辑数据模型设计一个最合适应用要求的物理结构的过程
采用高级语言以结构化设计方法或面向对象方法进行设计
2.5系统实现3.优化策略3.1.查询优化策略1.如果频繁地访问涉及的是对两个相关的表进行连接操作,则考虑将其合并
2.如果频繁地访问只是在表中的某一部分字段上进行,则考虑分解表,将该部分单独作为一个表
3.对于很少更新的表,引入物化视图
4. 当系统中有一些少量的,重复出现的值时,使用字典表来节约存储空间和优化查询。如地区、系统中用户类型的代号等。这类值不会在程序的运行期变化,但是需要存储在数据库中。
就地区而言,如果我们要查询某个地区的记录,则数据库需要通过字符串匹配的方式来查询;如果将地区改为一个地区的代号保存在表中,查询时通过地区的代号来查询,则查询的效率将大大提高。
程序中宜大量的使用字典表来表示这类值。字典表中保存这类值的代号和实体的集合,以外键的方式关联到使用这类值的表中。然而,在编码阶段,程序员并不使用字典表,因为首先查询字典表中实体的代号,违背了提高查询效率的初衷。程序员在数据字典的帮助下,直接使用代号来代表实体,从而提高效率。
虽然字典表在实际上并不使用,但是仍应该保留在数据库中(起码是在开发期内保留)。字典表作为另一种形式上的“数据字典文档”出现,以说明数据库中哪些表的哪些字段是使用了字典表的。
为了提高数据库的数据完整性,在开发阶段可以保留完整的字典表和普通表的外键约束。但是在数据库的运行阶段,应该将普通表和字典表的外键删除,以提高运行效率,特别是某些表使用了很多字典表的情况。
案例:某数据库中有百万条用户信息,应用系统中常常需要按照地区要查询用户的信息。用户信息表以前是按照具体的地区名称来保存的,现在将具体的名称改为字典表中的地区代号,查询效率大大提高。
3.3索引对象 | 前缀 |
数据库 | 无 |
表 | 无 |
视图 | VI |
索引 | IX |
存储过程 | SP |
函数 | FN |
触发器 | TR |
自定义数据类型 | ud |
Default | DF |
主键 | pk |
外键 | FK |
rule | ru |
序列 | Sq |
UNIQUE | uq |
数据库对象采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线_组成,共63个字符。不能出现其他字符(注释除外)。
同一个数据库中这些对象名都是不能重复
C CHECK_CONSTRAINT
D DEFAULT_CONSTRAINT
F FOREIGN_KEY_CONSTRAINT
IT INTERNAL_TABLE
P SQL_STORED_PROCEDURE
PK PRIMARY_KEY_CONSTRAINT
S SYSTEM_TABLE
SQ SERVICE_QUEUE
TR SQL_TRIGGER
U USER_TABLE
UQ UNIQUE_CONSTRAINT
V VIEW
4.2命名规范规定1.表名使用单数名
例如:对存储客人信息的表(Customer)不使用Customers
2.避免无谓的表格后缀
1、 表是用来存储数据信息的,表是行的集合。那么如果表名已经能够很好地说明其包含的数据信息,就不需要再添加体现上面两点的后缀了。
2、 GuestInfo(存储客户信息)应写成Guest,FlightList(存储航班信息的表)应写成Flight
3.所有表示时间的字段,统一以 Date 来作
新闻热点
疑难解答