数据库设计步骤
需求分析
数据自身的特点?
数据之间的关系?
实体是什么?实体与表之间不是一一对应的关系。实体之间的关系(1对1,1对多,多对多)。实体的标识(主健)
实体的记录的增长速度。
时效性:(用户登录 session之类)的数据要按时清理,
增长性: (有些开发人员,喜欢将访问日志存库,这种数据增长是非常快的,必须制定好清理规则)
逻辑设计
ER图分析,实体,实体关系
物理设计
选数据库软件,建表,考虑字段类型
维护优化
建立/优化索引,大表拆分,新需求建表。
异常
插入异常:一个实体依赖另一个实体而存在的情况下,容易出现。比如:往一个不存在的班级里面加学生。
更新异常:更新某个学生的信息,却修改了多条记录。
删除异常:删除某个实体记录时,连带另外一个实体的信息也被删除了。比如,删除某个班里最后一名学生,学生对应的班级也会被删除(如果是在一张表里)
范式
第一范式 : 字段不可拆分
第二范式 : 单关键字(只有一个字段作为主键)都符合第二范式,双关键字(两个字段组合标识一个实体记录)表中,部分字段分别依赖两个关键字,就不符合第二范式。第二范式目的是:消除部分依赖。
解决方案:将这个表拆成3个表,两个关键字作为主键各自成一张表。再加一张它们之间的对应关系表。
例子:
价格,描述,重量,有效期,分类 依赖于 商品名称,供应商电话依赖于供应商名称,存在问题:
1,冗余,试想 表中有 n 个饮料一厂,其供应商电话就冗余了。
2,更新异常:我想改动下饮料一厂的电话,改动了 n 条数据。其他异常可以推理
第三范式:表里面某些字段(可以不是关键字)依赖另一些字段,就是不符合第三范式。
解决办法:拆成3张表,如下图 。
例子:
存在传递依赖关系: 商品名称->分类->分类描述,试想同一分类多了,分类描述不就冗余了吗?
更新异常:假如我更新 酒水饮料 的分类描述,那么分类是酒水饮料的商品记录都会被更新。
BC 范式:复合关键字之间有依赖关系。目的是:消除两组关键字之间的相互依赖关系。
解决办法:拆表,如下。
例子:
假如饮料二厂并没有给我们提供商品,那么它的供应商联系人的数据存哪儿?丢弃么?
设计数据库的一些技巧
表垂直拆分设计 1 对 1 关系设计
拆分常用字段 和 不常用字段,分别用一张表存储,用一个 唯一标识 id 来链接
水平拆分设计
如果一张表的记录超过了100万条,那就应该将它们分为两张一样的表,每张表存储 50 万条记录
实体与实体之间的 n 对 1 关系设计
比如学生(n) 对 班级 (1) :在学生表里面加一个从属字段(所属班级),并加上外键约束
实体与实体之间的 n 对 n 关系设计
通过在两张实体表之间,添加一张关系表,专门记录两个实体之间的对应关系