数据库设计范式实例:假设某建筑公司要设计一个数据库。公司的业务规则概括说明如下:
公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等;
公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等;
公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)。
公司定期制定一个工资报表,如图-1所示。
显然上表并不是一个数据库中的表,只是一个书面的表格。现对其设计成为数据库中间的表。如下图在数据库中有一个这样的表。
但是该表也存在如下问题:
表中包含大量的冗余,可能会导致数据异常:
a.更新异常 例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行。
b.添加异常 若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据,先给这名职工分配一个虚拟的工程。(因为主关键字不能为空)
c.删除异常 例如,1001号职工要辞职,则必须删除所有职工号=1001的数据行。这样的删除操作,很可能丢失了其它有用的数据。
现可以对以上表进行重新设计:
用函数依赖图表示所有属性之间存在的函数依赖关系,如图3所示。
1. 图上方的箭头表示关键属性决定非关键属性。
2. 图下方的箭头表示属性之间的函数依赖性。
职工信息表:
职工号 | 姓名 | 职务 |
1001 | 齐光明 | Q01 |
1002 | 李思岐 | Q02 |
1003 | 鞠明亮 | Q03 |
1004 | 葛宇洪 | Q04 |
职务工资表
职务编号 | 职务名称 | 小时工资率 |
Q01 | 工程师 | 65 |
Q02 | 技术员 | 60 |
Q03 | 工人 | 55 |
工程项目表:
工程号 | 工程名 |
A1 | 花园大厦 |
A2 | 立交桥 |
A3 | 临江饭店 |
职工参与工程项目表
编号 | 工程号 | 职工号 | 工时 |
1 | A1 | 1001 | 13 |
2 | A1 | 1002 | 16 |
3 | A1 | 1004 | 19 |
4 | A2 | 1001 | 15 |
5 | A2 | 1003 | 17 |
6 | A3 | 1002 | 18 |
7 | A3 | 1004 | 14 |
另外,
数据库的物理设计要从优化操作系统、磁盘布局优化和配置、数据库初始化参数的选择、设置和管理内存、设置和管理CPU、设置和管理表空间、设置和管理回滚段、设置和管理联机重做日志、设置和管理归档重做日志、设置和管理控制文件等几个方面来考虑。
原文地址:http://zzc1986.blog.51cto.com/1067499/1617224