在 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/