Cassandra或MongoDB我们基于位置的应用程序

时间:2010-08-20 03:20:10

标签: mongodb cassandra

我们正在考虑将NoSQL数据库系统用于大型项目。目前,我们已经阅读了一些关于MongoDB和Cassandra的内容,尽管我们对这两者都没有任何经验。我们非常精通传统的关系数据库,如MySQL和Microsoft SQL,但NoSQL(键/值存储)对我们来说是一个新的范例。

基本上,你们推荐哪些NoSQL数据库供我们使用?

我们做重写和读。基本上我们有成千上万的设备报告:

device_id(int),纬度(十进制),经度(十进制),日期/时间(日期时间),标题字符(2),速度(整数)

每一分钟。因此,在高峰时段,我们需要能够每秒处理数百次写入。

然后,我们还有用户,它们以形式查询此信息,在最后一天或上周向我提供来自device_id 1234的所有消息。此外,用户还可以进行其他查询,向我提供来自device_1234的所有消息,其中速度大于50且日期为今天。

所以,我们最初的想法是MongoDB或Cassandra将允许我们使用传统数据库更容易扩展。

我们的MongoDB或Cassandra中的文档或值可能如下所示:

{
   device_id: 1234,
   location: [-118.12719739973545, 33.859012351859946],
   datetime: 1282274060,
   heading: "N",
   speed: 34
}

你们推荐哪个系统?非常感谢。

5 个答案:

答案 0 :(得分:15)

MongoDB内置了对地理空间索引的支持:http://www.mongodb.org/display/DOCS/Geospatial+Indexing

例如,找到距离该位置最近的10台设备

db.devices.find({location: {$near: [-118.12719739973545, 33.859012351859946]}}).limit(10)

答案 1 :(得分:1)

我使用MongoDB发布了基于位置的应用,就像您描述的那样。 MongoDB具有强大的查询和索引支持,可能会为您提供更好的选择。就像Cassandra一样,MongoDB具有分区和复制功能,用于扩展读写。他们的基础架构非常不同。

虽然您没有提到任何基于位置的查询,但如果您对“给我位置l的半径r内以及时间t1和t2之间的所有设备”这样的查询感兴趣,您会发现MongoDB的地理空间查询和索引非常是有用的。

答案 2 :(得分:0)

我已经完成了mongodb和地理空间数据的一些工作,但没有按照上面提到的规模进行。地理空间搜索速度非常快,远远超过mysql。

我建议查看mongodb的分片,复制和群集功能来处理写入量。对设备标识符进行分片可能是处理写入卷的好方法。如果你对事件的接近感兴趣,那么在lat / lng之间进行分片可能更合适。

插孔

答案 3 :(得分:0)

使用mongodb进行地理位置搜索。版本2.4改进了核心地理功能。很多大型网站都将其用于地理定位搜索。

答案 4 :(得分:0)

您可以考虑使用ElasticSearch。 ES保存原始文档的JSON以及所有索引字段。 JSON可以实例化为任何现代语言变量/参数。在Java中,甚至可以禁用它,并将本机Java持久性数据存储在字段中。搜索检索后,只需循环并实例化原始对象类型的集合。

使用Elastics Search为高速数字范围索引提供Trie索引,显然您可以在AND或OR过滤中获得每种风格和地理边界框查询的全文搜索。日期搜索也是原生的(尽管Java的日期处理很糟糕,所以我切换到时间戳的BIG INT表示来表示日期)

UNLIKE过去和现在的NoSQL解决方案,地理索引和查询是任何查询的一部分,不需要额外的步骤。 I.E.,最近一个MongoDB解决方案需要地理空间搜索来收集符合标准的文档ID,然后您在另一个查询中使用这些ID并在这些ID中搜索其他标准。实际上,这就是所有解决方案中发生的事情,但它在ElasticSearch中更快并且缓存。