# 什么是数据库
规律存储的文件系统:数据库,是一个把数据进行「规律存储」的文件系统;
简单访问:它给使用者提供了简单的操控方式,去访问(插入、修改、查询)它的数据;
隐藏特性:为了做到高性能高可靠,它实现了一系列复杂的逻辑,这些逻辑对一般使用者来说无需关心。
# 数据库选型
- 数据量:是否海量数据,单表数据量太大会考验数据库的性能
- 数据结构:结构化 (每条记录的结构都一样) 还是非结构化的 (不同记录的结构可以不一样)
- 是否宽表:一条记录是 10 个域,还是成百上千个域
- 数据属性:是基本数据 (比如用户信息)、业务数据 (比如用户行为)、辅助数据 (比如日志)、缓存数据
- 是否要求事务性:一个事务由多个操作组成,必须全部成功或全部回滚,不允许部分成功
- 实时性:对写延迟,或读延迟有没有要求,比如有的业务允许写延迟高但要求读延迟低
- 查询量:比如有的业务要求查询大量记录的少数列,有的要求查询少数记录的所有列
- 排序要求:比如有的业务是针对时间序列操作的
- 可靠性要求:对数据丢失的容忍度
- 一致性要求:是否要求读到的一定是最新写入的数据
- 对增删查改的要求:有的业务要能快速的对单条数据做增删查改 (比如用户信息),有的要求批量导入,有的不需要修改删除单条记录 (比如日志、用户行为),有的要求检索少量数据 (比如日志),有的要求快速读取大量数据 (比如展示报表),有的要求大量读取并计算数据 (比如分析用户行为)
- 是否需要支持多表操作
不同的业务对数据库有不同的要求
# 数据库分类
# SQL 数据库
# 特点
- SQL 数据库就是传统的关系型数据库
- 行列式表存储
- 结构化数据
- 需要预定义数据类型
- 数据量和查询量都不大,如果数据量大要做分表
- 对数据一致性、完整性约束、事务性、可靠性要求比较高
- 支持多表 Join 操作
- 支持多表间的完整性,要删除 A 表的某条数据,可能需要先删除 B 表的某些数据
- SQL 的增删改查功能强
- 较为通用,技术比较成熟
- 大数据量性能不足
- 高并发性能不足
- 无法应用于非结构化数据
- 扩展困难
# 常用的 SQL 数据库
- Oracle、MySQL、PostgreSQL、SQLite
# NoSQL 数据库
随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求。
虽然关 系型数据库已经在业界的数据存储方面占据不可动摇的地位,但是由于其天生的几个限制,使其很难满足上面这几个 需求:扩展困难、读写慢、成木高、有限的支撑容量。
但是 NOSQL关注的是对数据高并发地读写和对海量数据的存储等,与关系型数据库相比,它们在架构和数据模型方面做了“减法”,而在扩展和并发等方面做了”加法”。
# 特点
- 表结构较灵活,比如列存储,键值对存储,文档存储,图形存储
- 支持非结构化数据
- 有的不需要预定义数据类型,有的甚至不需要预定义表
- 支持大数据量
- 多数都支持分布式
- 扩展性好
- 基本查询能力,高并发能力比较强 (因为采用非结构化、分布式,并牺牲一致性、完整性、事务性等功能)
- 对数据一致性要求比较低
- 通常不支持事务性,或是有限支持
- 通常不支持完整性,复杂业务场景支持较差
- 通常不支持多表 Join,或是有限支持
- 非 SQL 查询语言,或类 SQL 查询语言,但功能都比较弱,有的甚至不支持修改删除数据
- 不是很通用,技术多样,市场变化比较大
# 常用的 NoSQL 数据库
- 常用的 NoSQL 数据库比如
- 列式:HBase、Cassandra、ClickHouse
- 键值:Redis、Memcached
- 文档:MongoDB
- 时序:InfluxDB、Prometheus
- 搜索:Elasticsearch
# MongoDB和Redis区别
MongoDB 和 Redis 都是 NoSQL(非关系型的数据库),采用结构型数据存储。
二者在使用场景中,存在一定的区别, 这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。
MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主从模式。
Mongodb更偏向于大数据量存储,而Redis更偏向于热数据的存储。
# 推荐阅读
用数据库选型!你做对了吗? (opens new window)