我正在尝试确定众多数据库模型中的哪一个最能支持概率记录比较。具体来说,我有大约 2000 万个由各种属性(名称、类型、作者、所有者等)定义的文档。文本属性在数据集中占主导地位,但仍有大量图像。读取操作是最关键的相对性能,但我预计每周插入大约 20,000 个新文档。幸运的是,插入速度根本不重要,我很乐意将传入的文档排队以进行受控处理。
数据库查询通常采用以下形式:
Find documents containing at least five sentences that reference someone who'a a member of the military
Predict whether User A will comment on a specific document written by User B, given User A's entire comment history
Predict an author for Document X by comparing vocabulary, word ordering, sentence structure, and concept flow
我的第一个想法是使用像MongoDB这样的简单文档存储,因为每个文档不一定包含相同的数据。但是,复杂的查询有效地将其降级为文件系统包装器,因为我无法构建产生我想要的结果的查询。因此,这种方法使我不得不遍历整个数据库并分别处理每个文件。尽管文档存储可以很好地横向扩展,但这里的好处并没有体现出来。
这让我意识到我的粒度不在文档级别,而是在实体关系级别。因此,图数据库似乎是合乎逻辑的选择,因为它们有助于将句子中的每个单词与下一个单词、下一段、当前段落、词性等联系起来。图数据库限制了数据复制,提高了统计聚类的速度,并且除其他外,横向扩展。不幸的是,确保您的查询得到明确的答案仍然需要遍历整个图表。即便如此,索引将有助于提高性能。
我还评估了关系数据库的使用,如果设计得当(即通过避免不必要的规范化),它们会非常有效。关系数据库擅长查找用户 A 创作的所有文档,但无法进行结构比较(这涉及昂贵的连接)。关系数据库还有效地强制执行约束(主键、外键、唯一性等)——这是一些 NoSQL 解决方案难以完成的任务。
考虑到上面列出的要求,有没有数据库模型结合了关系模型的“精确性”(即,域的有效耗尽)和图数据库的灵活性?