数据库设计:
数据库的三大范式:(主要的范式,第四范式,第五范式...)
- 数据库表字段的元子性,就是表中的字段已经为最小的概念不可以再拆分。
举例:存储地址:江西省南昌市东湖区北京东路1129号 address = 北京东路1129号
province city area address
-
主键约束 非空且唯一 所有表都要有主键约束 中间表也要 中间表可以用复合主键
-
外键约束 可空可不唯一
注意:第三范式在数据库设计的时候可以不满足,但是第一第二范式必须满足
数据库表的关联关系:
1:1、1:N、N:N
字段类型设计:
-
有限选择符合存储类型的最小数据类型
-
尽量避免使用运行为null()操作
null是不利于索引
- 金额用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个要素:
- 实体
就是数据库中表,对象对应java的实体类
- 属性
表中字段 地址,电话,姓名
- 关系
实体和实体之间的联系 商品表和详情表 商品表和顾客表