我在firebase中有一些结构如下所示。我的客户端使用angularjs + angularfire构建。
'all_records'是这样嵌套的,用于分割数据,并且大多数查询都是以时间为导向的。
'all_records'巢等于:all_records>年>月份>日期>记录。
我想将记录与发布记录的用户相关联,因此在创建记录时已将相关ID保存到“my_records”中的用户。
这个示例显然是一个非常小的数据集,但是为了实现可伸缩性并且可能拥有数十万条记录,这将是查询“all_records”以获得用户“my_records”的最佳方式。
由于
all_records : {
2015 : {
2 : {
3: {
-JgJJaLaL7LuuRL_IO7c : {
data: big data;
},
-JgJfaOsyfZe_mZPTApA : {
data: lots of data;
},
...
},
...
},
1 : {
28 : {
-JgJJaLaL7kddEl_ddfE : {
data: some more data;
}
},
27 : {
-JgJfadkdjEk_mZPTApA : {
data: even more;
}
},
...
},
...
},
2014 : {
12 : {
24: {
-JgJmnvkFdqc_y63lqcv : {
data: decemeber data;
},
-JgK6xbXY_E58lshaiVa : {
data: and a bit more data;
}
},
...
},
11 : {
...
},
...
}
}
user: {
name : James,
my_records : {
-JgK6xbXY_E58lshaiVa: true,
-JgJJaLaL7LuuRL_IO7c: true
}
}
答案 0 :(得分:3)
您的用户my_records
目前没有足够的信息直接映射到记录。您需要将日期(年,月和日)添加到信息中以允许直接查找。
我会以不同的方式构建事物:
push
生成的-J
密钥您的应用应该从不尝试加载所有记录的列表(#1)。相反,它应该加载相关用户(来自#2)或来自(#3)的相关日期,然后仅加载 从那里引用的记录。
all_records : {
-JgJJaLaL7LuuRL_IO7c : { data: big data; },
-JgJfaOsyfZe_mZPTApA : { data: lots of data; },
-JgJJaLaL7kddEl_ddfE : { data: some more data; }
-JgJfadkdjEk_mZPTApA : { data: even more; }
}
dates: {
2015 : {
2 : {
3: {
-JgJJaLaL7LuuRL_IO7c : true,
-JgJfaOsyfZe_mZPTApA : true,
...
},
...
},
1 : {
28 : {
-JgJJaLaL7kddEl_ddfE : true
},
27 : {
-JgJfadkdjEk_mZPTApA : true
},
...
},
...
}
}
user: {
name : James,
my_records : {
-JgK6xbXY_E58lshaiVa: true,
-JgJJaLaL7LuuRL_IO7c: true
}
}
您可能还想考虑将日期结构化为一个简单的列表,而不是树:
dates: {
20150203: {
-JgJJaLaL7LuuRL_IO7c : true,
-JgJfaOsyfZe_mZPTApA : true,
...
},
20150128 : {
-JgJJaLaL7kddEl_ddfE : true
},
20150127 : {
-JgJfadkdjEk_mZPTApA : true
},
}
虽然为日期建造一棵树很诱人,但我怀疑你会从中获得多少好处。上述结构更简单,允许更多种类的查询,例如"给我2015年第一季度的所有日期":ref.child('dates').startAt('20150101').endAt('20150331')
。