ios - 将一些数据库引用数据存储在节点键中还是作为值更好?

标签 ios firebase firebase-realtime-database

我有一个时间线节点,如下所示。我首先存储关注一些发帖用户的用户的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/

相关文章:

ios - 错误 :- Couldn't codesign Frameworks/libswiftCore. dylib:协同设计

ios - 将 CGPoints (CIRectangleFeature) 从 Image 转换为 ImageView

ios - 如何使 UIScrollView 高度等于内容高度?

firebase - 为什么身份验证不能在自己的域上工作,但可以在 firebase 的域上工作?

android - Kotlin在上传时将图像上传到Firebase Animation或setContentLayout到另一个 Activity

ios - 从其他类调用 CollectionView 中的下一张图像

parse-platform - Firebase 云代码(后端逻辑)

ios - 从 Core Data Swift 中删除值时出现错误 Domain=NSCocoaErrorDomain Code=1570

Firebase 测试数据

android - 如何在 Firebase 中按应用版本阻止用户