社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NoSql

“这些年,我对 SQL 与 NoSQL 的错误认知!”

CSDN • 2 年前 • 345 次点击  

译者 | 王雪迎   责编 | 王晓曼
出品 | CSDN(ID:CSDNnews)


SQL与NoSQL的错误区分

我有一个存在很长时间的误解,就是使用SQL(StructuredQuery Language,结构化查询语言)的系统是按照关系数据库定义的,而不使用SQL的系统(例如MongoDB、Cassandra)则是非关系的。
有一篇Geeks for Geeks的文章将关系数据库与SQL使用混为一谈。
一个数据库是否使用SQL很容易理解,但是当我们说一个数据库是关系数据库时,它意味着什么呢?至少,关系数据库以“关系”的形式揭示数据,也就是具有行和列的表的另一种说法。而SQL只是一种以关系方式查询数据的普遍方式。
AWS巧妙地解释了这种区别。关系数据库的定义始于:关系数据库是具有预定义关系的数据项的集合。这些数据项被组织成一组具有列和行的表。表用于保存要在数据库中表示的对象的相关信息。只有在说明“SQL或结构化查询语言是用于与关系数据库通信的主要接口”时,SQL才会稍微多露一点面。
MongoDB的创建者在解释为什么不使用SQL时,似乎意识到了这种有误导性的术语混淆:NoSQL这个术语有点不准确 — 我们实际上是在谈论水平可扩展的后关系存储,而不是查询语言。我会考虑使用Google App Engine Data Store NoSQL,它使用类似SQL的查询语言GQL。
一些原因在于(尤其是我的):
  • 我们使用查询语言的方式是将查询表示为JSON,主要原因是使用查询机制对我们存储的数据进行规范化。如果我们在数据库中存储JSON,我们能不能也以这种方式表示查询?我们认为这是合理的。
  • 我从不喜欢将一种编程语言嵌入另一种编程语言。动态构建SQL字符串对我来说总是有点奇怪。我更喜欢以数据驱动的方式来表示查询。
因此,这与能通过SQL查询MongoDB新的数据湖产品在逻辑上并不矛盾。
Atlas Data Lake的测试版SQL支持旨在为需要或喜欢SQL的用户简化对整个MongoDB生态系统的使用。
此外,我们还将提供一个JDBC驱动程序,使用户可以将所有他们喜欢的、依赖SQL的数据可视化、数据科学或机器学习工具连接到他们的Atlas数据湖。

Atlas Data Lake对SQL的支持

为什么这种区分很重要?这太过学究气了,SQL是一种通用的语言,它的功能远不止查询关系数据库。例如,SQL可用于查询S3、触发Hive中的分析作业、通过osquery即时检索操作系统信息、提供持续更新的Materialize流数据的关系视图,甚至查询NoSQL数据库。反之,也可以从SQL以外的语言(如EdgeQL)查询关系数据。
一个osquery的例子
我们可以尝试用关系型和非关系型来划分数据库,而不是按照SQL和NoSQL来划分它们(也许这就是我们大多数人所认为的区别)。但这两个数据库阵营也在慢慢融合,MySQL和 PostgreSQL支持 JSON 数据类型,MongoDB 支持伪连接和事务。
其他因素,如所谓的NoSQL数据库的水平可扩展性,也不能有效区分两者。从业者发现,我们可以通过将查询引擎添加到键值存储、完全关系分布式数据库(F1、CockroachDB)或作为主副本RDBMS节点组(Vitess)上的层来构建半关系数据库。
SQL
SQL或结构化查询语言是用于与关系数据库通信的主要接口。SQL于1986年成为美国国家标准协会(ANSI)的标准。
所有流行的关系数据库引擎都支持标准ANSI SQL,其中一些引擎还扩展了ANSI SQL以支持特定于该引擎的功能。SQL用于添加、更新或删除数据行,为事务处理和分析应用程序检索数据子集,以及管理数据库的各个方面。
数据完整性
数据完整性是指数据的整体完整性、准确性和一致性。关系数据库使用一组约束来强制数据库中的数据完整性。这些约束包括主键、外键、“非空”约束、“唯一”约束、“默认”约束和“检查”约束。
这些完整性约束有助于对表中的数据强制实施业务规则,以确保数据的准确性和可靠性。除此之外,大多数关系数据库还允许将客户代码嵌入到基于数据库操作执行的触发器中。
事务
数据库事务是一个或多个SQL语句,它们作为来自单个逻辑工作单元的一系列操作执行。事务提供了一个“全做或全不做”的机制,这意味着整个事务必须作为一个单元完成并写入数据库,否则事务的任何单个组件都不应通过。
在关系数据库术语中,事务会导致提交或回滚。每个事务都以独立于其他事务的一致且可靠的方式进行处理。
ACID兼容性
所有数据库事务都必须符合ACID,或者说具有原子性、一致性、隔离性和持久性,以确保数据完整性。
原子性要求事务作为一个整体成功执行,或者如果事务的一部分失败,则整个事务无效。一致性要求作为事务的一部分写入数据库的数据必须遵守所有定义的规则和限制,包括约束、级联和触发器。
隔离性对于实现并发控制,并确保每个事务自身独立至关重要。持久性要求一旦事务成功完成,对数据库所做的所有更改都是永久性的。
以上AWS对关系数据库属性的描述。许多NoSQL数据库都支持事务和ACID属性,我相信其中一些数据库确实保证了数据安全。
NoSQL数据库承认,它们最大的优点是缺少严格的模式,以及由此带来的好处,比如迁移不那么痛苦。
在我看来,这是目前两大阵营的主要区别。让我们试着通过严格与松散的模式验证来区分这些数据库,而不是SQL与NoSQL,这样对于下一代开发人员就不会那么困惑了。
根据这个定义,基于行或基于列的数据数据库都应算作关系数据库,但实际上,似乎只有基于行的数据库系统才被视为关系数据库。
“关系”一词的创建者指出,关系系统中的数据应该通过表名、主键和列名(规则2)进行查询,而像AWS这样的供应商似乎认为列式数据库与关系数据库是对立的。列存储通常被认为是四种主要的NoSQL数据库类型之一。
原文链接:
https://www.softwareatscale.dev/p/sql-vs-nosql-is-the-wrong-distinction

微信正式宣布开放外部链接;iPhone13预购开启导致苹果官网崩了;特斯拉将向车主提供新版 FSD|极客头条

将 15000 行代码从 C++ 编译为 WebAssembly,是种怎样的体验?

新款 Apple Watch 键盘疑似“抄袭”?开发者喊话苹果:“法庭上见!”

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/120228
 
345 次点击