数据库:简单认知关系型数据库和菲关系型数据库
概要
简单来说区别在于数据库软件是否负责维护数据间的关系。
关系型数据库是依照实体-关系模型建立起来的,它包括两个部分:一是数据库部分,负责数据的保存和索引,让你完成增删改查操作;另一个是关系部分,利用数据表把数据按行的形式组织起来,检查每个字段的数据类型、长度甚至取值范围,利用外键约束数据表之间的关系,利用事务机制确保数据库操作的 ACID 特性。
非关系型数据库全部或者部分放弃了实体-关系模型,它们只负责保存数据,并不组织数据表,也不约束表间关系,关系的部分交由开发人员自己来完成。比如 MongoDB 用 JSON 序列化的方式保存数据,虽然也有表的概念,但是结构可以随时扩展调整,而无需更新既有数据。比如 LevelDB 是一个 Key-Value 数据库,重视写入性能而非读取性能。 Redis 提供了 Key-Value 、 List 、 Set 、 Sorted Set 等多种数据结构模型。 Cassandra 则使用面向列的数据模型。
关系型数据库设计之初是为了给国防、金融、政府及企业管理使用,对数据一致性要求极高,再加上当年存储成本高昂,业界努力的方向也是确保事务安全和减少数据冗余。实体-关系模型提供了简单易学、健壮可靠,相对通用的软件数据建模方法,自然成为各种数据库软件的基础模型。非关系型数据库早就存在,但是因为缺乏必要的数据一致性保障而未能流行。直到 SNS 时代,社交网络应用对数据的一致性要求相对较低,对数据处理的实时性要求和大并发处理能力方面的要求非常高。通过放弃一致性检查和事务机制,非关系型数据库一般比关系型数据库拥有更好的性能,而且也不局限于实体-关系模型,能有更灵活的数据模型和操作方式供开发人员使用。
未来的趋势是两者结合, PostgreSQL 作为老牌的 RDBMS 开始提供 JSON 等更灵活的数据字段, Redis 等典型的 NoSQL 系统也开始提供 atom 操作接口。
不存在哪种数据库更好,请按自己的实际业务场景结合起来使用。
把数据库想象成一个箱子。你往 Oracle 型箱子放东西前必须用盒子装起来(盒子即是表),而且规定了一个盒子里只能放规格一致的东西(表中的记录都拥有相同的字段)。你往 MongoDB 型箱子放东西时就没那么多限制了,只管放就行了,怕太乱就也用盒子装起来(盒子即是集合),但没有规格一致的限制(集合中的记录可以有不同的字段)。
简单来讲就是范式化与非范式化。
比较
1.实质。
非关系型数据库的实质:非关系型数据库产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能。
2.价格。
目前基本上大部分主流的非关系型数据库都是免费的。而比较有名气的关系型数据库,比如Oracle、DB2、MSSQL是收费的。虽然Mysql免费,但它需要做很多工作才能正式用于生产。
3.功能。
实际开发中,有很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是更明智的选择。
非关系型数据库的优势:
1. 性能
NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
2. 可扩展性
同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
关系型数据库的优势:
1. 复杂查询
可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
2. 事务支持
使得对于安全性能很高的数据访问要求得以实现。
对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
但是近年来这两种数据库都在向着另外一个方向进化。例如:
NOSQL数据库慢慢开始具备SQL数据库的一些复杂查询功能的雏形,比如Couchbase的index以及MONGO的复杂查询。对于事务的支持也可以用一些系统级的原子操作来实现例如乐观锁之类的方法来曲线救国。
SQL数据库也开始慢慢进化,比如HandlerSocker技术的实现,可以在MYSQL上实现对于SQL层的穿透,用NOSQL的方式访问数据库,性能可以上可以达到甚至超越NOSQL数据库。可扩展性上例如Percona Server,可以实现无中心化的集群。
虽然这两极都因为各自的弱势而开始进化出另一极的一些特性,但是这些特性的增加也会消弱其本来具备的优势,比如Couchbase上的index的增加会逐步降低数据库的读写性能。所以怎样构建系统的短期和长期存储策略,用好他们各自的强项是架构师需要好好考虑的重要问题。
示例-mysql 与mongodb的比较
参考前文:Mysql和MongoDB性能对比及应用场景分析