无架构数据库:通过属性为动态类型的东西编制索引?

时间:2011-02-24 00:37:42

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

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

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

但这是棘手的部分。您想要为动态类型的事物编制索引(例如,您的“事物”集合)。您想通过start_date搜索事件。您想按名称搜索人物。你想通过birthdate搜索朋友的东西。如果您没有动态输入内容,则每种类型都有自己的集合。索引事件,人物,朋友作为动态类型的东西很难。索引事件,人物,朋友作为类型(表格或集合)并不那么难。

在我看来,MongoDB(和其他无模式数据库)是为动态类型而制作的。至少在大多数方面。但是,当涉及索引动态类型的东西时,它就会失败。你将如何处理这个问题?

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

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

此问题简化并澄清了a question I asked earlier。它也从不同的角度来解决问题。

1 个答案:

答案 0 :(得分:1)

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

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

等等。