我有一个时间轴节点,如下图所示。我首先存储用户的uid,该用户跟踪一些发布了帖子的用户。然后,我将posterUID和postID存储在它旁边,用一个':‘分隔信息,这样以后我就可以轻松地获取每个部分了。然后我存储帖子的timeStamp。
"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个帖子。
发布于 2019-06-28 16:53:33
通常,Firebase结构取决于将要使用的查询类型。IMO通常是最佳做法,将节点密钥与其包含的数据分离--特别是如果节点密钥可能是动态数据,如电子邮件或用户名,将来可能会发生变化。
我将通过举例说明为什么
"posterUID:postID"可能会很糟。
不用说,显然必须有编码/解码节点密钥的代码,所以这只是额外的代码。
问题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"https://stackoverflow.com/questions/56799882
复制相似问题