gpt4 book ai didi

json - 如何在 Firebase JSON 树中表示两种方式的关系?

转载 作者:行者123 更新时间:2023-12-04 10:48:04 26 4
gpt4 key购买 nike

警告:

  • 这是在 Firebase 中更好地理解 JSON 数据库设计的练习
  • 不一定现实

  • 我在用户和门 key 之间有两种关系。我想明白:
  • 如何在视觉上表示这种关系( 我只能把它想象成两棵独立的树 )
  • 这将如何在 Firebase 上工作,用户 门 key 是父节点“myparentnodename”的子节点?
  • 如果我以这种方式对数据库进行建模,则感觉效率非常低,因为每次我查询子节点“用户”时,我都会返回所有用户。还是我错了?是否可以只取回与特定用户匹配的数据?例如。获取用户在哪里“用户=用户1”?我们可以进行嵌套查询吗?例如将前面的条件与门 key 上的某些条件结合起来,以便返回的 JSON 对象仅与“user1”节点中包含的门 key 相关?

  • enter image description here

    最佳答案

    这是一个很长的答案,因为您的问题实际上是关于 5 个不同的问题。

    根节点是:myparentnodename

    您的用户

      users
    uid_0
    name: "William"
    door_keys:
    key_0: true
    key_3: true
    uid_2
    name: "Leonard"
    door_keys:
    key_3: true
    key_5: true

    和你的 key
      keys
    key_0
    uid_0: true
    key_3
    uid_0: true
    uid_2: true
    key_5
    uid_5: true

    通过这种结构,所有元素都“指向”彼此。

    如果你查询 uid_0 你可以看到他们使用键 0 和 3

    如果您查询 key_3,您可以看到它们属于用户 0 和 2

    你的问题是

    every time I would query the child node "users" I would get all the users back



    这有点不完整。查询完成后,您通常会查询特定的内容。但是,对于 Firebase,有两种方法可以检索数据:观察节点和查询。

    如果您想返回 users 节点中的所有用户,您可以通过 .Value (或一次 .ChildAdded 为 1)观察该节点。
    ref = myParentNodeName
    let usersRef = myParentNodeName.childByAppendingPath("users")

    usersRef.observeEventType(.Value, withBlock: { snapshot in

    //.Value can return multiple nodes within the snapshot so iterate over them
    for child in snapshot.children {
    let name = child.value.objectForKey("name") as! String
    print(name) //prints each users name
    }
    })

    请注意,上面将观察者附加到用户节点,因此该节点内的任何 future 更改都会通知应用程序并将整个节点重新发送到应用程序

    如果您只需要一个用户的信息,并且不想继续查看更改
    ref = myParentNodeName
    let usersRef = myParentNodeName.childByAppendingPath("users")
    let thisUserRef = usersRef.childByAppendingPath("uid_2")
    thisUserRef.observeSingleEventOfType(.Value, withBlock: { snapshot in

    let name = child.value.objectForKey("name") as! String
    print(name) //prints each users name
    })

    最后,查询属于 uid_0 的所有键(在这个例子中有点多余,因为我们已经知道他们从他们的节点拥有哪些键)。如果键 ref 还包含其他信息,例如门名称、门所在的建筑物或门位置,则更合适并且需要不同的结构,因此假设是这种情况:
    ref = myParentNodeName
    let keysRef = myParentNodeName.childByAppendingPath("keys")

    keysRef.queryOrderedByChild("uid_0").queryEqualToValue(true)
    .observeSingleEventOfType(.Value, withBlock: { snapshot in

    let doorLocation = child.value.objectForKey("door_location") as! String
    print(doorLocation) //prints each users name
    })

    请注意,此代码是 Swift,因为问题中未指定平台。

    另一个问题:

    Can we do nested queries? e.g. combine the previous condition with some condition on the door keys so the JSON object returned is only relevant to the door-keys contained in the "user1" node?



    我想你的意思是你可以查询 uid_2,看看他们有哪些键,然后从这些特定键加载信息。

    是的!但是...(总有一个但是)

    Firebase 是异步的,因此您在嵌套查询时必须考虑到这一点,即您需要确保在获取更多数据之前返回所有数据。例如,如果您想要 uid_2 关键数据,您可以在节点 uid_2 上观察SingleEventOfType。然后您将拥有他们的键,然后可以在每个键上观察SingleEventOfType。

    从技术上讲,这是可行的,但随着异步数据四处飞扬,您最终可能会在其他代码上踩踏其他代码并在实际返回数据之前处理数据。

    更好的选择(根据我的例子)是完全避免这种情况并查询 uid_2 的键的键节点。

    作为旁注,观察节点的开销比查询少得多,因此如果您想加载单个节点并且知道路径,请使用观察。

    关于json - 如何在 Firebase JSON 树中表示两种方式的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37413170/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com