【问题标题】:Firebase data structuring (best practice)Firebase 数据结构(最佳实践)
【发布时间】:2016-09-21 19:24:56
【问题描述】:

我刚开始使用 NoSQL 结构,所以我有一个关于数据结构的问题。

我们正在开发一个包含组的应用。您可以创建一个组(工作、家庭、亲密朋友、自定义)并选择将包含在其中的用户。每个用户都有自己的组。

还有与该人创建聊天的选项 - 用户可以与不同的人创建多个聊天。

我创建了一个 json 结构,所以如果你可以检查它是否是非规范化的,或者我是否可以以某种方式对其进行改进。

{
  "groups" : {
    "gid1" : {
      "name" : "This is first group",
      "members" : {
        "uid1" : true,
        "uid2" : true
      }
    },
    "gid2" : {
      "name" : "This is second group",
      "members" : {
        "uid2" : true,
        "uid3" : true
      }
    }
  }, 

  "chats" : {
    "cid1" : {
      "members" : {
        "udi1" : true,
        "uid2" : true
      },
      "messages" : {
        "m1" : true,
        "m2" : true,
        "m3" : true
      }
    }
  },

  "messages" : {
    "m1" : {
      "message" : "Test Message",
      "author" : "AuthorName"
    },
    "m2" : {
      "message" : "Test Message 2",
      "author" : "AuthorName2"
    },
    "m3" : {
      "message" : "Test Message 3",
      "author" : "AuthorName3"
    }
  },

  "users" : {
    "uid1" : {
      "email" : "first@user.com",
      "name" : "FirstUser",
      "groups" : {
          "gid1" : true
        },
        "friends" : {
          "uid2" : true
        },
        "chats" : {
          "cid1" : true
        } 
    },
    "uid2" : {
      "email" : "second@user.com",
      "name" : "SecondUser",
      "groups" : {
          "gid1" : true,
          "gid2" : true
        },
        "friends" : {
          "uid1" : true
        },
        "chats" : {
          "cid1" : true
        } 
    }
  }
}

还有代码问题(iOS、Swift): 所以有了这样的结构,我可以调用:/users/uid1/groups。如何获取我创建的所有组?目前我的代码如下所示:

func getGroups(callback:([Group]) -> ()) {
        NSLog("Get groups called")
        var groupsArray:[Group] = [Group]()
        var appendCounter = 0

        self.ref?.child("users").child(currentUser!.uid).child("groups").observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
            let tempGroups = snapshot.children
            let snapshotCount = snapshot.childrenCount

            while let group = tempGroups.nextObject() as? FIRDataSnapshot {
                self.ref?.child("groups").child(group.key).observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
                    let groupDict = snapshot.value as! [String : AnyObject]
                    let tempGroup = Group()
                    tempGroup.key = group.key
                    tempGroup.name = groupDict["name"] as? String

                    groupsArray.append(tempGroup)
                    appendCounter += 1

                    if appendCounter == Int(snapshotCount) {
                        callback(groupsArray)
                    }
                })
            }
        }, withCancelBlock: { (error:NSError?) in
            if let error = error {
                print(error.description)
            } else {

            }
        })
    }

这是正确的方法吗?

【问题讨论】:

    标签: ios json swift firebase firebase-realtime-database


    【解决方案1】:

    虽然这完全取决于您将如何获取和显示数据,但我看到的主要问题是,要使用当前结构获取特定聊天中的所有消息,您需要查询 chats/cid1/messages,然后查询messages每个m1、m2等的数据

    更好的方法是以聊天 id 作为键来构造消息数据,您不需要将消息对象保存在 chats 对象中:

    "messages": {
        "cid1": {
            "m1": {
                "message": "Test Message",
                "author": "AuthorName",
                "timestamp": 1459361875337
            },
            "m2": { ... },
            "m3": { ... }
        }
    }
    

    当您需要获取聊天中的所有消息时,您只需查询messages/cid1。如果您愿意,您可以对members 执行相同操作,并让chats 对象仅保存有关对话的元数据,例如聊天室名称、最后一条消息等。

    参考:https://firebase.google.com/docs/database/ios/structure-data#flatten_data_structures

    在 iOS 端,你有什么工作,你可以通过去掉计数器来简化它,因为 while 循环将在最后一个对象之后自行退出。

    while let group = tempGroups.nextObject() as? FIRDataSnapshot {
        // create you group object
        // append to groupsArray
    }
    callback(groupArray)
    

    【讨论】:

    • 这就是我想要的。谢谢!
    • @ZassX 如果对您有用,请接受答案。
    • 哦,对不起,完全忘记了。再次感谢!
    猜你喜欢
    • 2018-05-17
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多