DBMS数据库管理系统
数据库设计
1、有效存储 2、高效访问
目的:
1、减少数据冗余 2、避免数据维护异常 3、节约存储空间 4、高效的访问
数据库设计过程:
1、需求分析: 分析需要存储的数据是哪些,这些数据有哪些属性,这些属性各自的特点是什么 2、逻辑设计: 使用ER图对数据库进行逻辑建模, 3、物理设计: 使用哪款数据库设计建表(oracle,myslq,sqlserver) 4、维护优化: 索引优化,大表拆分
数据库设计布置
需求分析—>逻辑设计—>物理设计—>优化
需求分析
数据内容
数据存储特性:时效性
数据生命周期:增长快、量大、非核心,分库分表,归档清理规则
实体间及实体与表的关系,1对1,1对多,多对多
实体的属性,单一属性or属性组合 可以唯一标识实体的
逻辑设计
ER图例说明:
矩形:表示实体集,矩形内写实体的名字 菱形:表示联系集 椭圆:表示实体属性 线段:将属性链接到实体集
名词解释
关系是表, 元组是行, 属性是列。 候选码是属性组,可以唯一的确定一个元祖(列) 候选码中选一个当主码 域是属性的取值范围 分量是元组中的一个属性值
常见数据库设计范式:
第一范式、所有字段不可拆分 第二范式、单关键字 第三范式、不存在传递依赖 BC范式(Boyce.Codd)、解决部分主键依赖于非主键部分 第四范式 第五范式
插入异常,更新异常,删除异常
数据冗余:重复数据
数据库物理设计
1、选择合适的数据库管理系统
-商业数据库 oracle、sqlserver
-开源数据库 mysql pgsql
2、定义数据库、表以及字段的命名规范
3、根据所选的dbms系统选择合适的字段类型
4、反范式化设计:刻意增加冗余,以空间换取时间
MySQL常用的存储引擎:
MylSAM 不支持事务 表级锁 读写效率更高 MRG_MYISAM 不支持事务,表级锁 分段归档 Innodb(推荐) 支持事务 行级锁 Archive 行级锁 日志记录 Ndb cluster(MYSQL集群) 支持事务 行级锁 高可用
数据库表及字段的命名规则:
可读性原则(用大小写区分来提高可读性等) 表意性原则(表的名称应能体现其存储内容等) 长名原则(少用缩写)
字段类型选择原则
优先选择数字类型,其次是日期和二进制类型,最后才是字符串类型; 字符比数据处理慢; 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升; 磁盘的I/O性能决定了数据库的性能。 数字的查询和排序操作优于char和varchar;
decimal 与 float 如何选择:
decimal用于存储精确数据 float只能用于存储非精确数据
char 与 varchar 如何选择:
如果列中要存储的数据长度差不多是一致的,则应该考虑用char,反之使用varchar。 如果列中的最大数据长度小于50byte(utf-8格式中大概13个字符),则一般也考虑用char。(如果这个 列很少用,内里基于节省空间和减少I/O的考虑,还是可以选择用varchar) 一般不宜定义大于50Byte的char类型列 在mysql中,utf8的一个字符占3个字节, 当某个字段的字符数大于15时,要用varchar,小于就用char
时间类型如何存储:
使用int来存储时间字段的优缺点 优点: 字段长度比datetime小。 缺点:使用不方便,要进行函数转换。 限制:只能存储到2038-1-19 11:14:07 即2^32为2147483648
注意事项:
主键: 可以存储业务主键(标识业务数据,进行标语表关联)和数据库主键(优化数据库) 避免使用外键约束: 降低数据导入效率,增加维护成本 避免使用触发器: 导致意想不到的数据异常,是业务逻辑变复杂 严禁预留字段
为什么反范式化
读 > 写 减少表的关联数量 增加数据的读取效率 反范式化一定要适度
维护数据
维护各优化中要做什么
1、维护数据字典 2、维护索引 3、维护表结构 4、在适当的时候对表进行水平拆分或垂直拆分
导出数据字典
SELECT a.table_name,b.TABLE_COMMENT,a.COLUMN_NAME,a.COLUMN_TYPE,a.COLUMN_COMMENT FROM information_schema.COLUMNS a JOIN information_schema.TABLES b ON a.table_schema = b.table_schema AND a.table_name = b.table_name WHERE a.table_name = 'customer'
如何维护索引
建立索引:出现在WHERE从句, GROUP BY从句, ORDER BY 从句中的列 可选择性高的列要放到索引的前面 索引中不要包括太长的数据类型
注意事项:
索引并不是越多越好,过多的索引不但会降低写效率而且会降低读的效率 定期维护索引碎片 在SQL语句中不要使用强制索引关键字
数据库中适合的操作
批量操作 禁止使用 select * 这样的查询 控制使用用户自定义函数 不要使用数据库中的全文索引
垂直拆分:
经常一起查询的列放在一起 text,blob等大字段拆分出到附加表中
水平拆分