1.什么是数据库设计
数据库设计就是根据业务的具体需求,结合我们所选用的DBMS,为这个业务系统造出最优的数据存储模型、
并建立好数据库中的表结构及表与表之间的关联关系的过程。让它有效的对应用系统中的数据进行存储,并可以
高效的对已经存储的数据进行访问。
2.为什么要进行数据库设计
1.减少数据冗余2.避免数据维护异常3.节约存储空间3.高效访问
3.分析需求
以电商为例子 核心模块 用户模块,商品模块,订单模块,购物车模块,供应商模块。
用户模块
包括的属性:用户名,密码,电话,邮箱,身份证号,地址,姓名,昵称。。。。。
唯一标识属性:用户名,身份证,电话
存储特点:随时间增加逐渐增加,但是需要永久储存
商品模块
包括属性:商品编码,商品名称,描述,类,重量,有效期,价格。。。。。。
唯一:编码
存储特点:对下线的商品可以归档存储,不能删除,因为购物车或者订单里面还有该商品
订单
属性:订单号,用户名,电话,收货地址,商品。。。。。
唯一标识:订单号
存储特点:永久存储(分表,分库)
购物车模块
属性:用户名,商品编号,价格,描述,分类,加入时间,数量。。。
唯一标识:用户名,编号,加入时间
存储特点:不用永久存储,设置归档,清理规则
4.逻辑设计(ER图)
关系:一个关系通常就是一张表
元组:表中的一行即为一个元组
属性:表中的一列即为一个属性;每一个属性都有一个名称,成为属性名
候选码:表中的某个属性组,它可以唯一确定一个元组
主码:一个关系有多个候选码,炫动其中一个为主码
域:属性的取值范围
分量:元组中的一个属性值
5.*******设计范式概要
操作异常:
1.插入异常:如果实体随着另一个实体存在而存在,即缺少某一个实体时无法表示这个实体,那么这个表就存在插入异常
2.更新异常:如果更改表所对应的某个实体实例的单独属性时,需要将多行跟新,那么就说这个表存在更新异常
3.删除异常:如果删除表的某一行来反映某实体实例失效时导致另一个不同的实体实例信息丢失
数据冗余:是指数据在多个地方存在,或者说表中的某个列可以有其他列计算得到,这样表中存在在数据冗余
主要有第一范式 第二范式,第三范式,BC范式
第一范式:数据表中的字段都是单一属性,不可再分的,这个单一属性是由基本的数据类型所构成的。简单地说:第一范式要求数据库中表都是二维表
第二范式:数据库的表中不存在非关键字段对任一候选关键字段的不分函数依赖,简单地说:所有单关键字段的表都符合第二范式。
第三范式:第三范式存在第二范式基础之上定义的,如果数据表中不存在非关键字段,对任一候选关键字段的传递函数依赖则符合第三范式
BC范式:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式,也就是说如果是复合关键字,则复合关键字之间也不能存在函数依赖关系。
6.物理设计
1.选择合适的数据库管理系统
常见的DBMS:Oracle和SQLServer(只支持windows,适用于.net开发,erp系统)属于商业数据库(常用于企业级项目),MySQL和PgSQL是开源数据库(常用于互联网项目)
Oracel适用于大的事务操作。
MySQL的存储引擎:
2.定义数据库,表及字段的名称规范
英文,顾名思义
3.根据所选的DBMS系统选择合适的字段类型
1.数据查询比较:同样的数据,字符串处理比数字慢**
2.数据库中,数据处理以页为单位,列长度越小,利于性能提升****
例如char和varchar如何选择
1.如果列中要存储的数据长度差不多是一致的。则选择char
2.如果列中最大数据长度小于50byte,则用char(如果列很少用,基于节省空间和减少I/O的考虑,还是可以考虑varchar)
decimal和float的选择
1.decimal用于存储精确数据,而float只能用于存储非精确数据
2.由于float的存储空间开销一般比decimal小(精确到7位数只需要4byte,精确到15位也只有8byte)优先选择float
时间类型
1.int存储时间字段的优缺点
优点:字段长度比datetime小
缺点:使用不方便,要进行转换
限制:只能存储到2.38-1-19 2147483648=2^32
2.需要存储的时间粒度
年 月 日 小时 分 秒 周
如何选择主键
1.区分业务主键和数据库主键
业务逐渐标识业务数据,进行表与表的关联;数据库主键则是为了优化数据存储(innodeb会生成6个字节的隐含主键)
2.跟数据库的类型,考虑主键是否顺序增长
有些数据库是按主键的顺序逻辑存储的
3.主键的字段类型所占空间尽可能的小
对于使用聚集索引范式存储的表,每个索引后都会附加主键信息
避免使用外键约束
1.降低数据导入的效率
2.增加维护成本
3.虽然不建议使用外键约束,但是相关联的列上一定要建立索引
避免使用触发器
1.降低数据导入的效率
2.可能会出现意想不到的数据异常
3.使业务逻辑变得复杂
预留字段
1.无法准确的知道预留字段的类型
2.无法准确的知道预留字段中所存储的类容
3.后期维护预留字段索要的成本,同增加一个字段所需要的成本相同
4.严禁使用预留字段
4.反范式化设计
针对范式化而言,为了性能和读取效率的考虑而适当的对第三范式的要求进行违反,允许存在少量的数据冗余
空间换时间的操作
ex:符合范式的设计
反范式化的设计:
7.维护和优化
1..维护数据字典
1.第三方工具维护
2.利用数据库本身的备注字段来维护数据字典。以mysql为列子
CREATE TABLE customer(
cust_id INT AUTO_INCHREMENT NOT NULL COMMENT '自增ID'
cust_name VACHAR(10) NOT NULL COMMENT '客户姓名'
PRIMARY KEY (cust_id)
)COMMENT'客户表'
2.维护索引
1.出现在WHERE从句GROUP BY从句,ORDER by从句中的列
2.可选择性高的列要放到索引的前面
3.索引中不要包括太长的数据类型
1.索引不是越多越好,过多的索引会降低写效率还会降低读效率
2.定期维护索引碎片
3.在SQL语句中不要使用强制索引关键字
3.维护表结构
1.使用在线变更表结构的工具
MYSQL5.5之前可以使用pt-online-schema-change
MYSQL5.6之后本身支持在线表结构的变更
2.同时对数据字典进行维护
3.控制表的宽度和大小
数据库中适合的操作
1.批量操作VS逐条操作
2.禁止使用Select*这样的查询
3.控制用户自定义函数
4.不要使用数据库中的全文索引
4.在适当的时候对标进行水平拆分和垂直拆分
垂直拆分
1.经常一起查询的列放在一起
2.text,blob等大字段拆分出道附加表中
水平拆分