Firebase - 按城市构建数据库

时间:2016-12-09 23:54:42

标签: android data-structures firebase firebase-realtime-database

嗯,这是我第一个使用Firebase的Android应用程序,我有点担心数据库的存储。

这是我的问题;我正在开发一个分享用户帖子的应用程序,但我希望用户只能看到他们自己的国家或城市的帖子。由于Firebase确实考虑了数据库和存储的使用,如果用户必须绕过世界上所有帖子只是为了找到他所在城市共享的帖子,他可能会使用大量数据。

那么我如何构建我的数据库以便让用户只是在他周围发布帖子而不过滤掉世界各地的所有帖子?有没有办法实现这个目标?如果他已经遇到过这个问题,有人可以分享他的经验吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

当用户发布帖子时,其中一个键值对可以是"location" : "New York, NY"。如果正在查看帖子的用户在“纽约,纽约”,那么该应用程序可以在数据库中查询“纽约,纽约”中的帖子。我假设你知道或者可以弄清楚如何从用户那里获取位置数据并进行概括,以便帖子显示在更广义的“纽约,纽约”,而不是更具体的东西,如“长岛,纽约“(除非你想让它更具体。 在Swift中,代码可能类似于:

FIRDatabase.database().reference().child("posts").queryOrdered(byChild: "location").queryEqual(toValue: "New York, NY")

在Java(Android)中它应该是相同的想法

在这种情况下,数据库将返回该区域中的所有帖子,“纽约,纽约”

答案 1 :(得分:1)

所以你的问题更像是像Kafka这样的发布 - 订阅消息传递系统。

如果我已正确理解您的问题,您希望在获取应用程序用户的当前位置后获得最近城市/地区的供稿。现在,我们有许多工具和技术可以达到这个目的(例如Kafka)。但是这个问题是特定于Firebase的,所以不需要服务器端编码。我不确定为您的问题提供解决方案,但我们只考虑如何解决问题,然后我们可以尝试以Firebase方式复制解决方案。

我们可能会想到一个频道,其中转发了您的应用程序的每个用户的帖子。每个帖子都有一个标识其位置的密钥。现在让我们将您的应用程序的每个用户视为该渠道中具有某些特定主题的订阅者。一旦任何订户(即您的应用程序的用户)来了,频道就会向该订户提供他们想要的帖子(即附近城市的帖子)。

例如,我们在该频道中有一些帖子包含密钥,NYDhakaKhulnaNJLondon,{{1现在,来自Seoul的某个人已经订阅了您的频道,而他附近的城市是SydneyJessore。因此,订阅者拥有密钥Dhaka,当频道看到密钥时,它会为包含密钥KhulnaDhaka, Khulna的位置的帖子提供服务。

现在我们如何才能在Firebase中实现此行为?这就是我们在这一点上面临的挑战。因此,让我们有一个Dhaka节点,其中包含来自所有位置的所有帖子(如前面所述的频道)。这是一个示例数据结构。

Khulna

现在,您需要在城市中拥有channel,当您将当前城市传递到该表时,它会告诉您最近的城市。您需要找到您自己的城市距离映射。可以说,您当前的城市是channel - post1 - content : "this city is beautiful" - location: "Khulna" - post2 - content : "This city is okay" - location: "Dhaka" - post3 - content : "London, here I come" - location: "London" - post4 - content : "leaving the city" - location: "NY" 。距离映射表应返回最近的城市(例如distance-mappingJessore)。这可能是一个复杂的构建。但是一旦构建了关系映射,就只需要更新它。例如,Dhaka数据的最终状态将如下所示。

Khulna

现在,当您获得用户的当前位置时,您可以轻松地从Firebase中的distance-maping表中找到最近的城市。将城市传递到distance-mapping - Dhaka - Khulna - Jessore - Khulna - Dhaka - Jessore - Jessore - Dhaka - Khulna - Vegas - NY - NY - Boston - Vegas 表,获取具有这些特定键的帖子。

以下是有关Firebase中复杂查询的一些答案。您可能会从这些中获取帮助传递select查询参数。

希望有所帮助!