关系型数据库和非关系型数据库有什么区别?

85

MySQL,PostgreSQL和MS SQL Server是关系型数据库系统,而NoSQL、MongoDB等则是非关系型数据库管理系统。

这两种类型的系统有什么区别?


14
这不是作业...但今天我试图向朋友解释这些差异,但突然脑子一片空白。所以我想在这里搜索,但没有找到令人满意的解释。因此,我决定问问。我所说的区别是,在关系型数据库中有很多表格和表格之间的连接。NoSQL没有多个表格,它只有一个表格,并使用键值对。不确定这是否是准确的描述,所以我觉得应该问问。 - marcamillion
我认为这些答案没有帮助,因为它们花费太多时间谈论问题的困难程度,而实际上并没有回答问题。阅读了这篇博客文章后,我认为其主要观点是NoSQL比SQL数据库更适合于扩展,即当在单个计算机上增加更多的计算能力不再是一个选择时,可以变得分布式。https://www.jamesserra.com/archive/2015/08/relational-databases-vs-non-relational-databases/ - mbigras
8个回答

47
嗯,不太确定您的问题是什么。 在标题中,您问及数据库(DB),但在正文中,您问及数据库管理系统(DBMS)。这两者完全不同,需要不同的答案。
DBMS是一种工具,允许您访问DB。
除了数据本身之外,DB是数据结构的概念。
因此,就像您可以使用非面向对象编译器进行面向对象方法编程,反之亦然,您也可以设置关系型数据库而不使用RDBMS或使用RDBMS存储非关系型数据。
我将重点介绍什么是关系型数据库(RDB)并让其他人讨论系统的功能。
关系型数据库(概念)是一种数据结构,允许您链接来自不同“表”或不同类型的数据桶的信息。数据桶必须包含所谓的键或索引(允许唯一地标识存储桶内的任何原子数据块)。其他数据桶可能会引用该键,以便在其数据原子和由键指向的原子之间创建链接。
非关系型数据库只是存储数据,没有明确和结构化的机制将数据从不同的桶链接在一起。
至于实施这样的方案,如果您有一个带索引的纸质文件,而在另一个纸质文件中,您引用该索引以获取相关信息,则实现了关系型数据库,尽管这是相当简单的。因此,您甚至不需要计算机(当然,没有计算机的帮助很快就会变得繁琐),同样您不需要RDBMS,尽管可以说RDBMS是正确的工具。也就是说,不同工具之间的差异可能会影响其功能,因此选择正确的工具可能并不那么简单。
希望这个解释足够通俗易懂,并有助于您的理解。

如果你有一份带有索引的纸质文件,并且在另一份纸质文件中引用该索引以获取相关信息,那么你已经实现了一个关系型数据库,非常好的例子。如果进一步扩展,解释主键、外键等会更加完善。 - Zeni
一个人不需要了解约束条件或声明任何内容,也不需要声明任何内容(包括PK、CK和FK),就可以使用关系型数据库。它们是为了保证完整性。表代表关系。连接和其他运算符将表连接起来,以获取新的表,其关系是参数表关系的组合。此外,索引是用于实现优化的,与数据库/DBMS是否对其用户具有关系无关。 - philipxy

25
关系型数据库有一个数学基础(集合理论、关系理论),这些被提炼成了SQL == 结构化查询语言。
NoSQL的许多形式(例如基于文档、基于图形、基于对象、键值存储等)可能或可能不基于单一的基础数学理论。正如S. Lott所指出的,分层数据存储确实有一个数学基础。同样也可以说图形数据库也是如此。
我不知道是否有适用于NoSQL数据库的通用查询语言。

“没有这样的数学基础”?真的吗?按层次组织的数据库对我来说似乎非常数学化。相比之下,它们也相对简单。我认为 XML 数据库的人对可以(和不可以)在分层数据库中完成的事情有非常牢固的控制。 - S.Lott
这可能是我的无知或过于简化了,S. Lott。我会寻找一个参考资料。 - duffymo
1
我不是这方面的专家,但由于它们都是结构化数据存储,我相信至少可以将 SQL 的一个子集应用于任何模型。就此而言,我实际上很喜欢 Google 如何为其 Big Table 暴露了一种真正符合 SQL 的查询语言,这使得事情变得更加容易。http://code.google.com/appengine/docs/python/datastore/gqlreference.html - Filip Dupanović

23

你所谓的“知识”大部分都是错误的。

