Firebase数据库 - 为具有嵌套用户节点的用户建议的数据库结构

时间:2017-07-20 10:27:43

标签: firebase firebase-realtime-database

我想知道如何完成数据库的结构。我正在创建简单的配对应用程序,我想创建一对多的关系。

matches
   8aWcF6GQmpezfJkVnW5uYoJ2wtI3 //id for user
      8oqmrMVZ57XXlunIAUEeBgKFZ0h2 //id of matched users
      NzDaJNamKNVsWuP0FVaJI7b6Cuk1
      XzGWMuXrFYQ6m0MMVSwvpjSV4JF2

users
   8aWcF6GQmpezfJkVnW5uYoJ2wtI3
      email: "test@mail.com"
      uid: "8aWcF6GQmpezfJkVnW5uYoJ2wtI3"
      username: "john"
   NzDaJNamKNVsWuP0FVaJI7b6Cuk1
      email: "test2@mail.com"
      uid: "NzDaJNamKNVsWuP0FVaJI7b6Cuk1"
      username: "john2"
   XzGWMuXrFYQ6m0MMVSwvpjSV4JF2
     email: "aaaaa@mail.ru"
     uid: "8oqmrMVZ57XXlunIAUEeBgKFZ0h2"
     username: "aaaaa"

但是,我无法实现子节点,没有值。因此,在Firebase控制台中无法创建上述结构。

你能给我任何建议吗?

1 个答案:

答案 0 :(得分:1)

Firebase确实无法存储没有值的密钥。所以你有两个选择:

  1. 制作一把钥匙
  2. 制作一个值
  3. 让我们先解决错误解决方案:制作密钥。

    许多开发人员选择选项1:编造自己的密钥。这通常会导致他们使用数组:

    matches
       8aWcF6GQmpezfJkVnW5uYoJ2wtI3 //id for user
          [ "8oqmrMVZ57XXlunIAUEeBgKFZ0h2", "NzDaJNamKNVsWuP0FVaJI7b6Cuk1", "XzGWMuXrFYQ6m0MMVSwvpjSV4JF2" ]
    

    这看起来非常简洁,但却是错误的解决方案。数组是一个有序集合,可以多次包含相同的值。在您的数据中,每个用户只能出现一次。这意味着每次我们想要添加用户时,我们都必须执行array.contains()

    更好的解决方案是弥补价值。我们在这里使用的价值并不重要,因此惯用价值是true

    matches
       8aWcF6GQmpezfJkVnW5uYoJ2wtI3 //id for user
          8oqmrMVZ57XXlunIAUEeBgKFZ0h2: true
          NzDaJNamKNVsWuP0FVaJI7b6Cuk1: true
          XzGWMuXrFYQ6m0MMVSwvpjSV4JF2: true
    

    现在数据结构在密钥中仍然具有用户ID,这也意味着每个用户ID只能在集合中一次。这基本上是Set data structure

    的Firebase数据库实现

    请注意true这里没有神奇的价值。因此,如果您发现需要为每个用户保留一些数据,则可以轻松存储而不是true

    例如,如果要显示所有朋友的姓名,可以考虑存储他们的姓名而不是true。它将节省您必须为每个用户查找它。当然,这意味着如果用户更改其名称,您必须弄清楚要执行的操作。有关详情,请参阅此答案:How to write denormalized data in Firebase