面向键值的数据库与面向文档的数据库



我最近开始学习NO SQL数据库,我遇到了面向键值的数据库和面向文档的数据库。既然它们有相似的结构,它们的保存和检索方式不是完全一样吗?如果是这样的话,为什么我们要将它们定义为单独的类型?否则,它们是如何保存在文件系统中的?

要开始,最好指出错误最少的词汇表。过去被称为nosql的范围太广了,并且在被称为nosql的两个数据库之间通常没有交叉特征,除了它们以某种方式处理";数据";。什么程序不处理数据?!本着同样的精神,我避免使用关系数据库管理系统(RDBMS)这个术语。大多数演讲者和听众都清楚,RDBMS是SQL Server、某种Oracle数据库、MySQL、PostgreSQL中的一种。这是否包括已经是一个指标的SQLite,";关系数据库";并不是一个完美的词来描述它背后的概念。更重要的是,人们通常称之为nosql的东西从不禁止关系。即使在";关键字值";商店,一个人可以建立关系。在资源描述框架数据库中,SQL行的等价物被称为元组、三元组、四元组,以及更普遍、更简单的关系。关系数据库的另一个例子是由datalog驱动的数据库。因此,RDBMS和关系数据库不是一个用来描述预期概念的好词,当某人使用它时,它只谈论他们对数据(库)世界中存在的各种范式的狭隘看法。

在我看来,谈论";SQL数据库";其描述了支持ISO标准所定义的SQL编程语言的子集或超集的数据库。

然后,NoSQL的措辞是有意义的:数据库不支持SQL编程语言。特别是,排除了Cassandra和Neo4J,它们可以用一种语言(分别是CQL和Cypher/GQL)编程,这种语言的表面语法看起来像SQL,但没有SQL的语义(既不是SQL的超集,也不是SQL的子集)。仍然是Google BigQuery,感觉很像SQL,但我对它不够熟悉,无法划清界限。

键值存储也是模糊的。memcached、REDIS、foundationdb、wiredtiger、dbm、东京内阁等。al彼此非常不同,并且用于不同的用例。

抱歉,面向文档的数据库不够精确。历史上,它们是两个主要的数据库,即所谓的文档数据库:ElasticSearch和MongoDB。而另一次,这些都是非常不同的软件,如果使用得当,并不能解决同样的问题。

你可能已经猜到了,你的问题显示出缺乏工作,正如我所说,即使我不想在与数据库相关的词汇方面剃光头,也太宽泛了

由于它们具有相似的结构,

否。

它们不是以完全相同的方式保存和检索的吗?

否。

如果是这样的话,我们为什么要将它们定义为单独的类型?

它们的编程接口、部署策略和内部结构以及预期用例都大不相同。

否则,它们是如何保存在文件系统中的?

这个问题太宽泛了,你需要问一个特定的问题——至少解释你对一个或多个数据库如何工作的理解,并问一个关于你想去哪里/你想理解什么的问题"如何从A点理解(给定),到B点理解(问题)";。在你的问题中,A点不存在,B点模糊或过于宽泛。

Moar:

  • 首先,确保您对SQL数据库有扎实的理解,至少对SQL语言有扎实的了解(然后深入研究索引,最后进行微调)。没有SQL知识,你在就业市场上毫无价值。如果您已经很好地掌握了SQL,我的建议是放弃除FoundationDB之外的所有其他内容。

  • 如果你仍然想要";基准;数据库,首先设置一个情况(真实的或想象的),即您熟悉的项目,需要一个数据库。试着安装几个数据库来解决那个项目的问题。

最后,如果你有一个精确的项目,在database-design上提出另一个问题之前,试着回答以下问题:

  • 你需要什么保证。质疑ACID的所有特性:原子性、一致性、隔离性、耐久性。查看BASE。你不一定需要ACID或BASE,但它是一个很好的基础,有很好的文档记录,可以知道你想去哪里/需要去哪里。

  • 数据的大小是多少?

  • 数据的形状是什么?它们是定义明确的类型吗?它们是多态类型(异质形状)吗?

  • 工作量:先写一次,然后只读,主要是读,主要是写,两者兼而有之。还要回答写或读的速度有多快或有多慢的问题。

  • 查询:查询的外观:递归/深层、列或行,或邻居查询(如没有递归查询的graphql和SQL)。同样,预期的回应时间是多少。

在致力于特定解决方案之前,至少不要放弃审查部署和扩展策略。

就我而言,我选择了foundationdb,因为它在这些方面是最通用的,即使目前它需要一些代码来代替所有postgresql功能。

最新更新