参考文章:
https://blog.csdn.net/qq_16605855/article/details/75973026
1.口诀
多对多,三张表,关联表两外键
一对多,两张表,多的表加外键
一对一,主键共享,外键唯一
原则尽量避免数据冗余
2.理论
理论上要满足第三范式,但是在实际的开发过程中,有的时候会退到第二范式。
1.第一范式:满足每条巨鹿是唯一的,要有主键,每个列是原子的,不可在分的(相对的)
2.第二范式:在第一范式的基础上,消除对逐渐的部分依赖
3.第三范式:第二范式的基础上,消除传递依赖
示例一 第一范式
如图所示的表,是否满足第一范式,是否有数据冗余,如何修改表,使其规范化
不符合第一范式
(1)表中主键不唯一,修改王五学生编号为1003
(2)表中联系方式还可以再分为邮箱和电话两列,如下图:
示例二 多对多
如图所示,分析该表并作出修改,避免其数据的冗余
如图所示,
分析老师和学生是多对多的关系,故拆分成三张表(学生表、教师表、学生教师关系表),如图所示
使用power designer可以自动生成物理数据模型,帮助建表,图为一句上图的ER图自动生成的数据库表单
示例三 一对多
如图所示,如何优化表格避免其冗余
由于学生和课程表为多对一的关系,所以生成两张表,学生表加外键,如图;
示例四 一对一
以登录系统为例,登陆时,需要账户表(用户名,密码,状态),用户表(用户真实姓名,电话…)很显然,一个用户对应一个账户,即一对一关系;他们可以合并成为一个表,但是为了方便管理(考虑查询速度,以及关系型数据库的特性。)另外为了对业务进行事务隔离操作,将其内容分为两个表表示。
(1)共享主键
见名思意,就是两张表共用主键,主键是一样的,相当于拆分了的一张表,各自保留ID作为主键
(2)外键依赖
在用户表中加入账户表中的ID作为外键,将两张表联系起来
示例五 空间换时间
假设某一购物网站,有商品明细表(id,name,type,typename,price)
商品种类表(id,typename)
那么每次查询,需要对两个表做冗余查询,,为了省事,用一张表来表示,这样空间上冗余了,但是查询时间上变快了