首先,正如一些关系数据库专家经常(有时甚至强烈地)指出的那样,SQL与关系理论的适配程度并不像许多人想象的那样紧密。其次,“NoSQL”中的大部分差异与是否关系型关系不大。最后,“NoSQL”与SQL之间的区别很难确定,因为它们两者都代表了广泛的可能性。

你可以确定的一个主要区别是,支持SQL的几乎所有东西都支持在数据库本身中设置触发器 - 也就是说,你可以将规则设计到数据库中,以确保数据始终保持内部一致性。例如,你可以设置数据库来断言一个人必须具有地址。如果这样做,每当你添加一个人时,它基本上会强制你将该人物与某个地址相关联。你可以添加一个新地址,或者将他们与某个现有地址相关联,但无论如何,该人必须有一个地址。同样,如果你删除一个地址,它会强制你要么删除当前该地址下的所有人员,要么将每个人与其他地址相关联。你还可以对其他关系进行类似的操作,比如说每个人必须有一个母亲,每个办公室必须有一个电话号码等。

需要注意的是,这些操作也保证会以原子方式进行,因此如果其他人在你添加人员时查看数据库,他们将要么根本看不到该人员,要么看到该人员与地址(或母亲等)一起出现。

大多数NoSQL数据库并不试图在数据库本身提供此类强制执行。在使用数据库的代码中,需要你自己强制执行数据必需的任何关系。在大多数情况下,也可能会看到只有部分正确的数据,因此即使你有一个家族谱,每个人都应该与父母相关联,仍然可能存在某些约束条件无法得到真正执行的情况。有些数据库允许你随意这样做,而另一些则保证它仅是暂时性的,尽管它可能的持续时间有待商榷。


10
关系型数据库使用一套正式的谓词系统来处理数据。底层的物理实现并不重要,可以根据需要进行优化,但必须始终遵循关系模型。通俗地说,这就是说“我知道我的表(关系)中每行(元组)有多少个值(属性),现在我想充分利用这个事实,彻底地、极致地利用它。”这就是这个“野兽”的真正本质。
既然我们显然是接受了关系型数据库教育的一代人,如果你从关系模型的角度来看NoSQL数据库模型,那么第一个明显的区别就是永远不会对一行包含的值的数量做出任何假设。这实际上是过于简单化了问题,并且并不适用于每个NoSQL数据库的物理模型的复杂性,但它是关系模型的顶峰,也是我们必须放弃或者说最大的飞跃。
我们可以同意两件事情对于每个DBMS都是正确的:它可以存储任何类型的数据,并且具有足够的数学基础,使得可以以任何可想象的方式管理数据。现实情况是,你永远不想犯把这两个观点放到实践中的错误,而是要坚持实际的DBMS真正为之设计的用途。通俗地说:尊重内在的野兽! 请注意,我已避免将围绕关系模型明显建立的标准与NoSQL数据库提供的许多变体进行比较。如果您愿意,可以将NoSQL数据库视为任何不完全假定关系模型而排除其他一切的DBMS的总称。差异太多了,但这是主要区别,我认为这对您理解两者最有用。

