JSON数据结构导致从数据库传递的数据最少

JSON数据结构导致从数据库传递的数据最少,json,angularjs,firebase,angularfire,Json,Angularjs,Firebase,Angularfire,我试图理解如何使用JSON对象构造一组特定的数据 假设我有一群用户,并且像这样存储在数据库中(我使用的是firebase): 使用firebase,我可以查看狗使用的名称条目 /0/名称 按照我的理解,当我调用firebase(我使用的是angularjs)时,它会将整个JSON对象传递给其他用户。这对于较小的数据集非常有效,但是假设数据集增加到5MB。最初的加载速度非常慢(在我看来),但是事情可能不会太糟(尽管您只是挂起了大量的数据来处理) 我正试图想出一种方法来组织我的数据,因此如果我只想得

我试图理解如何使用JSON对象构造一组特定的数据

假设我有一群用户,并且像这样存储在数据库中(我使用的是firebase):

使用firebase,我可以查看狗使用的名称条目 /0/名称

按照我的理解,当我调用firebase(我使用的是angularjs)时,它会将整个JSON对象传递给其他用户。这对于较小的数据集非常有效,但是假设数据集增加到5MB。最初的加载速度非常慢(在我看来),但是事情可能不会太糟(尽管您只是挂起了大量的数据来处理)

我正试图想出一种方法来组织我的数据,因此如果我只想得到一个名称列表,那么我会根据名称下拉详细信息(例如,如果用户单击)

理想情况下,我将调用/name,它将只返回所有名称(而不是关联的剩余数据)

有人有什么建议吗

编辑: 我以狗猫牛为例,实际上他们是人,应用程序可以添加一个名字和细节(在其他页面上)。我想先看一个名字列表,然后点击它们作为链接,如果有,如果名字不存在,我会创建它,然后允许添加“细节”。我希望这能帮助更多人。(我假设数据库将一直增长,这就是为什么我说5MB,实际上它可能会增长到更多,但我不知道,这取决于使用情况)

数据结构 使用Firebase构建时,数据的非规范化是关键。在您的场景中,我建议维护一个二级索引,该索引仅包含您的动物名称,并带有用于加载详细信息的唯一键。例如:

{
 "names": 
    {
      "Dog": 0,
      "Cat": 1,
      "Cow": 2
    },
 "animals": 
    {
       0: {name:"Dog", details:{somestuffhere}},
       1: {name:"Cat", details:{somestuffhere}},
       2: {name:"Cow", details:{somestuffhere}}
    }
}
现在,您可以使用普通Firebase引用加载
/names
的所有子级,然后您可以决定要加载哪些详细信息

添加新动物时,只需确保添加相应的
/names
条目即可

将此结构与AngularJS一起使用 AngularFire将加载给定路径的所有数据,这是正确的,但是我们可以使用新的数据结构来限制这一点。我们可以使用多个AngularFire,并且更具选择性,而不是使用一个加载所有数据的通用AngularFire

这第一场火载入了我们的名单

// Load the list of names to $scope.names
angularFire(new Firebase("http://[Your Firebase].firebaseio.com/names"), $scope, "names"));
然后,一旦用户选择了动物,就会使用路径
/names/{animal}
的新AngularFire动态加载该动物的详细信息。在此示例中,假定动物的唯一键存储在
animalKey
变量中

// Load the specific animal details to $scope.animal
angularFire(new Firebase("http://[Your Firebase].firebaseio.com/animals/").child(animalKey), $scope, "animal"));
现在,我们的动物数据已在
$scope.animal
上公开,我们还没有加载其他动物的所有不需要的数据

安全地添加新动物 就这一回答发表评论

作为一般建议,千万不要在Firebase中使用递增整数作为键。由于Firebase的实时性,两个用户同时添加具有相同递增整数键(在本例中为
3
)的新项的可能性非常高,这将导致覆盖其中一个条目。改用Firebase的

在您的场景中,您要做的是绕过AngularFire并使用
。在Firebase参考上按
。尝试以下操作:

var newAnimalRef = (new Firebase('http://[Your Firebase].firebaseio.com'))
    .child('animals')
    .push({name: 'Fish', details: ""});
它将创建一个新的
/animates
子对象,其键类似于
-fj213jjkaidja
。然后,我们可以使用
.once
将新项目添加到
/names
索引中:

newAnimalRef.once('value', function (snapshot) { 
    (new Firebase('http://[Your Firebase].firebaseio.com'))
        .child('names')
        .child(snapshot.val().name)
        .set(snapshot.name()) 
});
然后,我们以一种干净、安全的方式增加了一个孩子

闭幕词
  • 下面是一个关于数据非规范化的示例,如果您是从关系数据库工作而来,它通常是一个很好的资源

  • $scope
    上可能创建多个与同一字段关联的AngularFire时,请小心。如果不小心,可能会导致对单个字段的更改写入Firebase中的多个路径。为了防止出现这种情况,可以只将AngularFire连接到将定期拆除的
    $scope
    (即显示动物数据的模块特定的控制器),或者像我在中所做的那样,使用从AngularFire传递到已解决承诺的解除关联方法

  • 数据结构 使用Firebase构建时,数据的非规范化是关键。在您的场景中,我建议维护一个二级索引,该索引仅包含您的动物名称,并带有用于加载详细信息的唯一键。例如:

    {
     "names": 
        {
          "Dog": 0,
          "Cat": 1,
          "Cow": 2
        },
     "animals": 
        {
           0: {name:"Dog", details:{somestuffhere}},
           1: {name:"Cat", details:{somestuffhere}},
           2: {name:"Cow", details:{somestuffhere}}
        }
    }
    
    现在,您可以使用普通Firebase引用加载
    /names
    的所有子级,然后您可以决定要加载哪些详细信息

    添加新动物时,只需确保添加相应的
    /names
    条目即可

    将此结构与AngularJS一起使用 AngularFire将加载给定路径的所有数据,这是正确的,但是我们可以使用新的数据结构来限制这一点。我们可以使用多个AngularFire,并且更具选择性,而不是使用一个加载所有数据的通用AngularFire

    这第一场火载入了我们的名单

    // Load the list of names to $scope.names
    angularFire(new Firebase("http://[Your Firebase].firebaseio.com/names"), $scope, "names"));
    
    然后,一旦用户选择了动物,就会使用路径
    /names/{animal}
    的新AngularFire动态加载该动物的详细信息。在此示例中,假定动物的唯一键存储在
    animalKey
    变量中

    // Load the specific animal details to $scope.animal
    angularFire(new Firebase("http://[Your Firebase].firebaseio.com/animals/").child(animalKey), $scope, "animal"));
    
    现在,我们的动物数据已在
    $scope.animal
    上公开,我们还没有加载其他动物的所有不需要的数据

    安全地添加新动物 就这一回答发表评论

    作为一般建议,千万不要在Firebase中使用递增整数作为键。由于Firebase的实时性,两个用户同时添加具有相同递增整数键(在本例中为
    3
    )的新项的可能性非常高,这将导致覆盖其中一个条目。使用Firebase的仪器