ruby-on-rails - 无架构数据库 : Indexing dynamically-typed things by their properties?

标签 ruby-on-rails mongodb database-design nosql

在 RDBMS 中,您可以声明类型(表)和子类型(具有父类(super class)型 FK 的子类型表)。在 Rails 中,这将是类表继承。例如,您可以有 Person 表和一个 Friend 子类型表,其中包含有关此人的更多个人详细信息(例如生日/周年纪念日)。

当您跳入 NoSQL 世界并使用像 MongoDB 这样的文档数据库时,实现子类型要容易得多,因为集合是无模式的。这是创建 CMS 的理想选择。您现在可以动态键入任何内容。事实上,一个事物可以是多类型的,具有其所有类型的属性。也不太棘手。

但这是棘手的部分。你想索引你的动态类型的东西(例如你的“东西”集合)。您想要按 start_date 搜索事件事物。您想按名称搜索人物事物。你想按生日搜索 friend 的东西。当您不动态输入内容时,这些类型中的每一种都会有自己的集合。将事件、人物、 friend 作为动态类型的事物进行索引是很困难的。将事件、人物、 friend 作为类型(表或集合)编制索引并不难。

在我看来,MongoDB(和其他无模式数据库)是为动态类型而生的。至少,在大多数方面。但是当涉及到索引动态类型的东西时,它就不足了。您已经/将如何解决这个问题?

我认为如果 MongoDB 引入 filtered indexes我们会在那儿。 (过滤索引以多键和稀疏索引无法解决的方式解决问题。)唯一需要的另一件事是可能无限数量的索引(因为我们可以让用户创建大量自定义类型)。如果没有无限数量的索引,这将限制此类数据库可以处理的类型数量。

vote in support如果您同意过滤索引可以解决动态类型问题。

这个问题简化并阐明了 a question I asked earlier .它还从不同的角度来解决问题。

最佳答案

从 MongoDB 的观点来看,没有理由不为每个子类型设置单独的索引。 MongoMapper,特别是(我不知道 Mongoid),将向您的集合添加一个代表每个子类型的 _type 键。您可以在索引中使用此 _type 键以获得各种过滤器。

db.people.ensureIndex({_type:1,birthdate:1})

等等。

关于ruby-on-rails - 无架构数据库 : Indexing dynamically-typed things by their properties?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5099106/

相关文章:

Ubuntu 16.04 Xenial 中的 PHP5.6-dev

mongodb - 将 mongodb 集合导出到 csv

mongodb - 在 mongodb 中查找包含给定子字段的所有记录

sql - 使用大量不同的需要知道的信息来建模产品并将它们链接到订单项?

mysql - 客户和业务数据库关系

php - MySQL数据库黑名单表设计

ruby-on-rails - 使用回形针和 simple_form 将文件上传到 rails 4.0

mysql - 为什么数据库配置不起作用?

ruby-on-rails - Ruby - 从不同的服务器复制图像

ruby-on-rails - Ruby Mechanize 屏幕抓取帮助