【问题标题】:Schemaless DBs: Indexing dynamically-typed things by their properties?无模式数据库:通过属性索引动态类型的事物?
【发布时间】:2011-02-24 00:37:41
【问题描述】:

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

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

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

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

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

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

这个问题简化并澄清了a question I asked earlier。也是从另一个角度来看待问题的。

【问题讨论】:

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


【解决方案1】:

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

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

等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多