Nosql和RDBMS的比较及解释
概述
传统的关系型数据库以及数据仓库在面对大数据的处理时显得越来越力不从心。因为关系数据库管理系统 (RDBMS)的设计从未考虑过能够处理日益增长且格式多变的数据,以及访问数据并进行分析的用户需求呈爆炸式增长的势头。它们一般都是固定的schema,缺乏对非结构化数据的支持,同时对数据分片存储、系统扩展性的支持也比较局限,系统的扩容过程也比较复杂。另外,许多传统的数据库方法是为长期的策略性分析而非实时决策构造的。在这样的背景下,NoSQL数据库就应运而生了。
数据库 schema的概念
数据库中的Schema,为数据库对象的集合,一个用户一般对应一个schema。
官方定义如下:
A schema is a collection of database objects (used by a user.).
schema objects are the logical structures (逻辑结构逻辑概念)that directly refer to the database’s data.
A user is a name defined in the database that can connect to and access objects.
schemas and users help database administrators manage database security.
为什么说NoSQL没有固定schema
若要在关系型数据库中存储数据,首先必须定义“模式”,也就是用一种预定义结构向数据库说明:要有哪些表格,表中有哪些列,每一列都存放何种类型的数据。必须先定义好模式,然后才能存放数据(结构化)。
相比之下,NoSQL 数据库的数据存储就比较随意了。“键值数据库”可以把任何数据存放在一个“键”的名下。“文档数据库”实际上也如此,因为它对所存储的文档结构没有限制。在列族数据库中,任意列里面都可以随意存放数据。你可以在图数据库中新增边,也可以随意向节点和边中添加属性。
无模式数据库的倡导者们很享受它所带来的自由与灵活。如果用了模式,那么就必须提前指明你要存储的数据,然而这一点却比较难办。摆脱模式的制约后,就可以轻易存储所需数据了,于是我们很容易就能根据项目的进展情况来修改原有的数据存储方式,一旦发现了新东西,只要把它们加入数据库中就好。此外,若是发现某些东西已经没用了,那么不再存储它们就行了。在使用模式的关系型数据库中,如果删除了某列,那么你恐怕得担心此操作会不会导致旧数据丢失。
什么是数据分片?
在数据库系统中,“分片”概念是指( 对数据的分片)。每一个全局关系都可分为若干个不相交的部分,每一部分称为一个片段。
nosql中,分片即Sharding,可以简单定义为将大数据库分布到多个物理节点上的一个分区方案。每个 shard 都被放置在一个节点上面。
为什么说nosql没有固定查询语言?
ACID与BASE
ACID
在传数据库系统中,事务具有ACID 4个属性(Jim Gray在《事务处理:概念与技术》中对事务进行了详尽的讨论)。
(1)原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
(2)一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
(3)隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
(4)持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
对于单个节点的事务,数据库都是通过并发控制(两阶段封锁,two phase locking或者多版本,multiversioning)和恢复机制(日志技术)保证事务的ACID特性。对于跨多个节点的分布式事务,通过两阶段提交协议(two phase commiting)来保证事务的ACID。
可以说,数据库系统是伴随着金融业的需求而快速发展起来。对于金融业,可用性和性能都不是最重要的,而一致性是最重要的,用户可以容忍系统故障而停止服务,但绝不能容忍帐户上的钱无故减少(当然,无故增加是可以的)。而强一致性的事务是这一切的根本保证。
BASE
BASE来自于互联网的电子商务领域的实践,它是基于CAP理论逐步演化而来,核心思想是即便不能达到强一致性(Strong consistency),但可以根据应用特点采用适当的方式来达到最终一致性(Eventual consistency)的效果。BASE是Basically Available、Soft state、Eventually consistent三个词组的简写,是对CAP中C & A的延伸。BASE的含义:
(1)Basically Available:基本可用;
(2)Soft-state:软状态/柔性事务,即状态可以有一段时间的不同步;
(3)Eventual consistency:最终一致性;
BASE是反ACID的,它完全不同于ACID模型,牺牲强一致性,获得基本可用性和柔性可靠性并要求达到最终一致性。
自我总结:
### 概述 NoSQL(Not Only SQL)和 RDBMS(Relational Database Management System)是两种不同类型的数据库管理系统,它们在数据存储结构、查询方式、可扩展性等方面存在显著差异,适用于不同的应用场景。
详细比较
1. 数据存储结构
- RDBMS
- 特点:以表的形式存储数据,表由行和列组成,每一行代表一条记录,每一列代表一个字段。数据之间通过关系(如主键 - 外键关系)进行关联。
- 举例:在一个电商系统中,有用户表(
users)和订单表(orders)。用户表包含用户的基本信息,如用户 ID、姓名、邮箱等;订单表包含订单的相关信息,如订单 ID、用户 ID、商品名称、订单金额等。通过用户 ID 这个外键,将订单表和用户表关联起来,方便查询某个用户的所有订单信息。
-- 用户表
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
-- 订单表
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
product_name VARCHAR(100),
amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
- NoSQL
- 特点:数据存储结构更加灵活,常见的有键值对(Key - Value)、文档(Document)、列族(Column Family)和图(Graph)等。不需要预先定义表结构,可以根据实际数据动态调整。
- 举例:使用 Redis(键值对数据库)存储用户的缓存信息,以用户 ID 作为键,用户的 JSON 数据作为值。
import redis
# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 存储用户信息
user_id = 1
user_info = {
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
r.set(user_id, str(user_info))
# 获取用户信息
result = r.get(user_id)
print(result)
2. 查询方式
- RDBMS
- 特点:使用 SQL(Structured Query Language)进行查询,SQL 是一种标准化的查询语言,具有强大的查询和操作能力,支持复杂的查询,如多表连接查询、聚合查询等。
- 举例:查询所有用户的订单总金额,并按用户姓名排序。
SELECT u.name, SUM(o.amount) AS total_amount
FROM users u
JOIN orders o ON u.user_id = o.user_id
GROUP BY u.user_id
ORDER BY u.name;
- NoSQL
- 特点:不同类型的 NoSQL 数据库有不同的查询方式,一般没有统一的查询语言。查询方式相对简单,主要基于键进行查找,对于复杂查询的支持较弱。
- 举例:在 MongoDB(文档数据库)中,查询年龄大于 20 岁的用户信息。
from pymongo import MongoClient
# 连接 MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['testdb']
collection = db['users']
# 查询年龄大于 20 岁的用户
query = {"age": {"$gt": 20}}
results = collection.find(query)
for result in results:
print(result)
3. 可扩展性
- RDBMS
- 特点:垂直扩展比较容易,通过增加服务器的硬件资源(如 CPU、内存、磁盘等)来提高性能。但水平扩展相对困难,因为数据之间存在复杂的关系,在进行数据分片和复制时需要考虑数据的一致性和完整性。
- 举例:一个小型企业的数据库系统,随着业务的增长,数据量和访问量逐渐增加。可以通过升级服务器的硬件配置,如增加内存、更换更快的磁盘等方式来提高数据库的性能。
- NoSQL
- 特点:天生具有良好的水平扩展能力,可以通过增加服务器节点来提高系统的性能和存储容量。数据通常是分布式存储的,易于实现数据的分片和复制。
- 举例:一个大型的社交网络系统,每天会产生大量的用户数据和访问请求。使用 Cassandra(列族数据库)可以轻松地通过添加节点来扩展系统的存储和处理能力。
4. 事务处理
- RDBMS
- 特点:支持严格的事务处理,遵循 ACID(原子性、一致性、隔离性、持久性)原则,确保数据的完整性和一致性。适用于对数据一致性要求较高的场景,如金融交易系统。
- 举例:在银行转账业务中,需要保证从一个账户扣除金额和另一个账户增加金额这两个操作要么同时成功,要么同时失败。使用 RDBMS 可以通过事务来实现这一要求。
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
- NoSQL
- 特点:大多数 NoSQL 数据库对事务的支持较弱,通常只支持部分事务特性或提供最终一致性。更注重系统的高可用性和可扩展性。
- 举例:在一个电商系统的商品库存管理中,使用 Redis 作为缓存存储商品的库存信息。当用户下单时,先在 Redis 中减少库存,然后异步更新数据库中的库存信息。这种方式虽然不能保证实时的一致性,但可以提高系统的性能和可用性。
总结
RDBMS 适用于对数据一致性要求高、数据结构相对稳定、需要进行复杂查询的场景,如企业资源规划(ERP)系统、金融系统等。NoSQL 适用于对数据处理速度和可扩展性要求高、数据结构灵活、不需要严格事务处理的场景,如社交网络、物联网、日志分析等。在实际应用中,可以根据具体的业务需求选择合适的数据库管理系统,甚至可以将两者结合使用,发挥各自的优势。

浙公网安备 33010602011771号