数据库设计流程和依据

》_《:

1.需求分析

数据库需求的作用点
1.数据是什么
2.数据有哪些属性
3.数据和属性各自有什么特点

2.逻辑设计

1.使用ER图对数据库进行物理建模

3.物理设计

1.根据数据库自身的特点把物理逻辑转化为物理设计

4.维护和优化

1.新的需求进行建表
2.索引优化
3.大表拆分

需求分析:

1.了解系统中要存储的数据
2.了解数据的存储特点
3.了解数据的生命周期

1.实体与实体之间的关系(1对1,1对多,多对多)
2.实体所包含的属性
3.哪些属性,或者属性的集合可以唯一标示一个实体
4.实体的特性(如增长量)

对一个实体的属性分析应该包括:

1.包括的属性
2.可选的唯一标示属性
3.存储特点(如快增长型,永久型,临时型)(分表分库)

逻辑设计

数据库设计的范式

1.第一范式
2.第二范式
3.第三范式
4.BC范式

1.数据库第一范式:

数据表中的所有字段都是单一属性,不可再分的,这个单一属性是由基本的数据类型所构成的
如,整数,浮点,字符串
通俗来数,第一范式要求数据库中的表都是二维表

2.第二范式:

数据库的表中不存在非关键字段,对任一候选关键字段的部分函数依赖。部分函数依赖是指存在着组合关键字中某一关键字决定非关键字的情况。
通俗来说:所有单关键字的表都符合第二范式

3.第三范式:

第三范式是在第二范式的基础上定义的,如果表中不存在非关键字段对任意候选关键字段的传递函数依赖,都符合第三范式

4.Boyce.Codd范式:

在第三范式的基础上,在数据表中如果不存在任何字段对任一字段候选关键字段的传递函数依赖,则符合Bc范式。
也就是说如果是复合关键字,则符合关键字之间也不能存在函数依赖关系

数据库设计不当会带来的问题

1.操作异常

1.插入异常:如果某个实体随着另一个实体的存在而存在,即为缺少某个实体是无法表示另一个实体,哪个这个表久存在插入异常
2.更新异常:如果更改某表对应的某个实体的单独属性时,需要将多行更新,那么就说这个表存在更新异常
3.删除异常:如果删除表的某一行来反映某实体实例,失效时导致另一个不同实体实例信息丢失,哪个这个表中就存在删除异常

2.数据冗余:

指相同的数据在多个地方存在,或者说表中的某个列可以通过由其他列计算的到

物理设计:

1.选择合适的数据库管理系统
2.建立数据库,表及其字段的命名规范
3.根据所选的DBMS系统选择合适的字段
4.反范式化的设计

如何选择数据库:

商业数据库:
1.Oracle 适合比较大的事务操作,性能较好
2.,SQLServer 只适合在Windows下运行
开源数据库:
1.MySQL 不适合较的的事务操作,性能不如商业数库
2.PgSQL

跨平台性:
Windows:
1.Oracle
2.SQlServer
3.MySQL
4.PgSQL
Windows,Linux,mac
1.Oracle
2.MySQL
3.PgSql

企业级中经常使用:
1.Oracle
2.SQLServer
中小型企业中经常使用:
1.MySQL
2.PgSql

MySQL的存储引擎

1.MyLSAM,不支持 事务, 支持并发的插入表级锁, 主要应用:select insert 忌用读写操作频繁
2.MRG_MYISAM 不支持事务 支持并发插入的表级锁 主要应用分段归档,数据归档 。忌用全局查找多
3.Innodb 支持事务 支持MVCC的行级锁 主要应用事务处理 无禁用情况
4.Archive 不支持事务 , 锁粒度为行级锁 主要用应于日志记录jnsert和select,只支持随机数据读取更快时禁用
5.Ndb Cluster,支持事务,锁粒度为行级锁,主要应用为高可用性,适合大部分场景

表及其字段的命名规范

1.可读性原则:

使用大写和小写来格式化的库对象名来获得可读性

2.表意性原则

对象的名称应该能够描述它所标示的对象

3.长命性原则

尽量少的不使用缩写

数据库字段类型选择原则

1.列的数据类型一方面影响数据存储空的开销,另一方面也会影响数据查询性能,当一个列可以选择多个数据类型时,应该优先考虑数字类型,其次是日期或者二进制类型,最后是字符类型,对于同级别的数据类型,应该优先考虑选择占用空间小的数据类型,比如选定长而不选变长

