【问题标题】:Using DynamoDB with MySQL For GeoSpatial Queries使用 DynamoDB 和 MySQL 进行地理空间查询
【发布时间】:2017-01-18 04:52:44
【问题描述】:

所以目前我有一个应用程序,我在其中存储位置数据(lat、lng)以及其他字段,而谁没有。所以我喜欢 mysql 或 sql 的原因是我可以轻松获得地理空间查询。例如选择落在给定半径和中心点内的所有行。

我喜欢 dynamodb 的地方在于,它在 AWS 上几乎可以无限扩展,这是我将要使用的服务,而且速度很快。我很想将我所有的数据转移到 dynamodb 甚至在那里插入新数据但是我无法使用那些地理空间查询,这是我的应用程序中最重要的部分。这是必需的。

我知道 dynamodb 的地理库,但它是用 java 编写的,而我的后端是用 php 编写的,所以这是不行的,而且他们似乎没有更新或维护该库。

我想到的一个解决方案是只将坐标存储在 mysql 中,并将相应的 id 与其他数据(包括 lat 和 long 值)一起存储在 dynamodb 中。

有了这个,我可以实现我想要的地理空间查询功能,同时能够很好地扩展亚马逊上的所有内容,特别是因为那是我正在使用的主机。

所以基本上我会从 mysql 查询给定半径内的所有 POI,并使用所有 id 从 dynamodb 获取所有结果。听起来很疯狂还是什么?

但这样做的潜在缺点是必须先查询一个数据源,然后在使用第一个查询的结果后立即查询另一个数据源。也许我想多了,低估了这些技术的发展速度。

所以总结一下我的要求:

必须在 AWS 上

必须能够执行地理空间查询

必须能够在 PHP 中连接到 dynamodb 和 MySQL

任何帮助或建议将不胜感激。

【问题讨论】:

    标签: php mysql amazon-web-services amazon-dynamodb geospatial


    【解决方案1】:

    我的直觉告诉我,不要使用 2 个数据源,只有当你有一个非常具体的案例时。

    你有多少数据? MySQL(或 Aurora)真的无法处理吗?如果您的应用程序读取繁重,它可以轻松地使用只读副本进行扩展。

    我有一些想法可以让你至少更接近一点:

    1. 为什么不在 php 中实现自己的地理库? :D
    2. 您可以在 DB 中进行虚拟搜索,其中您不按实际距离进行过滤,而是在 lat 中使用上下边界。并且很长。 (所以您不是在一个圆圈中搜索,而是在一个正方形中搜索。然后,如果您的应用程序可以使用它,或者它会过滤结果,那么这取决于您,但这将是一个小得多的数据集和一个简单的过滤器。

    【讨论】:

    • 嘿亚当,数据还没有,在应用程序中,这是一个移动应用程序,每次打开应用程序时,我们都可以期待上传用户数据和坐标。我们几乎可以保证我们将读取给定半径内的数据点。整个应用程序都基于该流程。我实际上想过做一个 php 库,地狱甚至是 swift 版本。但代码在我头上。而且我真的不喜欢使用虚拟搜索的想法。几乎所有其他数据都将在 dynamodb 中。这是一个棘手的问题:(而且我真的想要那种便宜的规模。
    • 极光...好点。它最初并不支持它们,但最近确实宣布了support for spatial indexes,尽管奇怪的是,他们在 B-tree 索引中使用空间填充曲线而不是像 MySQL 那样使用 R-tree,但空间函数是相同的。我还没有评估性能。
    • @AndrewEdwards 给定半径内的所有点都是(x-r,y-r), (x-r,y+r), (x+r,y+r), (x+r,y-r) 的最小边界矩形内的点的易于计算的子集。
    • 是的,我通常不会介意极光。我绑了一次,但在开发阶段它非常昂贵。 dybamodb 非常便宜并且可以扩展。如果我能做地理查询就完美了。
    【解决方案2】:

    也许 CloudSearch 可以帮助您。它提供对经纬度字段的地理空间查询。它与 DynamoDB 一起工作得很好,它有一个 PHP SDK(虽然从未尝试过,我使用的是 nodejs)

    您将具有 lat、long 字段的项目写入 DynamoDB。每个项目(或项目更新/删除)都会通过 DynamoDB 流自动上传到 CloudSearch。因此,现在您在 CloudSearch 中拥有 DynamoDB 项目的“自动副本”,并且您可以使用 CloudSearch 的所有查询功能,包括地理查询(一个限制,它只能在框中查询,而不是在圆圈中查询,因此您需要一些额外的数学运算)

    您需要创建一个触发 Lambda 函数的 DynamoDB 流,该函数将每个项目上传到 CloudSearch。您设置一次,它就会“永远”发挥它的魔力。

    仅当您接受在 DynamoDB 中写入与 CloudSearch 中可用之间存在小的延迟时,此方法才有效。

    使用这种方法,您仍然有 2 个数据源,但它们与您的应用程序的视角完全分离。一个数据源用于查询,另一个用于写入。在 AWS 云中自动为您保持同步。您的应用程序写入 DynamoDB,并从 CloudSearch 进行查询。您还拥有这些 AWS 服务提供的可扩展性优势。

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多