【发布时间】:2018-04-01 22:59:32
【问题描述】:
我很想知道是否有办法简化我的 Firebase DB 查询。
另外,提出拉取请求时要遵循哪些最佳实践。
我注意到添加子级导致的层次结构越复杂,我的代码中的查询就会变得非常费力和冗长。
【问题讨论】:
标签: ios iphone swift firebase firebase-realtime-database
我很想知道是否有办法简化我的 Firebase DB 查询。
另外,提出拉取请求时要遵循哪些最佳实践。
我注意到添加子级导致的层次结构越复杂,我的代码中的查询就会变得非常费力和冗长。
【问题讨论】:
标签: ios iphone swift firebase firebase-realtime-database
如果您发现自己需要复杂的查询,这很可能意味着您的数据结构不正确。 在您的情况下,您的结构需要标准化(展平)。
以下修改应该使您的查询更简单:
{
"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/key 即可直接访问其数据(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 级嵌套数据。通过上面的修改,您可以轻松地将这些级别减半。
您还应该考虑将所有数组结构(如ImageRef 下的那些)替换为arrays can be evil 的键值对。
【讨论】: