需求分析
数据库设计简介
- 什么是数据库设计?
简单来说,数据库设计就是根据业务系统的具体需要结合我们所选用的DBMS(数据库管理系统),为这个业务系统构造出最优的数据存储模型。并建立好数据库中的表结构及表与表之间的关联关系的过程。使之能有效的对应用系统中的数据进行存储,并可以高效的对已经存储的数据进行访问。重点在于有效的数据存储和高效的对数据进行访问 - 为什么要进行数据库设计?
刚开始未对数据库进行有效的设计,在后期业务逻辑复杂的时候往往会暴露出很多问题。
优良的设计 糟糕的设计
减少数据冗余 存在大量数据冗余
避免数据维护异常 存在数据插入、更新、删除异常
节约存储空间 浪费大量存储空间
高效的访问 访问数据低效
数据库设计的步骤
主要有四个步骤:
- 需求分析->数据库需求的作用点包括:数据是什么、数据有哪些属性、数据和属性各自的特点有哪些等。
- 逻辑设计:主要是使用ER图对数据库进行逻辑建模。
- 物理设计:根据不同的数据库(MySQL、Oracle、SQL Server等)自身的特点把逻辑设计转换为物理设计。通常企业级应用选择Oracle或者SQL Server,互联网中小型选择MySQL即可。
- 维护优化:在此期间会对新的需求进行建表、索引优化、大表拆分等工作。
需求分析重要性简介
为什么要进行需求分析?
- 了解系统中所要存储的数据
- 了解数据的存储特点 是不是时效性的?时效性的话可采用过期清理的方式
- 了解数据的生命周期 比如说日志信息 一般建议不存储。如果需要存储的话,建议设置归档和清理规则。
在此过程中要搞清楚的一些问题首先是数据库中存储的对象是什么?对象(也称实体),实体跟数据库的表、实体跟实体直接的关系大致有一对一、一对多、多对多三种关系。实体所包含的属性有什么?哪些属性或属性的组合可以唯一标识一个实体。
逻辑设计
ER图
逻辑设计是做什么的
- 将需求转化为数据库的逻辑模型
- 通过ER图的形式对逻辑模型进行展示
- 同所选用的具体的DBMS系统无关
关于ER图常用的名词解释:
关系:一个关系对应通常所说的一张表。
元组:表中的一行即为一个元组。
属性:表中的一列即为一个属性;每一个属性都有一个名称,称为属性名。
候选码:表中的某个属性组,它可以唯一确定一个元组。
主码:一个关系有多个候选码,选定其中一个为主码。
域:属性的取值范围。
分量:元组中的一个属性值。
ER图例说明
矩形:表示实体集,矩形内写实体集的名字。
菱形:表示关系集。
椭圆:表示实体的属性。
线段:将属性连接到实体集,或将实体集连接到联系集。
设计范式概要
对于同一个实体可以有不同的存储方式,就需要一些特定的规范来约束。通过范式可以使得数据库结构清晰、简洁结构明了,避免数据的插入、更新等操作异常及数据冗余。常见的数据库设计范式有第一范式、第二范式、第三范式以及BC范式,重点关注前三个范式。这也是目前大多数数据库设计所要遵循的范式。对于数据操作异常主要包括插入异常、更新异常、删除异常。
数据冗余是指相同的数据在多个地方存在,或者说表中的某个列可以由其他列计算得到,这就说明表中存在数据冗余。
第一范式
每个列不可再分即为第一范式。
第二范式
可以理解为第二范式:就是完全依赖,没有部分依赖。消除了非主属性的传递依赖,即完全依赖于主键。
第三范式
物理设计
数据库物料设计要做什么
- 选择合适的数据库管理系统(MySQL、Oracle、SQL Server2012、PgSQL),从特点和成本方面选择合适的数据库管理系统。
- 定义数据库、表、字段的命名规范。
- 根据所选的DBMS系统选择合适的字段类型,例如 对于字符串的存储设置字段类型,是选择char还是varchar还是text类型?根据实际需求选择
- 反范式化设计。是用空间换时间的一种方式,主要是达到高效的读数据目的。
如何选择适合的数据库?
- 成本 Oracle和SQLServer是商业软件,基于服务器的核数来收费的。MySQL和PgSQL是常见的开源数据库。
- 功能特点:Oracle适合大量的事务性操作。
- 系统平台:SQLServer系列企业中常用在Windows服务器中。
- 平台的开发语言:Java适合选择Oracle,.NET选择SQLServer系列。PHP选择MySQL。
- 应用的场景:Oracle和SQLServer更适合企业级项目。MySQL和PgSQL适合互联网企业。
MySQL常用的存储引擎
存储引擎可以简单理解为不同类型的表。MySQL常用的存储引擎如下:
数据库表及字段的命名规则
- 可读性原则
使用大写和小写来格式化的库对象名字以获得良好的可读性。例如:使用CustomAddress而不是customaddress来提高可读性。(MySQL可以通过设置对表名的大小写是否敏感) - 表意性原则
对象的名字应该能够描述它所标识的对象。例如,对于表,表的名称应该能够体现表中存储的数据内容;对于存储过程,存储过程名称应该能够体现存储过程的功能。 - 长名原则
尽可能少使用或者不使用缩写,适用于数据库(DATABASE)名之外的任一对象。
数据库字段类型选择原则
列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询性能。当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。例如,生日可以选择char(10)、varchar(20)、datetime、int等类型。
以上选择原则主要是从以下两个方面考虑的:
- 在对数据进行比较(查询条件、JOIN条件及排序)操作时:同样的数据,字符处理往往比数字处理慢。
- 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升。本质是优化磁盘IO。
数据库如何选择具体字段类型
数据库设计其他注意事项
反范式化表设计
案例
反范式化设计后