我们正在考虑将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
}
你们推荐哪个系统?非常感谢。
答案 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中更快并且缓存。