如何高效地根据位置/接近用户的位置检查数据库对象?

9
我正在构建一个应用程序(在XCode中),它通常向用户显示信息。这些信息存储为数据库中的单个对象(恰好是由Heroku托管的Parse服务器)。用户可以选择“查看”距离其当前位置一定范围内创建的信息。(当将信息保存到数据库时,会根据用户发起保存时的位置保存其纬度和经度)。我知道可以通过比较这些信息的纬度和经度与查看用户的当前纬度和经度来过滤信息,并仅显示足够接近的信息。大致/一般而言:
var currentUserLat = latitude //latitude of user's current location
var infoSet = [Objects] //set of all pulled info from DB
for info in infoSet{
    if info.lat-currentUserLat < 3{//arbitrary value
       //display the info
    }else{
       //don't display
    }
}

这个设置还不错,并且它可以正常工作。然而,它之所以能够正常工作,是因为当前数据库中的条目数量很少(该应用程序正在开发中)。在实际使用中(即有许多用户),数据库可能会充满信息对象(假设有一千个)。在我看来,为了逐个获取和比较每个数据库条目的纬度并将其与当前用户的纬度进行比较,这将花费太长时间。我知道必须有一种及时的方法来完成这项任务(想想tinder...他们只显示附近位置的人的个人资料,尽管有数百万个个人资料,但他们做到了这一点,而且速度很快),但我不知道什么是最有效的方法。我考虑过在数据库中为不同的地理区域创建单独的部分,然后根据用户当前位置仅搜索这些特定部分的数据库,但这似乎不够复杂,并且仍然会导致大量的信息被提取。什么是最佳方法?

你在谷歌搜索中得到了哪些建议?https://dev59.com/hXRB5IYBdhLWcg3wl4Sc https://gis.stackexchange.com/questions/115766/fastest-strategy-for-proximity-searches-in-sql-server-2012 http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates - philipxy
@philipxy DBMS只是由Heroku托管的Parse服务器。我相信它使用的是MongoDB,但我只与Heroku托管的Parse服务器仪表板进行交互。 - Runeaway3
  1. 请将澄清内容编辑到您的问题中,而不是评论中。
  2. 一般原则是您应该尝试在数据库/服务器中查询。所以“只是”不适当。那就是数据库的作用。
  3. 如果当前答案不足够满意,请评论说明原因,并将您的问题编辑为询问您想要的答案类型。您的问题不是很具体;没有办法确定帖子如何回答它。
- philipxy
2个回答

1

您需要在客户端进行这种检查的原因是什么?我建议将您的坐标发送到服务器,然后让服务器使用这些坐标查询您的数据库,并根据给定的坐标确定要提取哪些项目。然后,您可以让服务器将与该用户“接近”的任何项目返回到客户端。

编辑:重新措辞


我该如何在服务器端而不是客户端发起这种比较呢? - Runeaway3
好的,在您的数据库中,我假设您将存储用户的位置(通过坐标或其他方式)。然后,您可以在服务器上创建一个路由,该路由接收用户位置(以及所有其他必要的事项,如身份验证等)。然后,服务器将查询数据库以查找位于这些坐标附近的其他用户,然后使用从数据库获取的任何内容响应请求。显然,我省略了许多较小的细节,但是思路已经表达清楚。 - TNguyen


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接