我正试图决定为下面的场景构造数据的最佳方式。我有10000只羊在一个有50个相互连接的田地的农场里。我跟踪每一只羊,当他们进入和离开田野。我希望能够:
我读过文档关于数据去规范化的文章,我很感激我可以使用查询等来做任何事情。
我的问题是:是否应该将输入/退出数据复制到这样的绵羊和字段节点?:
{
sightings: {
uniqueSheepId: {
FirebaseAutoId: {
type: enter
fieldId: uniqueFieldId
timestamp: xxxxxxxx.xxxxx
}
}
}
}和
{
sightings: {
uniqueFieldId: {
FirebaseAutoId: {
type: enter
sheepId: uniqueSheepId
timestamp: xxxxxxxx.xxxxx
}
}
}
}这似乎是一个很好的方法,以获得一个实时快照多少羊在任何给定的领域。它也使我们可以很容易地看到羊现在在哪里,它在哪里,没有做任何查询。显然,数据集的大小将比我使用查询时的两倍大,但是获取数据的简单性是否超过了存储数据的成本?
我已经看到(并理解)聊天室/成员的例子,但我认为我想从羊和田野的角度回顾分析会员/使用情况的愿望使我的问题与这些答案略有不同。任何建议都会很好。
发布于 2016-07-25 12:56:25
您当前的数据结构就足够了:
sightings: {
uniqueSheepId: {
FirebaseAutoId: {
type: enter
fieldId: uniqueFieldId
timestamp: xxxxxxxx.xxxxx
}
}
}你不需要重复。您可以为每个需求创建一个查询。
但是,我已经准备好了很多次,在Firebase中创建更多平坦的树要比创建更少的深树要好。下面推荐的结构会更好一些查询而不是其他查询,但是我相信总体--它会更好,并允许在将来添加fields和sheep的其他属性。
因此,为了限制冗余数据,我将设置三种不同的树,sheep、fields和sightings。
sheep: {
uniqueSheepId: {
currentField: uniqueFieldId,
sightings: {
FirebaseAutoId: uniqueSightingsId,
...
}
}
}fields: {
uniqueFieldId: {
numberOfSheep: number,
sightings: {
FirebaseAutoId: uniqueSightingsId,
...
}
}
}sightings: {
FirebaseAutoId: {
type: enter,
sheepId: uniqueSheepId,
fieldId: uniqueFieldId,
timestamp: xxxxxxxx.xxxxx
}
}回顾性分析每只羊在特定时间内的活动情况
您可以查询羊的运动:sheep/uniqueSheepId/sightings
我还想分析每个领域的使用情况。
您可以查询该字段的使用:fields/uniqueFieldId/sightings
立即知道任何给定的羊目前在哪个领域。
您可以查询字段中的任何给定绵羊:sheep/uniqueSheepId/currentField
立刻知道哪只羊在一个给定的田地里。
在JavaScript中,您可以这样查询:
var ref = firebase.database().ref("sheep").orderByChild("currentField").equalTo(uniqueFieldId);在任何受Firebase支持的语言中,都可以执行等效的操作。
所有这些都假设您正在实时地正确地更新和推送数据库。
https://stackoverflow.com/questions/38564309
复制相似问题