数据库设计&反范式&ER模型

118 阅读3分钟

数据库设计:

数据库的三大范式:(主要的范式,第四范式,第五范式...)

  1. 数据库表字段的元子性,就是表中的字段已经为最小的概念不可以再拆分。

举例:存储地址:江西省南昌市东湖区北京东路1129号 address = 北京东路1129号

province city area address

  1. 主键约束 非空且唯一 所有表都要有主键约束 中间表也要 中间表可以用复合主键

  2. 外键约束 可空可不唯一

注意:第三范式在数据库设计的时候可以不满足,但是第一第二范式必须满足

数据库表的关联关系:

1:1、1:N、N:N

字段类型设计:

  1. 有限选择符合存储类型的最小数据类型

  2. 尽量避免使用运行为null()操作

null是不利于索引

  1. 金额用decimal来进行存储

...参考阿里巴巴的开发手册 网上可以下的

system_user

system_dept

system_emp

mall_goods

mall_category

select user,host from user; 

反范式:

如果不能单纯的按照规范去设计表,因为有的数据可能是冗余的,但是可以提升效率

简单说就是用空间换时间。

场景1: 需求:查询员工名字和其部门名称,如果这个sql频繁使用,使用频率非常高

就可以考虑在emp中增加一个冗余字段:dname

场景2:商品信息表 和 商品类别表 几乎看到商品,就可以看到类别

id name categoryid id name xxx

id name categoryid cname

场景3:商品流水表 商品信息表

流水表 500万条记录 商品3000个商品

对流水的查询频率非常高,查流水的时候一定会看到商品的名

场景4: 课程评论表 学生表

显示课程评论的时候 频率很高 评论信息 评论学生的姓名 而不是学生的id

就可以在评论表增加一个学生姓名字段

反范式

优势

提升查询效率,减少不必要的关联开销

劣势

存储空间变大

表中新增,修改数据 对另外一个关联表也需要新增 修改

在数据量小的情况,优势并不明显

规范vs性能

为了满足某种商业目标,数据库性能比数据库的规范更加重要

做数据规范化的同时,要兼顾考虑性能

可以适当的在表中增加冗余字段,提高查询的效率

前提:一定要满足这两个条件,才去添加

冗余字段是不会频繁修改的

不是 varchar 超长字段,更不能是 text 字段。

select ename,dname from emp e join dept d on e.deptno=d.deptno;
-- 减少关联,查询速度快
select ename,dname from emp e;

ER模型

用图形来设计表的结构,更加直观,ER模型也称为实体关系模型

用来描述我们业务系统中的每个参与对象的,以及他们之间的关系

面向对象:对象包含哪些内容???

成员变量和成员方法==属性和行为

student{ // 叫entity 实体类 存数据库中查询出来的数据--->student表(字段:id name)

private int id;

private String name;

}

ER模型中有3个要素:

  1. 实体

就是数据库中表,对象对应java的实体类

  1. 属性

表中字段 地址,电话,姓名

  1. 关系

实体和实体之间的联系 商品表和详情表 商品表和顾客表