我正在研究一个可以用两个键值表表示的IR问题。
表Q:具有在插入时确定的固定大小,更新表增量计数器,大小可以随着数据在协议缓冲区中编码而移位,并且随着数值变高,它们可能会增加字节大小(变量int编码) )。
表P:包含对表Q的引用,它是一对多的关系,因为一个p可以指向许多q。更新会增加计数器并添加引用。很多碎片。
表Q和P与反向索引的标准IR全文搜索结构的数据访问特性完全相同。 Q是文件,P是文字 - 帖子。
我尝试了以下嵌入式数据库。
这是我想要优化的情况:
是的,如果需要,我可以将数据模型折叠成面向文档的结构。由于没有交易,这对mongodb来说是必须的。
这家伙似乎知道他是什么talking about,而且因为他给了mongodb三星级的插页表演,我很受诱惑。尽管Json对我来说似乎很浪费。我也可以切换到SQL服务器,因为它在插入负载下是惊人的,但它不会扩展到重铁之外。 所以,对于我的情景来说,mongodb是蜜蜂的膝盖吗,任何人都尝试过度肥大与mongodb?其他建议?
编辑:自我回答
前提:
因此,在迁移到面向文档的数据库或分布式键值数据库之前,通常会修复应用程序的数据模型,以便更好地映射到此类数据模型上。分布式数据库没有事务,mongo甚至可以用于单个文档的原子更新 - 因此,要在事务范围内使用更新,Q必须是您的文档,而P将在Q中索引变量元素。 / p>
因此,要切换到我的数据模型的不同表示。我将确保两个表的生命周期都是静态大小的(使用协议缓冲区fixed32而不是int32),而且我将对表P进行unpivot(un-invert),并为此将大部分P合并为Q.
这将解决碎片问题并减少事务范围,插入P可以在事务之外完成。我也会在愤怒中尝试leveldb。我有一种感觉,它会在整个处理过程中保持它的性能水平,从不隐瞒它不会并行化的事实。