Firebase“GeoFire”是否在具有地理和非地理数据的节点之间实施相同的密钥?

时间:2018-03-20 08:23:44

标签: firebase geofire

Firebase“GeoFire”节点的数据库结构必须如下所示(source

"items" : {
    <itemId> : {
        "someData" : "someData",
        ...
    }
},
"items_location" : {
    <itemId> : {
        <geofireData> ...
    }
}

但是Geofire的一个限制是只能存储和查询单个点,而且没有像多边形这样的对象。这很容易解决 - 我的代码可以查询附近的点,然后根据具有相同的键重新组装简单的矩形。

但是在将我的矩形分成单个点时,我创建了一个具有以下格式的GeoFire键

ABCD_0

其中ABCD是矩形的原始主键,_0表示哪个角,以便每个点都有唯一键。一个矩形在GeoFire中表示为

"items" : {
   <ABCD_0> : {<objectData>},
   <ABCD_1> : {<objectData>},
   <ABCD_2> : {<objectData>},
   <ABCD_3> : {<objectData>}
},
"items_location" : {
    <ABCD_0> : {<geofireData 0>},
    <ABCD_1> : {<geofireData 1>},
    <ABCD_2> : {<geofireData 2>},
    <ABCD_3> : {<geofireData 3>}
}

但是要强制itemsitems_location中的相同密钥,<objectData>是4倍冗余。

为了减少数据量,我想在items节点中使用原始主键,然后使用_X结构复制items_location节点的密钥。然后,应用程序将查询GeoFire,获取(4)附近密钥的列表,然后将ABCD_X字符串解析为ABCD,它将用于后续查询。

"items" : {
   <ABCD> : {<objectData>},
 },
"items_location" : {
    <ABCD_0> : {<geofireData 0>},
    <ABCD_1> : {<geofireData 1>},
    <ABCD_2> : {<geofireData 2>},
    <ABCD_3> : {<geofireData 3>}
}

这会破坏GeoFire如何存储,索引,检索和撤消数据吗?

我特别关注如何为各个应用离线同步小型数据集。整个地理数据集太大,无法让单个应用程序完全脱机存储。

0 个答案:

没有答案