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>}
}
但是要强制items
和items_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如何存储,索引,检索和撤消数据吗?
我特别关注如何为各个应用离线同步小型数据集。整个地理数据集太大,无法让单个应用程序完全脱机存储。