数据库有哪些设计技巧?
2020-10-19
1. 原始单据与实体之间的关系
〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。
2. 主键与外键
3. 基本表的性质
-
原子性。基本表中的字段是不可再分解的。
-
原始性。基本表中的记录是原始数据(基础数据)的记录。
-
演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
-
稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。
4. 范式标准
〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
表1 商品表的表结构
5. 通俗地理解三个范式
-
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
-
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
-
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
6. 要善于识别与正确处理多对多的关系
〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。 为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。
7. 主键PK的取值方法
8. 正确认识数据冗余
〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。 只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
9. E--R图没有标准答案
10. 视图技术在数据库设计中很有用
11. 中间表、报表和临时表
12. 完整性约束表现在三个方面
13. 防止数据库设计打补丁的方法是“三少原则”
14. 提高数据库运行效率的办法
-
在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。
-
当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
-
发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
-
对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
-
在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。