表与表之间的关系有三种
一对一:将其中某张表的字段加入另一张表
一对多:将“一”的一端编号加入“多”的一端当做关联字段
多对多:在两张表中加入一张关系表,记录关联关系
一、数据库设计三范式
- 第一范式:列不可分
(:每一列都是不可再分的最小原子单位)
注意:可不可分由现实决定,不要反人类,如姓名分开就很奇怪。 - 第二范式:要有主键,不存在部分依赖
注意:(1)所谓主键指的的是该字段非空且唯一,如学号、身份证号就是主键。
(2)所有的非主键字段必须要完全依赖主键。但是注意如果是联合主键,所有的非主键字段必须完全依赖联合主键,不能只依赖其中一部分。
(3)联合主键:指的是在某张表中,多个字段的组合作为主键(联合主键也要唯一,不能部分依赖) - 第三范式:不存在传递依赖
(在同一张表中,所有的非主键字段必须要直接依赖于主键) - 例子
(1)这个表不好,数据冗余(数据重复存储),出版社名称地址电话被重复存储,如果有两万本图书都是这个出版社,地址改了就要改两万个,所以出版社应该有另外一张表。而且图书和出版社是一对多的关系,所以应该在图书表中存储有出版社的主键。
改进后:①图书编号是图书表的主键,图书名称,价格,作者,出版社编号完全依赖于它。
②出版社编号是出版社表的主键,出版社名称,地址,电话完全依赖于它。
③出版社和图书是一对多的关系,在图书表中要加上出版社的主键作为关联
(2)借书表中图书编号和学生学号有可能做联合主键,但由于同一个学生也可以借同一本书,这样主键就不唯一了。所以一般再加一个字段作为主键,可以是借书的时间(精确到秒就肯定唯一了)或者是借书编号。
改进后:
或者:
(3)下面这个表不好,虽然只有一个字段且不会重复,但是如果需要其中某一部分信息时,拆解起来十分复杂。
(4)如果搜查某些消息时,要连跨好几张表,可以适当添加一些冗余,要懂得取舍。因为有时候直接添加一个冗余字段比编写一个搜查的算法所花的时间更少。
二、概要设计
例子:某公司需要开发员工管理系统,每个员工都有自己的编号,姓名,年龄,性别这些属性。一个 部门有多个员工,部门的所在地为某个城市,员工在公司中需要做各个项目.每一个项目都有自己的编号,名称,预算和起始时间,结束时间。员工在项目中担任具体的职务,我们还需要记录员工加入项目和离开项目时的日期。
-
把所有名词分两类:实体和属性
实体:员工,部门,项目
属性:
(员工的属性)员工编号,姓名,年龄,性别
(部门的属性)部门编号,部门名称,所在地
(项目的属性)项目编号,项目名称,预算,起始时间,结束时间 -
把每一个实体做成一张表,把每一个属性做成表中的一个字段
(1)把每一个实体做成一张表,则有员工表,项目表和部门表。
(2)确定表和表之间的关系,部门与员工的关系是1对多,则要往员工表中加入部门属性;员工与项目的关系是多对多,因此要另外建立一个员工和项目的关系表——工作表。
————————————结果如下——————————————
员工表:员工编号 姓名 年龄 性别 部门编号
部门表:部门编号 部门名称 所在城市
项目表:项目编号 项目名称 预算 起始时间 结束时间
工作表:员工编号 项目编号 职务 加入日期 离开日期 -
画出E-R图
-
作表
二、详细设计
每一个模块需要编写那些类,类中包含的方法和属性,甚至包含一些伪代码等等。