【问题标题】:MongoDB is non-relational, but Mongo Gem is relationalMongoDB 是非关系型的,但 Mongo Gem 是关系型的
【发布时间】:2015-05-06 10:25:11
【问题描述】:

所以问一个简单的问题。我想对自己澄清一下:

根据文档,MongoDB 是一个非关系型数据库。但是 mongo 的 gem 可以使模型具有关系。

那么问题是它允许以标准 AR 方式查询数据库的 gem 实现吗?

欢迎任何解释。

【问题讨论】:

  • mongo gem 是否有可能是指 mongoid gem?
  • 你在说哪个 gem,它是如何“使模型关联”的,“允许以标准 AR 方式查询数据库”是什么意思?我怀疑这个 gem 可以让你进行连接,但是使用 MongoDB 实现 where 并不困难。
  • 非关系意味着没有连接。但是 mongo 允许存储对其他文档的引用(id),因此 mongo gems(例如 mongoid)允许查询这些引用并获取它们的数据,但这并不意味着它是关系的

标签: ruby-on-rails ruby mongodb


【解决方案1】:

让我们明确一点。 MongoDB 不会以任何方式在内部进行连接。不能这样做,因为它违反了一般设计的原则。至少目前是这样。因此,当我们谈论“关系”数据库时,它们会在服务器上进行内部连接。

您的特定库(无论是什么)或称为 ODM(对象文档映射器)正在做的事情是 模拟“客户端”(您正在运行的代码)端的连接,但这不是实际的连接。

所以这可以让你做一些事情,比如:

  1. 获取一个项目,然后获取其他集合中存在的所有相关项目。

  2. 使实际上是“嵌入式”文档(在 MongoDB 术语中)看起来就像另一个外部关系,就像它与关系数据存储一样。

因此,在 1 的情况下,您的客户端代码中实际发生的情况是,在检索“主”文档时,将按顺序向数据库发出一个(或多个)附加请求获取相关文档。这通常作为具有相关关键信息(所有子级或父级)的一个或其他文档集合来完成,以便可以引用结果。

然后,明显的“加入”实际上发生在客户端,而不是在服务器上。

这里的限制是您通常被限制为无法根据子项中的内容“过滤”父文档结果。这可能因实现而异,但任何存储对其所有子代的引用的父代都具有该限制,例如。

另一方面,与 2 的情况一样,由于文档实际上是相互“嵌入”的,因此只有 一个 向数据库发出请求为了检索文档及其所有“相关”条目。这实际上是使用 MongoDB 进行存储的主要设计点和优势之一,这种情况适合您的需求。

在这种情况下,数据已经“预连接”,因此无需执行任何“连接”,所有读取和写入都可以以原子方式完成。


无论如何,这应该作为基本差异的入门。解释为什么“非关系”和其他 NoSQL 存储存在于替代关系 SQL 存储之上的各个方面,这远远超出了这里要回答的主题。网上有大量的阅读资料。

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 2010-09-08
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多