字段类型和存储空间
TINYINT 1字节
SMALLINT 2个字节
MEDIUMINI 3个字节
INT 4个字节
BINGINT 8个字节
DATE 3个字节
DATETIME 8个字节
TIMESTAMP 4个字节
CHAR(M) M字节, 1<=M<=255
VARCHAR(M) M字节, 1<=M<=255

选择原则从两个方面考虑:

1.在对数据进行比较(查询条件,JOIN条件及排序)操作时:同样的数据,字符处理汪汪比数字处理慢
2.在数据库中,数据处理以页为单位,列的长度越小,越利于性能提升

同一级别的数据类型我们如何选择:

1.char和varchar如何选择:

1.如果列中要存储的数据长度差不多是一致的,则应该考虑用char;否则考虑用varchar
2.如果列中的最大数据长度小于50Byte,则一般考虑用char.如果这个列很少用,则基于节省空间和减少I/O考虑,还是用varchar)
3.一般大于50Byte的列不适用char类型

2.decimal和float如何选择

1.decimal用于存储精确的数据,而float只能用于存储非精确的数据,对于精确度较高的数据可以用decimal存储
2.由于float的存储空间开销一般比decimal小,(精确到7位小数只需要4个字节,而精确到15位只需要8个字节),对于非精度数据优先选择float类型

3.时间类型如何存储:
1.使用int存储时间字段的优缺点

优点:字段长度比datetime小
缺点:使用不方便,要进行函数转换
限制:只能存储到2038-1-19 11:14:07 即为2的32次方
需要存储时间粒度
年 月 日 小时 分 秒 周

2.时间存储的技巧:

如果存储的时间只是存起来很少查询,那么可以用int存储起来,如果是经常查询的时间字段,则不能用int存储

其他选择项的一些注意:

如何选择主键:

1.区分业务主键和数据库主键:
业务主键用于标示业务数据,进行表于表之间的关联;
数据库主键为了优化数据存储(Innodb会生成6个字节的隐含主键)
2.根据数据库的类型,考虑数据是否要顺序增长:
有些数据库是按主键的顺序逻辑存储的
3.主键的字段类型所占空间要尽可能小:
对于使用聚集索引方式存储的表,每个索引后面都会附加主键的信息

避免使用外健约束:

1.降低数据的导入效率
2.减低维护成本
3.虽然不建议使用外键约束,但是相关关联的列上一定要建立索引

避免使用触发器

1.降低数据导入的效率
2.可能会有意想不到的数据异常
3.使业务逻辑变得复杂

关于预留字段

1.无法准确知道预留字段字段的类型
2.无法准确的知道预留字段中所存储的内容
3.后期维护预留字段所有的成本和要增加一个字段所要的成本是相同的
4.严禁使用预留字段

反范式化:

1,反范式化就是为了性能和读取效率的考虑而适当的对第三范式的要求进行违反,而允许存在少量的数据冗余
2.换句话说,反范式化就是使用空间来换取时间

反范式化的的好处

1.减少表的关联数量
2.增加数据的读取效率
3.反范式化一定要适度

数据库的维护和优化

1.维护数据字典
2.维护索引
3.维护表结构
4.在适当的时候对表进行水平拆分或垂直拆分

如何维护数据字典

1.使用第三方工具对数据字典进行维护
2.利用数据库本身的备注字段来维护数据字典

如何维护索引

1.在合适的列建立索引

1.出现在WHERE从句,GROUP从句,ORDER BY 从句中的列
2.可选择性高的列要放在索引的前面
3.索引中不要包含太长的数据类型

2.维护索引的注意事项

1.索引不是越多越好,过多的索引不但会降低写的效率,而且会减低读的效率
2.定期维护索引碎片
3.在SQL语句中不要使用强制索引关键字

表结构的维护:

注意事项

1.使用在线变更表结构的工具
2.同时对数据字典进行维护
3.控制表的宽度和大小

数据库中适合的操作

1.数据库中适合批量操作,逐条操作适合在程序中完成
2.禁止使用Select* 这样的查询,要指定查询的字段,否则会浪费I/O
3.控制使用用户自定义函数
4.不要使用数据库中的全文索引

表的垂直拆分:解决了表的宽度过长问题

1经常查询的列放到一起
2.text,blob等大字段拆分出到附加表中

表的水平拆分:解决表中数据量大的问题

1.通过主键哈希的方式进行,将主键通过Hash key 来分为多个key

.

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值