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

时间:2011-01-27 00:21:33

标签: relational-database non-relational-database

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

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

Layman条款更可取。

感谢。

8 个答案:

答案 0 :(得分:42)

嗯,不太确定你的问题是什么。

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

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

除数据本身外,数据库是数据结构的概念。

因此,您可以使用非OO驱动的编译器使用Oriented Object方法进行编程,反之亦然,因此您可以在没有RDBMS的情况下设置关系数据库,也可以使用RDBMS存储非关系数据。 / p>

我将专注于关系数据库(RDB)的含义,并讨论系统对其他人做的事情。

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

非关系型数据库只存储没有显式和结构化机制的数据,以便将来自不同存储桶的数据相互链接。

关于实现这样一个方案,如果你有一个带索引的纸质文件和一个不同的纸质文件,你可以参考索引来获取相关信息,那么你已经实现了一个关系数据库,尽管很简单。 。所以你看到你甚至不需要一台计算机(当然,如果没有人帮忙,它会很快变得乏味),同样你也不需要RDBMS,尽管可以说RDBMS是适合这项工作的工具。也就是说,不同的工具可以做些什么,所以为工作选择合适的工具可能不是那么简单。

我希望这是非常外行的术语,对你的理解很有帮助。

答案 1 :(得分:22)

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

NoSQL的许多形式(例如基于文档,基于图形,基于对象,键值存储等)可能或可能不基于单个基础数学理论。正如S. Lott正确指出的那样,hierarchical数据存储确实具有数学基础。 graph databases可能也是如此。

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

答案 2 :(得分:20)

你“知道”的大多数都是错误的。

首先,正如一些关系大师经常(有时是大踏步地)指出的那样,SQL并不像许多人想象的那样与关系理论非常接近。其次,“NoSQL”内容的大部分差异与它是否是关系性的关系不大。最后,很难说“NoSQL”与SQL有何不同,因为两者代表了各种各样的可能性。

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

请注意,这些事情也保证会以原子方式发生,所以如果有人在你添加这个人时查看数据库,他们要么根本看不到这个人,否则他们会看到人地址(或母亲等)

大多数NoSQL数据库试图在数据库中正确提供这种强制执行。在使用数据库的代码中,您可以强制执行数据所需的任何关系。在大多数情况下,也可以看到只是部分正确的数据,所以即使你有一个家庭树,每个人都应该与父母联系在一起,有时候你施加的任何限制都不会真正强制执行。有些人会让你随意这样做。其他人保证它只会暂时发生,但它能够/将持续多长时间可以提出质疑。

答案 3 :(得分:9)

关系数据库使用正式的谓词系统来处理数据。底层的物理实现没有实质内容,可以根据某些操作进行优化,但必须始终采用relational model。用外行人的话来说,那就是说我确切地知道我的表(关系)中每行(元组)有多少值(属性),现在我想要相应地利用这个事实,彻底而且极端。那是野兽的真正的性质。

由于我们显然已经进行了关系式教育,所以如果从关系模型的角度来看NoSQL数据库模型,再次以外行人的话来说,第一个明显的区别是没有关于值的数量的假设可以包含一行。这实际上过于简单化,并没有干净地应用于每个NoSQL数据库的物理模型的复杂性,但它是关系模型的顶峰和我们必须留下的第一个假设,或者,如果你更愿意,最大的我们必须做出飞跃。

我们可以同意两个对每个DBMS都适用的事情:它可以存储任何类型的数据,并且具有足够的数学基础,可以以任何可想象的方式管理数据。实际情况是,你永远不会想要将两点中的任何一点都用于测试,而只是坚持实际的DBMS实际制作的内容。通俗地说:尊重内在的野兽!

(请注意,我已经避免将围绕关系模型的(显然)基础良好的标准与NoSQL数据库提供的许​​多风格进行比较。如果您愿意,可以将NoSQL数据库视为一个总称。任何没有完全承担关系模型的DBMS,除了其他所有东西之外。差异太大了,但这是主要的区别,而且我认为对你理解这两者最有用。)

答案 4 :(得分:5)

尝试在涉及一点技术的级别中解释这个问题

将MongoDB和Traditional 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

答案 5 :(得分:3)

关系和非关系之间的区别正是如此。关系数据库体系结构提供约束对象,例如主键,外键等,允许在一个关系中绑定两个或多个表。这很好,以便我们规范化我们的表,即将数据库表示的内容拆分成许多不同的表,一旦保持数据的完整性。

例如,假设您有一系列包含员工信息的表格。您无法从表中删除记录而不从其他表中删除与此类记录相关的所有记录。这样就可以实现数据完整性。非关系型数据库不提供这种约束结构,允许您实现数据完整性。

除非您未在用于填充数据库的前端应用程序中实施此约束。桌子,你正在实施一个可以与狂野西部相比较的混乱。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

首先让我开始说为什么我们需要一个数据库。

我们需要一个数据库来帮助组织信息,以便我们可以高效地检索存储的数据。

关系数据库管理系统(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)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’})

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

希望这可以解释一切