关系型数据库遇到的问题
- 2008 年左右,网站、论坛、社交网络开始高速发展,传统的关系型数据库在存储及处理数据的时候受到了很大的挑战 ,其中主要体现在以下几点:
- 难以应付每秒上万次的高并发数据写入;
- 查询上亿量级数据的速度极其缓慢;
- 分库、分表形成的子库到达一定规模后难以进一步扩展;
- 分库、分表 的规则可能会因为需求变更而发生变更;
- 修改表结构困难;
- 在很多 互联网应用场景下,对数据联表的查询需求不是那么强烈,也并不需要在数据写入后立刻读取,但对数据的读取和并发写入速度有非常高的要求,在这样的情况下,非关系型数据库得到高速的发展;
什么是 NoSQL 数据库?
-
MongoDB 就是一款非关系型的数据库,什么叫非关系型?就是把数据直接放进一个大仓库,不标号、不连线、单纯的堆起来;传统数据库由于受到各种关系的累赘,各种数据形式的束缚,难以处理海量数据以及超高并发的业务场景;
-
为了解决上述问题,必须有一款自废武功,以求在更高层次上突破瓶颈的数据库系统,摈弃了固有模式的 MongoDB 才能应对 Facebook 上亿比特的海量数据;
-
NoSQL 意即 不仅仅是 SQL;
-
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至 2009 年趋势越发高涨,NoSQL 的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入;
NoSQL 数据库有哪些特点?
可弹性扩展;
BASE 特性;
大数据量、高性能;
灵活的数据模型;
高可用;
NoSQL 数据库有哪些种类?
键值数据库
这类数据库主要是使用数据结构中的键 Key 来查找特定的数据 Value ,优点:在存储时不采用任何模式,因此极易添加数据;
这类数据库具有极高的读写性能,用于处理大量数据的高访问负载比较合适;
键值对数据库适合大量数据的高访问及写入负载场景,例如日志系统;
主要代表是 Redis、Flare;
文档型数据库
这类数据库满足了海量数据的存储和访问需求,同时对字段要求不严格,可以随意增加、删除、修改字段,且不需要预先定义表结构,所以适用于各种网络应用;
主要代表是 MongoDB、CouchDB;
列存储型数据库
主要代表是 Cassandra 、Hbase;
这类数据库查找速度快,可扩展性强,适合用作分布式文件存储系统;
图数据库
主要代表是 InfoGrid 、Neo4J;
这类数据库利用“图结构”的相关算法来存储实体之间的关系信息,适合用于构建社交网络和推荐系统的关系图谱;
NoSQL 与 RDB 该怎么选择?
-
NoSQL 并不能完全取代 关系型数据库,NoSQL 主要被用来处理大量且多元数据的存储及运算问题,在这样的特性差异下,这里提供以下几点作为判断依据:
数据模型的关联性要求
:NoSQL 适合模型关联性比较低的应用,如果需要多表关联,则更适合用 RDB;如果对象实体关联少,则更适合用 NoSQL 数据库,其中 MongoDB 可以支持复杂度相对高的数据结构,能够将相关联的数据以文档的方式嵌入,从而减少数据之间的关联操作;数据库的性能要求
:如果数据量多切访问速度至关重要,那么使用 NoSQL 数据库可能是比较合适的,NoSQL 数据库能通过数据的分布存储大幅地提供存储性能;数据的一致性要求
:NoSQL 数据库有一个缺点:其在事务处理与一致性方面无法与 RDB 相提并论;因此,NoSQL 数据库很难同时满足强一致性与高并发性,如果应用对性能有高要求,则 NoSQL 数据库只能做到数据最终一致;数据的可用性要求
:考虑到数据不可用可能会造成风险,NoSQL 数据库提供了强大的数据可用性(在一些需要快速反馈信息给使用者的应用中,响应延迟也算某种程度的高可用);
-
一个项目并非只选择一种数据库,可以将其拆开设计,将需要 RDB 特性的放到 RDB 中管理,而其它数据放到 NoSQL 中管理;
MongoDB 基础概念
db
:和mysql
的概念一致
collection
:集合,类似于mysql
中的表
document
:每个集合中的文档,类似于mysql
中的记录
Primary Key
:和mysql
中的主键含义一致,每个document
都有一个主键field
:文档中的字段
MongoDB 的特点
mongodb
属于nosql
中的文档型数据库,每个文档相当于是一个对象,它没有列的概念,也没有表关系由于它是一个
nosql
数据库:
- 无
sql
语句- 使用极其简单,学习成本非常低
- 由于没有集合之间的关联,难以表达复杂的数据关系
- 存取速度极快
由于它是一个
文档型
数据库:
- 数据内容非常丰富和灵活
- 对数据结构难以进行有效的限制
MongoDB 适用于哪些场景?
-
需要处理大量的低价值数据,且对数据处理性能有较高要求
:比如,对微博数据的处理就不需要太高的事务性,但是对数据的存取性能有很高的要求,这时就非常适合使用 MongoDB; -
需要借助缓存层来处理数据
:因为 MongoDB 能高效的处理数据,所以非常适合作为缓存层来使用,将 MongoDB 作为持久化缓存层,可以避免底层存储的资源过载; -
需要高度的伸缩性
:对关系型数据库而言,当表的大小达到一定数量级后,其性能会急剧下降,这时可以使用多台 MongoDB 服务器搭建一个集群环境,实现最大程度的扩展,且不影响性能;
手写 computed
上一篇