我很难为firebase找到我的数据,需要一些指导。我对关系数据库充满信心,发现我只是将这种思维方式复制到Firebase。
我正在创建一个健身应用。我拥有的结构如下:练习,锻炼和程序。
练习非常简单,这是一个名称,描述和简单运动的照片,例如下蹲或卧铺。
exercise
--e1
--name:"Squats"
--description: "..."
--e2
--name:"Benchpress"
--description: "..."
然后我有锻炼清单。锻炼是一组特殊的代表和集合的练习。一项练习可以在许多具有不同参数(rep,set,retth)
的锻炼中使用。workouts
--w1
--name:"Easy workout"
--description: "Design for beginners"
--exercises:
--we1:
--exercise: e1
--reps: 12
--rest: 60
--order: 1
--we2
--exercise: e2
--reps:6
--rest: 30
--order: 2
--w2
--name: "Hard exercise"
...
所以我有W1,一种锻炼的锻炼1:首先您进行12次练习1,然后休息60秒,然后进行6次练习2,休息30秒。
最后,我有一个程序/计划。一个程序包括您可以遵循的多次锻炼。例如,您的程序可能包括在星期一,星期三和周五应该的3次锻炼。
programs
--p1
--name: "The Stack Overflow Fitness Plan"
--description: "I am a fancy text"
--workouts:
--w1: true
--w2: true
因此,如上所述,我只是在Firebase中添加关系数据。这不是正确的方法。我只是遇到麻烦,我应该如何以平坦的方式求解这些数据。重复是可以吗?
目前,我有一个非常昂贵的阅读(不是最好的练习),因为我查询程序位置,映射,查询锻炼,映射,查询练习。它变得非常繁琐。
虽然和帮助。
您可以查看normalizr
库。它最初旨在帮助使用REST API和REDUX:在非关系环境中复制的相同问题。
基本上我要做的是将每种不同种类的实体存储为firebase中的地图。
const tree = {
exercises: { 1: { name: ... }, ... },
workouts: { 1: ... },
programs: { 1: ... },
}
然后,您可以让每个组件对其相应的实体进行订阅。有了承诺和/或流,这是非常直接的。
您的每个关系只是数组中的一个ID,您可以在要在DB中读取/写入时使用normolizr库来归一化/变性。
请注意,使用此模式,您可以轻松地使用Firebase update
API立即使用查询来立即更新多个实体,例如:
const updateQuery = {
"workouts/id": ...,
"exercises/id": ...,
"programs/id": ...,
}