数据库设计的一些感想

时间:2022-10-14 23:51:15

有关主键与外键

一般而言,一个实体不能既无主键又无外键。在ER图中,处于叶子部位的实体,可以定义主键,也可以不定义主键(因为它无子孙),但必须要有外键(因为它有父亲)。主键作用是保持唯一性,外键的作用是数据库的完整性,说白了,就是一个表某一列的内容来自于另一个表的一列,不能随便删除外键所在的表,保持两个表一致性,主要是从表和主表数据一致。当然按照各位前辈们的经验,数据库设计的时候添加主外键,但一般开发的时候先不添加,等到系统完成的时候再添加,否则会给系统开发带来很大的麻烦,当然也有公司自始至终不添加主外键,而他们的数据一致性等问题是在项目中使用代码来维护的.

主键是供程序员使用的表间连接工具,可以是一无物理意义的数字串,由程序自动加1来实现,这样效率很高,处理简洁,当然也可以使用字符和数字的混合体.也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。

有关三个范式

理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,那自然是透彻的理解三范式.

  • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
  • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性(不要用联合主键)
  • 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余(不要有传递依赖)

没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

有关实体多对多的关系

若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

虽然第三张表有其优点,但是不呢个乱用第三张表,最近做的系统数据库设计中就过度的使用了第三张表,导致了各个子系统读取操作数据的时候变的特别复杂难以维护,并且效率极其低下.解决方法是,合适使用第三张表,对于一对一,一对多的关系一般用主外键最好.多对多的关系则需要第三张表来维护关系.

有关数据冗余

主键与外键在多表中的重复出现,不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现,才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

比如商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

有关视图

与基本表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式,是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间,视图的定义深度一般不得超过三层。若三层视图仍不够用,则应在视图上定义临时表,在临时表上再定义视图。这样反复交迭定义,视图的深度就不受限制了。

提高数据库运行效率的办法

在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

  • 在数据库物理设计时,降低范式,增加冗余,少用触发器,多用存储过程(当然不利于程序数据库系统的迁移)
  • 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用编程语言计算处理完成之后,最后才入库追加到表中去。
  • 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
  • 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
  • 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

总之,数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。

要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。