位置应用网络中的Relational或Mondo Db?

时间:2014-08-25 14:58:27

标签: mongodb jpa geospatial mongodb-java java-ee-7

我正在尝试启动一个项目,用户可以在其中添加位置,每个位置都可以相互关联。它将是一个Web应用程序,我打算使用javaee7 + jpa + wildfly。

基本上,一个位置至少会有一个名称,文本,经度和纬度字段。其他一些实体将链接到此位置。还会有查询,例如,搜索最近的x位置到y。

我以前曾多次遇到过mongodb但是,我总是在系统的另一部分,所以我不确定在这种系统中使用它是否有很大的好处。该应用程序不是商店,因此没有结帐流程,因此没有交易。

如果我决定使用mongodb我正在看: http://hibernate.org/ogm/和 mongo db地理空间查询

我想征求意见。感谢。

3 个答案:

答案 0 :(得分:1)

MongoDB支持您可以在半径范围内询问“最近”的查询 - 非常有用,如果那就是您要查找的内容。

答案 1 :(得分:1)

实际上,PostgreSQL的扩展名PostGIS实现了可以使用SQL查询的空间和地理对象。从其网站中提取的示例如下:

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';

答案 2 :(得分:1)

根据您的描述,我认为MongoDB是一个不错的选择:

您的数据模型非常简单。您甚至可以考虑将其他实体嵌入到位置文档中,通过执行

来减少检索接近特定点的实体所需的查询数量。
db.collection.ensureIndex({fieldHoldingGeoJSON:"2dsphere"})

db.collection.find({
  $near:{
    $geometry:{
      type:"Point",
      coordinates: [latitude, longitude]
    },
    $maxDistance: distanceInMeters
  }
})

请记住,BSON文档的最大大小限制为16MB。因此,如果存在大量相关实体,则可能值得将位置实际嵌入到实体中,从而消除了对专用位置集合的需求,尽管这些仍然可以使用聚合框架按需创建。通过将位置嵌入到实体中,您可以基本无限地缩放,将所有实体的所有属性存储在它们所属的位置(非常 NoSQLish)。

虽然第二种方法强制实现冗余,但我们只讨论几个字节,即使有100M记录,也只有1Gb,磁盘空间便宜。

另请注意,MongoDB具有强大的功能,例如(相对)简单的扩展和非常棒的聚合框架,仅举几例。