我有一个时间线节点,如下所示。我首先存储关注一些发帖用户的用户的uid。然后我将海报UID 和帖子ID 存储在其旁边,并用“:”分隔信息,以便稍后可以轻松获取每个部分。然后我存储帖子的时间戳。
"Post_Timeline" : {
"uid" : {
"posterUID:postID" : {//example postID value: "post:583190375"
"timeStamp" : 583190375
},
我想知道这样做是否会更有效(我所说的高效是指更快地获取或获取正确的信息。或者可能在火力成本方面。等等):
"Post_Timeline" : {
"uid" : {
"randomID" : {
"timeStamp" : 583190375,
"posterUID" : "JNFSD78436VSFFDSF"
},
我用来获取的代码:
ref.child("Timeline").child((Auth.auth().currentUser?.uid)!)
.queryOrdered(byChild: "timeStamp")
.queryLimited(toLast: 10)
.observeSingleEvent(of: .value, with: { (snapshot) in
var i = 0
for case let rest as DataSnapshot in snapshot.children.reversed() {//.reversed()
let keyValue = rest.key
let uid = keyValue.split(separator: ":")[0]
let postIDDoubleVal = keyValue.split(separator: ":")[2]
self.fetchUsersPost(uid: "\(uid)", postID: "post:\(postIDDoubleVal)")
我使用此时间线获取当前用户关注的用户最近创建的 10 个帖子。
最佳答案
通常,Firebase 结构取决于您要使用的查询类型。 IMO 通常最好的做法是将节点 key 与其包含的数据分离 - 特别是如果节点 key 可能是动态数据,例如将来可能会更改的电子邮件或用户名。
我将通过提供原因示例来提出这个答案
"posterUID:postID"
可能会很糟糕。
不言而喻,您显然必须有代码来编码/解码节点 key ,因此这只是额外的代码。
问题#1:如果同一用户在同一个帖子中发帖两次怎么办?
uid
posterUID:postID
timeStamp: 583190375
posterUID:postID
timeStamp: 123456789
啊 - 不能这样做,因为同一节点内不能有重复的键
问题#2:如果不读取所有节点并在代码中进行过滤,就无法完成有关特定帖子的任何类型的查询。这可能是大量数据或大量冗余
问题#3:获取所有被关注的用户发布关于特定帖子的帖子的次数。 Firebase 不支持部分结尾字符串查询。
问题#4: Post_1234 已被删除,现在我需要从“uid”节点删除对该节点的引用。好吧,如果不读取所有子节点,这种情况就不会发生。
可能会遇到许多其他问题,但如果不了解可能运行的查询的完整范围,这些问题就无法解决。
这似乎是一个更灵活的解决方案
Post_Timeline
uid
randomID
timeStamp: 583190375,
posterUID: "JNFSD78436VSFFDSF"
关于ios - 将一些数据库引用数据存储在节点键中还是作为值更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799882/