Nosql 水平缩放完全由列表组成的对象(行、文档)

Nosql 水平缩放完全由列表组成的对象(行、文档),nosql,sharding,listfield,horizontal-scaling,Nosql,Sharding,Listfield,Horizontal Scaling,有些数据如下所示: widget: { categories: ['hair', 'nails', 'dress'] colors: ['red', 'white'] } SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red' 需要按如下方式查询数据: widget: { categories: ['hair', 'nails', 'dress'] colors

有些数据如下所示:

widget:
{
    categories: ['hair', 'nails', 'dress']
    colors:     ['red', 'white']
}
SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red'
需要按如下方式查询数据:

widget:
{
    categories: ['hair', 'nails', 'dress']
    colors:     ['red', 'white']
}
SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red'
在这种情况下,相等运算符
categories==“hair”
实际上是在说
,其中“hair”至少等于列表中的一个值。使用一种我认为被称为“之字形合并联接”的算法,这个操作可以像传统的相等操作一样完成

我们正在处理的数据集包含了几千万个这样的对象。上面提供的查询需要每秒对数据库执行大约50次。对于这个数据库,每秒大约有50次插入。由于这一要求,必须在多台机器上水平扩展数据库,以使读写操作不必影响集群中的所有机器。我认为最好的方法是使用
切分

据我所知,只要一个查询不包含针对多个字段的非相等运算符,它所查询的数据就可以在多台机器上进行索引和分片。(这是GAE大桌子的规则)

我的印象是MongoDB将是这个用例的一个很好的候选者,但是我最近意识到MongoDB切分功能的一个警告:列表字段不能用作切分键。因此,如果我想为此使用MongoDB,我必须在连接到MongoDB的应用程序的数据层编写一个hack。这是我之前发布的关于使用MongoDB存储和查询此用例的问题:

我以前使用GAE的大表实现了这些需求,据我所知,大表是一个大规模分片的数据库。然而,由于GAE访问大表的成本很高(100万读写操作大约1美元?),我们已经将基础设施转移到云服务器上(我们现在使用的是Rackspace云服务器,如果您不熟悉,它们与Amazon EC2类似)

我的问题是: 我们应该为此使用什么数据库?


我知道还有其他NoSQL数据库声称能够像CouchDB和Cassandra那样水平扩展。我还以为MongoDB就是其中之一。我们花了几个星期的时间将大量数据移植到MongoDB,然后发现它不支持我们的一个主要用例,这让我觉得有点不称职。希望不再犯此错误。

对于任何非关系(NoSQL),必须将数据结构与数据库类型匹配,否则将破坏您的项目

MongoDB非常棒,但它最擅长在“文档”中而不是跨集合查询半结构化数据。换句话说,DocumentDB是关于避免联接的查询,使用MongoDB可以进行非惯用查询,但它们不会扩展。。。。正如你所经历的那样。再说一遍,我喜欢MongoDB,但我认为它不适合您的用例

在你的情况下,, 尤其是因为您说过BigTable非常适合您的查询类型/数据结构。我建议您调查一些面向列的数据库。卡桑德拉肯定值得一看