6
尝试用稍微涉及一点技术的水平来解释这个问题。
以MongoDB和传统SQL为比较对象,想象一下在Twitter上发布一条包含9张图片的推文的场景。如何存储这条推文及其相应的图片?
在传统关系型SQL中,您可以将推文和图片分别存储在不同的表中,并通过建立新表来表示它们之间的连接。
此外,您可以设置一个图像类型字段,并将9张图片压缩成二进制文档并存储在该字段中。
使用MongoDB,您可以构建类似于关系型SQL中表概念的文档:
{

"id":"XXX",

"user":"XXX",

"date":"xxxx-xx-xx",

"content":{

"text":"XXXX",

"picture":["p1.png","p2.png","p3.png"]

}

因此,在我看来,主要区别在于如何存储数据以及它们之间关系的存储级别。
在这个例子中,数据是推文和图片。它们之间关系存储级别的不同机制也在两者之间的差异中起着重要作用。
我希望这个小例子能够帮助展示SQL和NoSQL(ACID和BASE)之间的区别。
以下是一张关于NoSQL目标的图片链接:

http://icamchuwordpress-wordpress.stor.sinaapp.com/uploads/2015/01/dbc795f6f262e9d01fa0ab9b323b2dd1_b.png


非常好的解释,这里有一个链接,我第一次得到灵感就是从这里,希望能对某些人有所帮助。http://growthefuturenow.com/relational-vs-non-relational-database/ - Muhammad Sadiq

4
关系型和非关系型的区别就在于此。关系型数据库架构提供了约束对象,例如主键、外键等,允许将两个或多个表联系起来。这样做有利于我们规范化表格,也就是将数据库所表示的信息拆分成多个不同的表格,从而保持数据完整性。
例如,假设您有一系列表格,其中存储了有关员工的信息。如果您删除一个表格中的记录,则必须同时删除其他表格中与该记录相关的所有记录。通过这种方式,您可以实施数据完整性。非关系型数据库不提供这种约束结构,因此无法实现数据完整性。
除非您在用于填充数据库表格的前端应用程序中实施这些约束,否则您将实施一种类似于“荒野西部”的混乱状态。

1
首先,让我解释一下为什么我们需要数据库。
我们需要数据库来帮助组织信息,以便我们可以以有效的方式检索存储的数据。
关系型数据库管理系统(SQL)的例子:
1)Oracle数据库
2)SQLite 3)PostgreSQL
4)MySQL
5)Microsoft SQL Server 6)IBM DB2
非关系型数据库管理系统(NoSQL)的例子:
1)MongoDB
2)Cassandra
3)Redis
4)Couchbase 5)HBase 6)DocumentDB
7)Neo4j
关系型数据库具有规范化的数据,即信息以行和列的形式存储在表中,通常情况下,当数据处于规范化形式时,有助于减少数据冗余,并且表中的数据通常相互关联,因此当我们想要检索数据时,可以使用联接语句查询数据并根据需要检索数据。这适用于更多的写入,较少的读取,并且涉及的数据不多,相对于非关系型数据库而言,更新表中的数据更容易。水平扩展不可能,垂直扩展在一定程度上是可行的。符合CAP(一致性、可用性、分区容错)和ACID(原子性、一致性、隔离性、持久性)标准。
让我以PostgreSQL为例,展示向关系型数据库输入数据的过程。
首先创建一个产品表如下:
CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

然后插入数据。
INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);

让我们看另一个不同的例子: enter image description here

在关系型数据库中,我们可以使用外键、课程ID等关系将学生表和课程表连接起来。但在非关系型数据库中,由于没有关系,不需要两个文档,因此我们将所有课程详情和学生详情存储在一个文档中,即学生文档,这样会导致数据重复,使记录更新变得麻烦。

在非关系型数据库中,没有固定的模式,数据未经规范化。没有创建数据之间的关系,所有数据大多数都放在一个文档中。处理大量数据时非常适用,并且可以一次传输大量数据,最适合高读取量和低写入量以及较少的更新,但查询数据有些困难,因为没有固定的模式。水平和垂直扩展均可行。符合CAP(一致性、可用性、分区容错)和BASE(基本可用、软状态、最终一致性)标准。

让我演示一个使用Mongodb向非关系型数据库输入数据的例子。

db.users.insertOne({name: ‘Mary’, age: 28 , occupation: ‘writer’ })
db.users.insertOne({name: ‘Ben’ , age: 21})

因此,您可以理解到名为db的数据库中有一个名为users的集合,以及名为insertOne的文档,我们向其中添加数据,并且没有固定的模式,因为我们的第一条记录有3个属性,而第二个属性只有2个属性,这在非关系型数据库中不是问题,但在关系型数据库中无法实现,因为关系型数据库具有固定的模式。
让我们看另一个不同的例子。
({Studname: ‘Ash’, Subname: ‘Mathematics’, LecturerName: ‘Mr. Oak’})

因此,我们可以看到在非关系型数据库中,我们可以将学生详细信息和课程详细信息输入到一个文档中,因为非关系型数据库中没有定义关系。但是这种方式可能会导致数据重复,并且因此更新错误可能会发生。希望这样解释清楚了一切。

-1
以通俗易懂的话来说,它是强结构化与非结构化之间的差异,这意味着您可以针对您的数据库拥有不同程度的适应性。不同之处在于索引,特别是需要确保某个参考索引可以链接到另一个项目,这是一种关系。关系型数据库更严格的结构来自于此要求。
请注意,NosDB 显然提供了关系型和非关系型数据库,并提供了一种同时查询两者的方式。http://www.alachisoft.com/nosdb/sql-cheat-sheet.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接