目录

数据库设计步骤

  1. 需求分析

数据自身的特点?

数据之间的关系?

实体是什么?实体与表之间不是一一对应的关系。实体之间的关系(1对1,1对多,多对多)。实体的标识(主健)

实体的记录的增长速度。

时效性:(用户登录 session之类)的数据要按时清理,
增长性: (有些开发人员,喜欢将访问日志存库,这种数据增长是非常快的,必须制定好清理规则)

  1. 逻辑设计

ER图分析,实体,实体关系
  1. 物理设计

选数据库软件,建表,考虑字段类型
  1. 维护优化

建立/优化索引,大表拆分,新需求建表。

异常

插入异常:一个实体依赖另一个实体而存在的情况下,容易出现。比如:往一个不存在的班级里面加学生。

更新异常:更新某个学生的信息,却修改了多条记录。

删除异常:删除某个实体记录时,连带另外一个实体的信息也被删除了。比如,删除某个班里最后一名学生,学生对应的班级也会被删除(如果是在一张表里)

范式

第一范式  : 字段不可拆分

第二范式  : 单关键字(只有一个字段作为主键)都符合第二范式,双关键字(两个字段组合标识一个实体记录)表中,部分字段分别依赖两个关键字,就不符合第二范式。第二范式目的是:消除部分依赖。

解决方案:将这个表拆成3个表,两个关键字作为主键各自成一张表。再加一张它们之间的对应关系表。
例子:
价格,描述,重量,有效期,分类 依赖于 商品名称,供应商电话依赖于供应商名称,存在问题:
1,冗余,试想 表中有 n 个饮料一厂,其供应商电话就冗余了。
2,更新异常:我想改动下饮料一厂的电话,改动了 n 条数据。其他异常可以推理

  • 第三范式:表里面某些字段(可以不是关键字)依赖另一些字段,就是不符合第三范式。

解决办法:拆成3张表,如下图 。
例子:
存在传递依赖关系: 商品名称->分类->分类描述,试想同一分类多了,分类描述不就冗余了吗?
更新异常:假如我更新 酒水饮料 的分类描述,那么分类是酒水饮料的商品记录都会被更新。

  • BC 范式:复合关键字之间有依赖关系。目的是:消除两组关键字之间的相互依赖关系。

解决办法:拆表,如下。
例子:
假如饮料二厂并没有给我们提供商品,那么它的供应商联系人的数据存哪儿?丢弃么?

设计数据库的一些技巧

  • 表垂直拆分设计 1 对 1 关系设计

拆分常用字段 和 不常用字段,分别用一张表存储,用一个 唯一标识 id 来链接
  • 水平拆分设计

如果一张表的记录超过了100万条,那就应该将它们分为两张一样的表,每张表存储 50 万条记录
  • 实体与实体之间的 n 对 1 关系设计

比如学生(n) 对 班级 (1) :在学生表里面加一个从属字段(所属班级),并加上外键约束
  • 实体与实体之间的 n 对 n 关系设计

通过在两张实体表之间,添加一张关系表,专门记录两个实体之间的对应关系