Firebase:如何改进这种数据结构?

时间:2015-06-03 15:12:48

标签: angularjs firebase angularfire rest-firebase

我正在构建一个简单的AngularJS应用程序,使用Firebase在1件事物下存储2个不同的东西。比如var red = 'red'; var yellow = 'yellow'; function flower(color) { this.color = color; } var firstFlower = new flower(red); var secondFlower = new flower(yellow); var flowers = [firstFlower, secondFlower]; flowers.forEach(function (flower, index) { var displayIndex = index +1; switch (flower.color) { case red: console.log("flower number " + displayIndex + " is a tulip"); break; case yellow: console.log("flower number " + displayIndex + " is a sunflower"); break; } }); 下的malefemale个学生群组。

这是我当前的Firebase数据结构:

enter image description here

这是我的添加功能代码:

students

由于我是NoSQL的新手,我发现这个数据结构看起来很奇怪。

我的问题

  1. 我做得对吗?

  2. 图片中的$scope.add = function() { console.log('add button clicked!'); var ref = new Firebase('https://XXX.firebaseio.com/'); var onComplete = function(error) { if (error) { console.log('Failed to add a new record'); } else { console.log('Successfully add a new record'); } }; var order = ref.child("students"); var newPostRef = order.push([{ "male": [{ "name": "Jose Fowler", "age": 20 }, { "name": "Earl Murray", "age": 21 }] }, { "female": [{ "name": "Jessica Gomez", "age": 22 }, { "name": "Leona Franklin", "age": 23 }] }], onComplete); var postID = newPostRef.key(); console.log("Unique ID: " + postID); } 0是否正常?

  3. 如果有更好的方法,如何改进我的代码,以便Firebase可以为我构建更好的数据结构?

  4. 以下结构可能吗?

  5. enter image description here

    注意:我希望每个数据集都有唯一的ID。换句话说,学生中的每个学生都有唯一的ID。我知道通过查看这个1示例没有意义。遗憾。

2 个答案:

答案 0 :(得分:3)

另一个需要考虑的结构是

students
  student_0_id:
     name:
     age:
     gender
  student_1_id:
     name:
     age:
     gender:

student_x_id是一个firebase生成的自动生成的节点ID(childByAutoId / push

这种结构具有许多优点;其中最大的一点就是它“平淡”,因此查询很容易。所以你可以说,查询所有年龄在18到20岁之间的女学生。

此外,由于每个学生现在都有唯一的识别参考,您可以从另一个节点引用它们。例如,您希望跟踪哪些学生在所提供的课程中

Classes
  Algebra
    student_1_id
    student_2_id
  Chemistry
    student_3_id
    student_4_id

不要使用0和1作为节点'名称'。

答案 1 :(得分:1)

Firebase存储JSON对象。虽然您可以推入JavaScript数组,但它将以您看到的格式存储。请注意,如果您将数据读回程序,它将被转换回数组。

正如Jay在他的(伟大的)答案中指出的那样,数组不是用于在分布式环境中存储数据的推荐数据结构。随着并发客户端数量的增加,您会发现必须维持所谓的单调递增计数器成为瓶颈。这就是Firebase进行push操作的原因。它具有许多相同质量的数组索引(它总是增加,所以事情是自动排序的),但保证在客户端是唯一的。这些推送ID的缺点是它们不像常规数组索引那么容易理解。

我会将您的代码更改为:

var order = ref.child("students");
var men = order.child("male");
var women = order.child("female");
men.push({
    "name": "Jose Fowler",
    "age": 20
});
men.push({
    "name": "Earl Murray",
    "age": 21
});
women.push({
    "name": "Jessica Gomez",
    "age": 22
});
women.push({
    "name": "Leona Franklin",
    "age": 23
});