在firebase structure data部分,它显示了如何使用许多用户组情况构建数据。但是,为什么他们使用" referece":两侧都是true而不是使用简单的数组od id。
喜欢,它可以像以下两种方式一样使用:
具有组数组的用户
"groups" : [ "groupId1", "groupId2", ... ]
有
的用户"groups": {
"groupId1" : true,
"groupId2" : true,
..
}
他们是第二种方式。这是什么原因?
在某些视频中,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
}
},
...
}
}
答案 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上的文章。