我知道 MySQL、PostgreSQL 和 MS SQL Server 等解决方案是关系型数据库系统,而 NoSQL、MongoDB 等是非关系型 DBMS。
但是,这两种类型的系统有什么区别?
外行术语更可取。
谢谢。
我知道 MySQL、PostgreSQL 和 MS SQL Server 等解决方案是关系型数据库系统,而 NoSQL、MongoDB 等是非关系型 DBMS。
但是,这两种类型的系统有什么区别?
外行术语更可取。
谢谢。
嗯,不太清楚你的问题是什么。
在标题中您询问数据库(DB),而在正文中您询问数据库管理系统(DBMS)。两者完全不同,需要不同的答案。
DBMS 是一种允许您访问数据库的工具。
除了数据本身,数据库是数据结构的概念。
因此,就像您可以使用非面向对象驱动的编译器使用面向对象方法进行编程一样,反之亦然,您也可以在没有 RDBMS 的情况下设置关系数据库或使用 RDBMS 来存储非关系数据。
我将专注于关系数据库 (RDB) 的含义,并留下关于系统对其他人做什么的讨论。
关系数据库(概念)是一种数据结构,允许您链接来自不同“表”或不同类型数据桶的信息。数据桶必须包含所谓的键或索引(允许唯一标识桶内的任何原子数据块)。其他数据桶可以引用该键,以便在它们的数据原子和键指向的原子之间创建链接。
非关系型数据库只存储数据,没有明确和结构化的机制来将来自不同存储桶的数据相互链接。
至于实现这样的方案,如果您有一个带有索引的纸质文件,并且在不同的纸质文件中您可以参考索引以获取相关信息,那么您已经实现了一个关系数据库,尽管它非常简单。因此,您会发现您甚至不需要计算机(当然,如果没有人帮忙,它会很快变得乏味),同样您也不需要 RDBMS,尽管可以说 RDBMS 是完成这项工作的正确工具。也就是说,不同工具的功能存在差异,因此为工作选择正确的工具可能并不那么简单。
我希望这是足够的外行术语,有助于您的理解。
您“知道”的大部分内容都是错误的。
首先,正如一些关系专家经常(有时甚至尖锐地)指出的那样,SQL 并不像许多人想象的那样与关系理论密切相关。其次,“NoSQL”东西的大多数差异与它是否是关系的关系不大。最后,很难说“NoSQL”与 SQL 有何不同,因为两者都代表了相当广泛的可能性。
您可以指望的一个主要区别是,几乎所有支持 SQL 的东西都支持数据库本身中的触发器之类的东西——也就是说,您可以将规则设计到适当的数据库中,以确保数据始终在内部保持一致。例如,您可以进行设置,以便您的数据库断言一个人必须有地址。如果你这样做,无论何时添加一个人,它基本上都会迫使你将该人与某个地址相关联。您可以添加一个新地址,或者您可以将它们与某个现有地址相关联,但无论如何,该人必须有一个地址。同样,如果您删除一个地址,它将强制您删除当前在该地址的所有人员,或者将每个人与其他地址相关联。你可以对其他关系做同样的事情,比如说每个人都必须有一个母亲,每个办公室都必须有一个电话号码等。
请注意,这些事情也保证会自动发生,因此如果其他人在您添加人员时查看数据库,他们将根本看不到此人,否则他们会看到带有地址(或母亲等)
大多数 NoSQL 数据库并没有尝试在数据库中提供这种强制执行。在使用数据库的代码中,您可以强制执行数据所需的任何关系。在大多数情况下,也可能会看到仅部分正确的数据,因此即使您有一个家谱,其中每个人都应该与父母相关联,有时您施加的任何限制都不会真的是强制执行。有些人会让你随意这样做。其他人则保证它只是暂时发生,尽管它究竟能/将持续多长时间仍有待商榷。
关系数据库使用正式的谓词系统来处理数据。底层物理实现没有实质内容,可以针对某些操作进行优化,但它必须始终假设关系模型。用外行的话来说,这只是说我确切地知道我的表(关系)中的每一行(元组)有多少值(属性),现在我想相应地、彻底地、极端地利用这个事实。这就是野兽的本性。
由于我们显然是受过关系教育的一代,如果你从关系模型的角度来看 NoSQL 数据库模型,同样用外行的话来说,第一个明显的区别是,没有关于一行值数量的假设可以包含曾经被制造。这确实过于简单化了问题,并且不能完全适用于每个 NoSQL 数据库的物理模型的复杂性,但它是关系模型的顶峰,也是我们必须抛弃的第一个假设,或者,如果你愿意,最大的假设我们必须做出的飞跃。
我们可以同意对每个 DBMS 都适用的两件事:它可以存储任何类型的数据,并且具有足够的数学基础,可以以任何可以想象的方式管理数据。现实情况是,您永远不想犯将这两点中的任何一个进行测试的错误,而只是坚持实际 DBMS 的真正用途。通俗地说:尊重内心的野兽!
(请注意,我避免将围绕关系模型的(显然)有根据的标准与 NoSQL 数据库提供的多种风格进行比较。如果您愿意,可以将 NoSQL 数据库视为任何不完全的 DBMS 的总称假设关系模型,排除其他一切。差异太多,但这是主要差异,我认为对您理解两者最有用的差异。)
试着用一点技术的层面来解释这个问题
拿 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)之间的区别。
这是来自 Internet 的关于 NoSQL 目标的图片链接:
关系和非关系之间的区别正是如此。关系数据库架构提供了约束对象,例如主键、外键等,允许将两个或多个表绑定在一个关系中。这很好,以便我们规范化我们的表,也就是说,将有关数据库表示的信息拆分到许多不同的表中,一次可以保持数据的完整性。
例如,假设您有一系列表格,其中包含有关员工的信息。如果不从其他表中删除与该记录相关的所有记录,则无法从表中删除记录。通过这种方式,您可以实现数据完整性。非关系数据库不提供允许您实现数据完整性的约束构造。
除非您没有在用于填充数据库表的前端应用程序中实现此约束,否则您正在实现可以与狂野西部相提并论的混乱。
首先让我先说为什么我们需要一个数据库。
我们需要一个数据库来帮助组织信息,以便我们可以有效地检索存储的数据。
关系数据库管理系统(SQL)的例子:
1)甲骨文数据库
2)SQLite
3)PostgreSQL
4)MySQL
5)微软SQL服务器
6)IBM DB2
非关系型数据库管理系统(NoSQL)示例
1)MongoDB
2)卡桑德拉
3)Redis
4)沙发底座
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 的数据库,有一个名为 users 的集合,还有一个名为 insertOne 的文档,我们向其中添加数据,并且没有固定的模式,因为我们的第一条记录有 3 个属性,第二个属性只有 2 个属性,这在非关系数据库中是没有问题的,但是在关系数据库中这是做不到的,因为关系数据库有一个固定的模式。
让我们看另一个不同的例子
({Studname: ‘Ash’, Subname: ‘Mathematics’, LecturerName: ‘Mr. Oak’})
因此我们可以看到,在非关系数据库中,我们可以将学生详细信息和学科详细信息输入到一个文档中,因为在非关系数据库中没有定义任何关系,但是这种方式会导致数据重复,因此可能会出现更新错误。
希望这能解释一切
用外行的话来说,它是强结构化与非结构化的,这意味着您对数据库具有不同程度的适应性。索引中会出现差异,特别是当您需要确保某个参考索引可以链接到另一个项目时 -> 这是一个关系。关系型数据库更严格的结构就是源于这个要求。
请注意,NosDB 显然提供了关系和非关系数据库以及查询http://www.alachisoft.com/nosdb/sql-cheat-sheet.html的方法