我很想知道是否有办法简化我的Firebase数据库查询。
此外,在提出拉取请求时应遵循哪些最佳做法。
我注意到我的层次结构越复杂,在我的代码中添加子项会产生非常费力和长时间的查询。
答案 0 :(得分:0)
如果您发现自己需要复杂的查询,则很可能意味着您的数据结构不正确。 在您的情况下,您的结构需要标准化(展平)。
以下修改应使您的查询更简单:
{
"listings": {
"listing_key_1": {
"timestamp": "2017 10 19 07:49:38"
},
"listing_key_2": {
"timestamp": "2017 10 19 05:30:02"
},
...
},
"AircraftHouseRules": {
"listing_key_1": {
"Availability": "",
...
},
"listing_key_2": {
"Availability": "",
...
}
},
"BasicInfo": {
"listing_key_1": {
"ModelPlane": "",
...
},
"listing_key_2": {
"ModelPlane": "",
...
}
},
...
}
我不明白“拉请求”是什么意思。如果您的意思是观察或只是阅读数据,那就非常简单了。在您的情况下,您只需listing
ID /密钥即可直接访问其数据(AircraftHouseRules
,BasicInfo
,DetailedInformation
等等。)。
如果您想要反向(通过,例如,通过其TypeOfPlane
获取列表的密钥),您可以执行以下查询
// NOTE: Untested code - just for illustrative purposes
let queryRef = Database().database.reference.child("BasicInfo").queryOrdered(byChild: "TypeOfPlane").queryEqual(to: "some type")
queryRef.observeSingleEvent(of: .value, with { snapshot in
if let listings = snapshot.value as? [String : Any] {
// all retrieved listings with TypeOfPlane == "some type"
}
})
<强>提示强>
您应始终avoid nesting structures以避免下载不必要的数据并阻碍性能。在您发布的屏幕截图中,您最多有8个级别的嵌套数据。通过上述修改,您可以轻松地将这些级别减半。
您还应该考虑将键值对替换为arrays can be evil的所有数组结构(例如ImageRef
下的数组结构)。