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


82

我知道像MySQL,PostgreSQL和MS SQL Server这样的解决方案是关系数据库系统,而NoSQL,MongoDB等是非关系DBMS。

但是,两种类型的系统有什么区别?

最好使用Layman术语。

谢谢。


11
这不是家庭作业……但是今天我试图向一位朋友解释这些差异,因此有点空白。所以我想我会在这里搜索,但找不到令人满意的解释。所以想通了。我说的区别是,在RDBMS中,有很多表和表之间的联接。NoSQL没有多个表,它只有一个表并使用键值对。不知道这是否是准确的描述,所以我想问一下。
marcamillion

我发现这些答案无济于事,因为他们花太多时间谈论这个问题有多困难而没有实际回答这个问题。阅读这篇博客文章后,我认为主要的思想是在扩展方面,nosql比sql dbs好,即在扩展时变得分布式,即不再具有单台计算机上的更多计算能力jamesserra.com/archive/2015/08/…
mbigras

Answers:


23

关系数据库具有数学基础(集合论,关系论),这些数学基础被提炼成SQL ==结构化查询语言。

NoSQL的许多形式(例如,基于文档,基于图,基于对象,键值存储等)可能基于也可能不是基于单一的基础数学理论。正如S. Lott正确指出的那样,分层数据存储确实具有数学基础。对于图数据库也可以这样说。

我不知道NoSQL数据库的通用查询语言。


“没有这样的数学基础”吗?真?分层数据库对我来说似乎很数学。相比之下,它们也相对简单。我认为XML数据库专家对分层数据库中可以(也不能)完成的事情有很牢靠的锁定。
S.Lott

S. Lott,可能是我对工作的无知或过份简化。我将寻找参考。
duffymo 2011年

1
我不是这方面的专家,但是由于它们都是结构化数据集,因此我相信至少可以将SQL的子集应用于任何模型。因此,我实际上很喜欢Google如何针对其Big Tablecode.google.com/appengine/docs/python/datastore/…公开SQL真正的查询语言。确实使事情变得容易得多。
FilipDupanović2011年

43

嗯,不太清楚您的问题是什么。

在标题中询问数据库(DB),而在正文中询问数据库管理系统(DBMS)。两者完全不同,需要不同的答案。

DBMS是允许您访问数据库的工具。

除了数据本身之外,DB是该数据的结构概念。

因此,就像您可以使用非OO支持的编译器使用面向对象方法进行编程一样,反之亦然,您可以在没有RDBMS的情况下建立关系数据库或使用RDBMS来存储非关系数据。

我将重点介绍关系数据库(RDB)的含义,而不再讨论有关系统对他人的作用。

关系数据库(概念)是一种数据结构,可让您链接来自不同“表”或不同类型数据桶的信息。数据存储区必须包含所谓的键或索引(它可以唯一地标识存储区中的任何原子数据块)。其他数据存储区可以引用该密钥,以便在其数据原子和该密钥指向的原子之间创建链接。

非关系型数据库仅存储数据,而没有显式和结构化的机制将不同存储桶中的数据相互链接。

关于实现这种方案,如果您有一个带有索引的纸质文件,而在另一个纸质文件中,则引用该索引以获取相关信息,那么您就已经实现了一个关系数据库,尽管它非常简单。因此,您看到甚至不需要计算机(当然,如果没有计算机的帮助,它很快就会变得很乏味),同样,您也不需要RDBMS,尽管可以说RDBMS是完成这项工作的正确工具。也就是说,对于不同的工具可以做些什么,因此为工作选择合适的工具可能不是那么简单。

我希望这是足够的外行术语,对您的理解有所帮助。


“如果您有一个带有索引的纸质文件,而在另一个纸质文件中,您引用该索引以获得相关信息,那么您已经实现了一个关系数据库”。如果将其进一步扩展以解释主键,外键等,那就太好了
Zeni

使用关系数据库不需要了解约束或声明任何约束或有任何要声明的约束(包括PK,CK和FK)。他们是为了诚信。表格代表关系(船)。联接和其他运算符连接表以获取新表,这些新表的关系是参数表的关系的组合。索引也用于实现优化,并且与与其用户相关的数据库/ DBMS不相关。
philipxy

22

您“知道”的大多数内容都是错误的。

首先,正如一些关系专家通常(有时是偶然地)指出的那样,SQL与关系理论的契合度实际上并不像许多人认为的那么紧密。其次,“ NoSQL”内容中的大多数差异与它是否是关系无关。最后,很难说“ NoSQL”与SQL的不同之处,因为两者都代表了广泛的可能性。

您可以指望的一个主要区别是,几乎所有支持SQL的东西都支持数据库本身中的触发器之类的东西-即您可以在数据库中设计适当的规则,以确保数据始终在内部保持一致。例如,您可以进行设置,以便您的数据库断言一个人必须有一个地址。如果这样做,则无论何时添加一个人,基本上都会迫使您将该人与某个地址相关联。您可以添加一个新地址,也可以将它们与某个现有地址相关联,但是此人必须使用一种或多种地址。同样,如果删除一个地址,它将迫使您要么删除当前在该地址的所有人员,要么将每个人与其他地址相关联。对于其他关系,您也可以这样做,例如说每个人必须有一位母亲,每个办公室必须有一个电话号码,等等。

