mar*_*ion 78 non-relational-database relational-database
我知道像MySQL,PostgreSQL和MS SQL Server这样的解决方案是关系数据库系统,NoSQL,MongoDB等是非关系型DBMS.
但是,这两种系统有什么区别?
Layman条款是优选的.
谢谢.
aso*_*ove 43
嗯,不太清楚你的问题是什么.
在标题中,您询问数据库(DB),而在文本正文中,您会询问数据库管理系统(DBMS).两者完全不同,需要不同的答案.
DBMS是一种允许您访问数据库的工具.
除数据本身外,DB是数据结构的概念.
因此,就像您可以使用非OO驱动的编译器使用Oriented Object方法编程一样,反之亦然,因此您可以在没有RDBMS的情况下设置关系数据库,或者使用RDBMS来存储非关系数据.
我将专注于关系数据库(RDB)的含义,并讨论系统对其他人做的事情.
关系数据库(概念)是一种数据结构,允许您链接来自不同"表"或不同类型数据桶的信息.数据桶必须包含所谓的密钥或索引(允许唯一标识存储桶中的任何原子数据块).其他数据桶可以引用该密钥,以便在它们的数据原子和密钥指向的原子之间创建链接.
非关系数据库仅存储数据而没有显式和结构化机制来将来自不同桶的数据链接到彼此.
至于实现这样的方案,如果你有一个带有索引的纸质文件和一个不同的纸质文件,你可以参考索引来获取相关信息,那么你已经实现了一个关系数据库,虽然非常简单.所以你看到你甚至不需要一台计算机(当然,如果没有人帮忙,它会很快变得单调乏味),同样你不需要RDBMS,尽管可以说RDBMS是适合这项工作的工具.也就是说,不同的工具可以做什么变化,因此为工作选择合适的工具可能不是那么简单.
我希望这是非常外行的术语,对你的理解很有帮助.
Jer*_*fin 21
你所知道的大多数都是错的.
首先,正如一些关系大师经常(有时是大踏步地)指出的那样,SQL并不像许多人想象的那样与关系理论非常接近.其次,"NoSQL"内容的大部分差异与它是否是关系的关系不大.最后,很难说"NoSQL"与SQL有何不同,因为两者都代表了各种各样的可能性.
您可以依赖的一个主要区别是,几乎所有支持SQL的东西都支持数据库本身中的触发器之类的东西 - 即您可以将规则设计到数据库中,以确保数据始终在内部一致.例如,您可以进行设置,以便数据库断言某人必须拥有地址.如果您这样做,任何时候添加一个人,它基本上会强迫您将该人与某个地址相关联.您可以添加新地址,也可以将它们与某个现有地址相关联,但无论如何,此人必须拥有地址.同样,如果您删除某个地址,它会强制您删除当前位于该地址的所有人,或将每个人与其他地址相关联.你可以为其他关系做同样的事情,比如说每个人都必须有一个母亲,每个办公室都必须有一个电话号码等.
请注意,这些事情也保证原子发生,如果别人看的数据库,你要添加的人,他们就会要么不看的人所有,否则他们会看到的人用的地址(或母亲等)
大多数NoSQL数据库都不会尝试在数据库中提供这种强制执行.在使用数据库的代码中,您可以强制执行数据所需的任何关系.在大多数情况下,也可以看到只是部分正确的数据,所以即使你有一个家庭树,每个人都应该与父母联系在一起,有时候你所施加的任何限制都不会真正强制执行.有些人会让你随意这样做.其他人保证它只是暂时发生,尽管它可以/将持续多长时间可以提出质疑.
关系数据库使用正式的谓词系统来处理数据.底层的物理实现没有实质内容,可以根据某些操作进行优化,但必须始终采用关系模型.通俗地说,那就是说我确切地知道我的表(关系)中每行(元组)有多少值(属性),现在我想要相应地利用这个事实,彻底而且极端.这就是野兽的真实本质.
既然我们显然已经有了关系式教养的那一代,如果你从关系模型的角度来看NoSQL数据库模型,再次用外行的术语来说,第一个明显的区别是没有关于行的值的数量的假设包含是永远的.这实际上过于简单化,并没有干净地应用于每个NoSQL数据库的物理模型的复杂性,但它是关系模型的顶峰和我们必须留下的第一个假设,或者,如果你更愿意,最大的我们必须做出的飞跃.
我们可以同意两个对每个DBMS都适用的事情:它可以存储任何类型的数据,并且具有足够的数学基础,可以以任何可想象的方式管理数据.实际情况是,你永远不会想要将两点中的任何一点都用于测试,而只是坚持实际的DBMS实际制作的内容.通俗地说:尊重内在的野兽!
(请注意,我已经避免将围绕关系模型的(显然)基础良好的标准与NoSQL数据库提供的许多风格进行比较.如果您愿意,可以将NoSQL数据库视为任何不完全的DBMS的总称.假设关系模型,排除其他一切.差异太大,但这是主要的区别,我认为最有用的是你理解这两者.)
小智 6
尝试在一个涉及一点点技术的水平上解释这个问题
以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"]
}
Run Code Online (Sandbox Code Playgroud)
因此,在我看来,主要区别在于如何存储数据以及它们之间关系的存储级别.
在此示例中,数据是推文和图片.关于它们之间关系存储水平的不同机制也在两者之间的差异中起着重要作用.
我希望这个小例子有助于展示SQL和NoSQL(ACID和BASE)之间的区别.
这是一个关于NoSQL从互联网目标的图片链接: