火箱数据:非正式化和复制



我很难为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": ...,
}

最新更新