任何数据库最重要的功能之一是查询速度。我们存储数据并希望快速访问符合我们标准的数据。然而,最近,无模式数据库变得流行。如果我们有一个无架构的数据库但实际上有一个推断的(在头部/在应用程序中)架构,这是一回事;它刚刚没有被数据库正式声明。
另一方面,假设我们确实需要一个开放式数据库,其中有几个用户拥有自己的模式来处理各自的问题区域。用户将定义他自己的“域”。该域(RDBMS服务器上的数据库)将具有其类型(RDBMS中的表),并且这些类型将具有其自身的特性(RDBMS中的列)。如何创建复合索引以从给定域中提取特定对象/文档/记录(您有什么用途)?我的查询应该选择一个或多个域(一个IN子句),只针对某些列选择一个主题类型(例如CalendarEvent)(start_date> =今天,start_date< =今天+ 1周,open_for_registration = true,calendar_name ='上市')。在具有固定模式的数据库中(即使未声明也隐含),这很简单:您可以针对列创建复合索引。
复杂性在于我们基本上只创建了一个实例,即MongoDB就像一个RDBMS服务器,它有许多数据库,每个数据库及其相关模式都是我们的“域”。
在将这个问题破坏了一个星期并查看各种数据库(MongoDB,Neo4j,MySQL,PostgreSQL)后,我发现了一些可能的解决方案:
其他想法?其他类型的数据库可能更好地处理这个问题?
同样,这个想法是这样的:不同的用户管理他们自己的域。域内可以是任何“类型”的项目。对于每个打字的项目,我们都有属性。我希望允许用户针对其域运行查询,以获取具有与其条件匹配的属性的类型的项。 (因此复合指数)
最后一个想法。域名本身并不是非常有意义的。它可能有10-20“类型”。在每种类型中,它们可能多达5000条记录(在大多数情况下),在极端情况下可以说20000条记录。
不幸的是,尽管Joel Spolsky's advice我尝试过宇航员架构,但这是其中一种情况。
答案 0 :(得分:1)
可能更好地处理此问题的其他类型的数据库?
你考虑过Excel吗?也许只是索引平面文件:)
看,你在这里遇到的基本问题是没有银弹。你的想法很好,但在某些时候你必须接受一些权衡。
您无法索引所有内容。在某些时候,您将不得不识别“常用”查询并为这些事物构建一些索引。除非你计划将所有内容保存在内存中,否则你最终会在某些时候创建索引。
在每种类型中,它们可能多达5000条记录(在大多数情况下),在极端情况下可以说20000条记录。
嘿,这是一个真正的限制。你可以在5k记录中投入多少硬件? 200k记录怎么样?是否足以将其全部保存在RAM中?把它的一部分放在RAM里?只保留RAM中的索引?
如果你想让用户只使用他们自己的“动态”模式,我个人觉得 MongoDB 很自然。特别是对于您指示的这些小数据集。
但它无论如何都不是银弹。这些解决方案中的每一个都有各自的问题。如果有一个实际的数据库可以处理你提出的所有要求,让我们面对它,我们都将使用该数据库:)