Firebase嵌套数据使用"参考" :true而不是数组

时间:2016-06-23 15:58:51

标签: firebase data-structures firebase-realtime-database nosql

在firebase structure data部分,它显示了如何使用许多用户组情况构建数据。但是,为什么他们使用" referece":两侧都是true而不是使用简单的数组od id。

喜欢,它可以像以下两种方式一样使用:

  1. 具有组数组的用户

    "groups" : [ "groupId1", "groupId2", ... ]
    
  2. 的用户
    "groups": {
        "groupId1" : true, 
        "groupId2" : true,
        ..
    }
    
  3. 他们是第二种方式。这是什么原因?

    在某些视频中,Google I / O 2016上有人说过这件事。但是,我无法回想起。

    数据结构示例:

    // An index to track Ada's memberships
    {
      "users": {
        "alovelace": {
          "name": "Ada Lovelace",
          // Index Ada's groups in her profile
          "groups": {
             // the value here doesn't matter, just that the key exists
             "techpioneers": true,
             "womentechmakers": true
          }
        },
        ...
      },
      "groups": {
        "techpioneers": {
          "name": "Historical Tech Pioneers",
          "members": {
            "alovelace": true,
            "ghopper": true,
            "eclarke": true
          }
        },
        ...
      }
    }
    

1 个答案:

答案 0 :(得分:1)

对于大多数情况,Firebase建议不要在其数据库中使用数组。我不会在这里重复原因,而是将您推荐给这​​个经典的blog post on arrays in Firebase

让我们看看您可以从示例中轻松看到的一个简单原因。由于JavaScript中的Firebase数组只是具有顺序整数键的关联对象,因此您的第一个样本存储为:

"groups" : { 
  0: "groupId1", 
  1: "groupId2"
]

要检测此用户是否在groupId2,您必须扫描阵列中的所有值。如果只有两个值,那可能不会太糟糕。但是随着你有更多的价值,它会很快变慢。您还无法查询或保护此数据,因为Firebase查询及其安全规则都不支持contains()运算符。

现在看看替代数据结构:

"groups": {
    "groupId1" : true, 
    "groupId2" : true
}

在此结构中,您可以通过精确检查一个位置来查看用户是否在groupId2中:/groups/groupId2。密钥存在,用户是groupId2的成员。在这种情况下,实际值并不重要,我们只使用true作为标记值(因为如果没有值,Firebase将删除路径)。

这也可以更好地处理查询和安全规则,因为您现在只是"只是"需要一个exists()运算符。

对于此类建模的一些很好的见解,我强烈推荐NoSQL data modeling上的文章。