请注意,这些事情也保证原子发生,如果别人查看数据库为你添加的人,他们就会要么根本看不到人,不然他们会看到的人的地址(或母亲等)

大多数NoSQL数据库都不会尝试在数据库本身中提供这种强制执行。在使用数据库的代码中,由您决定是否要强制执行数据所需的任何关系。在大多数情况下,也有可能看到仅部分正确的数据,因此,即使您有一棵应该让每个人都与父母联系在一起的家谱,有时您施加的任何约束实际上并不会强制执行。有些会让您随心所欲。其他人保证它只是暂时发生的,尽管它可以/将持续多长时间确实值得商question。


9

关系数据库使用正式的谓词系统来处理数据。基础的物理实现无关紧要,可以针对某些操作进行优化以进行优化,但是必须始终采用关系模型。用外行的话来说,这就是说我确切地知道我的表(关系)中的每一行(元组)有多少个值(属性),现在我想据此彻底,极端地利用这一事实。这就是真正的野兽的本质。 

因为我们显然是经历过关系培养的这一代人,所以如果您从关系模型的角度来看NoSQL数据库模型,又以通俗易懂的话,第一个明显的区别是,对行数的数量没有任何假设可以包含了。这确实简化了此事,并不能完全适用于每个NoSQL数据库的物理模型的复杂性,但这是关系模型的顶峰,也是我们必须抛弃的第一个假设,或者,如果您愿意,最大的假设是最大的假设。我们必须做出的飞跃。

对于每个DBMS,我们可以同意两件事:它可以存储任何类型的数据,并且具有足够的数学基础,从而可以以任何可以想象的方式来管理数据。现实情况是,您永远不会犯过将两点中的任何一个置于测试中的错误,而只是坚持使用真正的DBMS。用外行的话来说:尊重内兽!

(请注意,我避免将围绕关系模型的(显然)行之有效的标准与NoSQL数据库提供的多种风格进行比较。如果愿意,可以将NoSQL数据库视为所有不完全兼容的DBMS的总称。假设关系模型被排除在其他所有事物之外。差异太多,但这是主要的差异,我认为最适合您用来理解两者的差异。)


6

尝试在涉及一点点技术的水平上解释这个问题

以MongoDB和Traditional SQL进行比较,想象一下在Twitter上发布Tweet的场景。该推文包含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)之间的区别。

这是有关Internet上NoSQL目标的图片链接:

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


真的很好的解释,这里有我第一次想到的链接,我希望它可能对某些人有所帮助。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)卡桑德拉

3)Redis

4)Couchbase

5)HBase的

6)文档数据库

7)Neo4j

关系数据库具有规范化的数据,因为信息以行和列的形式存储在表中,通常,当数据为规范化形式时,它有助于减少数据冗余,并且表中的数据通常相互关联,因此当我们想要检索数据,我们可以使用join语句查询数据并根据需要检索数据。这非常适合我们想要进行更多写入,更少读取以及不涉及太多数据的情况,相对而言,这确实非常容易更新表中的数据比更新非关系数据库中的数据。不能进行水平缩放,可以在一定程度上进行垂直缩放.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);

让我们看另一个不同的例子: 在此处输入图片说明

在关系数据库中,我们可以通过外键,学科ID使用关系来链接学生表和学科表,但是在非关系数据库中,由于没有关系,因此不需要两个文档,因此我们存储了所有学科详细信息和一个文档中的学生详细信息说是学生文档,那么数据将被复制,这使更新记录变得很麻烦。

在非关系数据库中,没有固定的架构,数据没有规范化。没有创建数据之间的关系,所有数据大部分都放在一个文档中。非常适合在处理大量数据时使用,并且可以一次传输大量数据,这在没有固定模式的情况下最适合读取量大,写入量少,更新少,难以查询数据的情况。可以进行水平和垂直缩放。CAP(一致性,可用性,分区容忍)和BASE(基本可用,软状态,最终一致)合规性。

让我展示一个使用Mongodb将数据输入到非关系数据库的示例

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

因此,您可以理解,在名为db的数据库中,有一个称为用户的集合,还有一个向我们添加数据的名为insertOne的文档,并且没有固定的架构,因为我们的第一条记录具有3个属性,第二个属性仅具有2个属性,这在非关系数据库中没有问题,但是在关系数据库中不能这样做,因为关系数据库具有固定的架构。

让我们看另一个不同的例子

({Studname: ‘Ash’, Subname: ‘Mathematics’, LecturerName: ‘Mr. Oak’})

因此,我们可以看到在非关系数据库中我们可以将学生详细信息和学科详细信息都输入到一个文档中,因为在非关系数据库中没有定义任何关系,但是这种方式可能导致数据重复,因此可能会发生更新错误。

希望这能解释一切


-1

用外行术语来说,它是强结构化还是非结构化,这意味着您对数据库具有不同程度的适应性。索引编制方面会出现差异,尤其是当您需要确保某个参考索引可以链接到另一个项目->此关系时。关系数据库的更严格结构来自此要求。

注意,NosDB适当地提供了关系数据库和非关系数据库,并且提供了一种查询http://www.alachisoft.com/nosdb/sql-cheat-sheet.html的方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.