在日常工作中,数据库的设计总是一大难的问题,是该选择关系型数据库还是非关系型数据库?表结构字段该如何设计?表之间如何关联?很多人可能无从下手,该遵循什么原则,现在根据本人的3年工作经验,在本篇文章中讲明如何设计数据库,因认知有限,如有误,欢迎指点!
数据库的设计主要从以下几个方面进行考虑:
- 数据库的选型
- 存储引擎的选择
- 表结构的设计
- 数据库的优化
所以本文的目录结构(章节)也分为以上四个,每个章节将会对四类主题进行介绍
一、数据库的选型
市面上有各种数据库,可以根据下面的条件进行分类
1)海量数据:可以理解为大数据类型,可选的数据库包括
2)数据结构:主要是分为行或列数据库,行存储主要应用于传统的业务场景中,而列存储则发挥他查询速度方面的优势,主要用于海量数据分析一类的方面
3)是否宽表:字段的数量
4)数据属性:可分为常用数据、辅助数据(比如日志)
5)要求事务:是否支持事务
6)实时性:例如写的要求高、读延迟低等场景
7)查询量:例如是查询大量数据的少数列,还是少数数据的所有列
8)一致性要求
9)增删改查的要求:比如日志、报表、行为分析的场景,对查询的性能要求不一样
所有系统的99%业务都是用结构化数据,即关系型数据库,只要优化的是关系型数据库,sql和nosql是互补的关系
现在主流的数据库如下:
类型 | 数据库 |
---|---|
关系型 | MySQL、Oracle |
列示 | HBase |
键值对 | Redis、Memrached |
文档 | MongoDB |
时序 | InfluxDB |
搜索 | ES |
二、存储引擎
选择存储引擎是从以下三点进行考虑
1)支持的字段和数据类型
2)锁类型
3)事务
注意:innodb不支持hash索引,创建hash索引不会报错,会被替换成btree
三、表结构设计:
表结构设计考虑:表、字段、索引,可以自由选择下面两个方向设计数据库:
1)先设计表结构与关系,再考虑上层对象的关系
适用情况:项目工期不急,稳定性高,扩展性要求高
步骤:先设计数据库关系,再设计对象(考虑到数据库表的所有操作,以后的任何需求都能再设计的框架里面,可以随意的加字段)
2)先设计对象,再连接关系
适用情况:工期赶,需要快速的设计出数据库,便于实施和理解,但是这样扩展性较低
步骤:先设计对象,比如学生表、教师表,根据对象设计出表结构并连接表,以后需要加字段比较麻烦
Tip:设计数据库要重点考虑底层数据关系,对象关系用来辅助设计
当遇不清楚字段是否需要保留时,思考是否会引起下列问题,从而决定是否保留字段:
1)数据不一致
2)允许部分数据冗余(反范式)
3)crud异常(某些数据的缺失,导致部分数据不能操作,eg:删除异常,删除数据导致其他字段缺失)