做问卷调查赚钱的网站好,做网站搞友情链接,重庆天蚕网络科技有限公司,wordpress theme 插件前面的内容介绍了数据库读写分离和分库分表相关知识#xff0c;都是针对关系型数据库的#xff0c;即通常说的 RDBMS。除了关系型数据库#xff0c;NoSQL 在项目开发中也有着越来越重要的作用#xff0c;与此同时#xff0c;NoSQL 相关的内容也是面试的常客。今天我们一起…前面的内容介绍了数据库读写分离和分库分表相关知识都是针对关系型数据库的即通常说的 RDBMS。除了关系型数据库NoSQL 在项目开发中也有着越来越重要的作用与此同时NoSQL 相关的内容也是面试的常客。今天我们一起来看下 NoSQL 数据库有哪些应用。
对比关系型数据库
在介绍 NoSQL 数据库之前先回顾下关系型数据库。还记得 SQL 语言的全称吗Structured Query Language也就是结构化查询语言结构化查询对应的存储实现是关系型数据库我们熟悉的 MySQL、Oracle 和 SQL Server都是关系型数据库的代表。
关系型数据库通过关系模型来组织数据在关系型数据库当中一个表就是一个模型一个关系数据库可以包含多个表不同数据表之间的联系反映了关系约束。
不知道你是否应用过 ER 图在早期的软件工程中数据表的创建都会通过 ER 图来定义ER 图Entity Relationship Diagram称为实体-联系图包括实体、属性和关系三个核心部分。
下面是在电商领域中一个简化的会员、商品和订单的 ER 图 简化版的会员、商品和订单 ER 图
ER图中的实体采用矩形表示即数据模型中的数据对象例如电商业务模型中的会员、商品、订单等每个数据对象具有不同的属性比如会员有账户名、电话、地址等商品有商品名称、价格、库存等属性。不同的数据对象之间又对应不同的关系比如会员购买商品、创建订单。
有了 ER 图等的辅助设计关系型数据库的数据模型可以非常好的描述物理世界比较方便地创建各种数据约束。
另外一方面关系型数据库对事务支持较好支持 SQL 规范中的各种复杂查询比如 join、union 等操作。正是由于对 SQL 规范的支持也使得关系型数据库对扩展不友好比较难进行分布式下的集群部署。
NoSQL 数据库特性
NoSQL 数据库是在 SQL 的基础上发展的对 NoSQL 的具体解释你可以认为是 Not Only SQL也可以认为是 Non-Relational SQL。
NoSQL 对应非关系型数据库不同于传统的关系型数据库如果说关系型数据库是武侠小说中的正统功夫NoSQL 数据库就是野路子少了很多约束也就不拘一格、自成一派。那么对比关系型数据库NoSQL 型数据库有哪些优点呢 良好的扩展性容易通过集群部署
关系型数据库在进行扩展时要考虑到如何分库分表、扩容等各种实现方案都比较重对业务侵入较大。NoSQL 数据库去掉了关系型数据库的关系特性天生对集群友好这样就非常容易扩展。 读写性能高支持大数据量
关系型数据库对一致性的要求较高数据表的结构复杂读写的性能要低于非关系型数据库。另外一方面部分 NoSQL 数据库采用全内存实现更适合一些高并发的访问场景。 不限制表结构灵活的数据模型
应用关系型数据库需要通过 DML 语句创建表结构数据表创建以后增删字段需要重新修改表结构。如果使用 NoSQL一般不需要事先为数据建立存储结构和字段可以存储各种自定义的数据。
NoSQL 数据库有这么多优点但是在项目开发中关系型数据库和非关系型数据库不是对立的而是相辅相成的。从性能的角度来讲NoSQL 数据库的性能优于关系型数据库从持久化角度关系型数据库优于 NoSQL 数据库。
专栏最开始提到了 CAP 理论从 CAP 的角度NoSQL 数据库一般提供弱一致性的保证实现最终一致性也就是关系型数据库强调 CP 模型而 NoSQL 关注的是 AP 模型同时应用 NoSQL 和关系型数据库可以满足高性能的基础上同时保证数据可靠性。
NoSQL 数据库应用
非关系型数据库有很多类型应用的侧重点也不同可以从以下几个角度进行分类。
Key-Value 数据库
Key-Value 存储就是我们熟悉的 Map 结构支持高性能的通过 Key 定位和存储。通常用来实现缓存等应用典型的有 Redis 和 Memcached。
以 Redis 为例作为应用最多的非关系型数据库之一Redis 可以说是日常工作中的一把瑞士军刀。
从性能的角度为了提高读写效率Redis 在最开始的版本中一直使用单线程模型避免上下文切换和线程竞争资源并且采用了 IO 多路复用的技术提升了性能另外在最近的版本更新中Redis也开始支持多线程处理感兴趣的同学可以查看相关的资料了解。
从存储结构的角度Redis 支持多种数据结构得益于这些Redis 有丰富的应用场景并且针对不同的数据规模等Redis 采取多种内存优化方式尽量减少内存占用。比如List 结构内部有压缩列表和双向链表两种实现在数据规模较小时采用 ZipList 实现特别是在新的版本更新中又添加了 QuickList 的实现减少内存的消耗。
从高可用的角度作为一个内存数据库Redis实现了AOF和RDB的数据持久化机制另外Redis支持了多种集群方式包括主从同步Sentinel和Redis Cluster等机制提高了整体的数据安全和高可用保障。
文档型数据库
文档型数据库可以存储结构化的文档比如 JSON 或者 XML从这个角度上看文档型数据库比较接近关系型数据库。但是对比关系型数据库文档性数据库中不需要预先定义表结构并且可以支持文档之间的嵌套典型的比如 MongoDB这一点和关系型数据库有很大的不同。
以 MongoDB 为例采用了基于 JSON 扩展的 BSON 存储结构可以进行自我描述这种灵活的文档类型特别适合应用在内容管理系统等业务中。MongoDB 还具备非常优秀的扩展能力对分片等集群部署的支持非常全面可以快速扩展集群规模。
列存储数据库
列式数据库被用来存储海量数据比如 Cassandra、HBase 等特点是大数据量下读写速度较快、可扩展性强更容易进行分布式部署。
以 HBase 为例HBase 支持海量数据的读写特别是写入操作可以支持 TB 级的数据量。列式数据库通常不支持事务和各种索引优化比如 HBase 使用 LSM 树组织数据对比 MySQL 的 B 树在高并发写入时有更好的性能。
图形数据库
在一些特定的应用场景可以应用特殊的数据库比如图形数据库。在学习数据结构时我们知道社交网络中的用户关系可以使用图来存储于是诞生了一些图形数据库可以方便地操作图结构的相关算法比如最短路径、关系查找等。
图形数据库在一般的工程开发中应用较少感兴趣的同学可以去了解一下。
总结
本文分享了 NoSQL 数据库相关的知识点包括关系型数据库和非关系型数据库的对比分析了常见 NoSQL 数据库的分类和应用特性。
大多数场景下NoSQL 数据库是配合关系型数据库一起使用的这就涉及了不同存储之间的同步问题比如缓存和数据库的同步等针对这个问题会在缓存模块展开介绍。现在你可以结合自己的项目实践思考下应用过哪些非关系型数据库以及使用了哪些对应特性如何配合关系型数据库等欢迎留言分享。