【问题标题】:Firebase data: denormilization and duplicationFirebase 数据:去规范化和复制
【发布时间】:2018-02-10 15:41:25
【问题描述】:

我很难让我的数据适合 Firebase,需要一些指导。我对关系数据库充满信心,发现我只是将这种思维方式复制到 firebase。

我正在创建一个健身应用。我的结构如下:练习、锻炼和计划。

练习很简单,它是一个简单运动的名称、描述和照片,例如深蹲或卧推。

exercise
--e1
  --name:"Squats"
  --description: "..."
--e2
  --name:"Benchpress"
  --description: "..."

然后我有一个锻炼列表。锻炼是一组以特殊顺序执行的练习,具有特定的重复次数和组数。一项练习可用于具有不同参数(次数、组数、休息)的多项锻炼

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 中。这不是正确的方法。我只是有麻烦我应该如何以平坦的方式管理这些数据。例如重复可以吗?

目前我有一个非常昂贵的阅读(不是最佳实践),因为我查询程序位置,映射它,查询锻炼,映射它,查询练习。很快就变得很麻烦了。

非常感谢任何想法和帮助。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database denormalization nosql


    【解决方案1】:

    您可以查看normalizr 库。它最初旨在帮助使用 REST API 和 redux:在非关系环境中会出现同样的重复问题。

    基本上我要做的是将每种不同类型的实体作为地图存储在 firebase 中。

    const tree = {
        exercises: { 1: { name: ... }, ... },
        workouts: { 1: ... },
        programs: { 1: ... },
    }
    

    然后你可以让你的每个组件订阅它们对应的实体。有了 Promise 和/或流,这非常简单。

    您的每个关系都只是数组中的一个 id,当您想在 db 中读取/写入时,您可以使用 normalizr 库进行规范化/反规范化。

    请注意,使用此模式,您可以轻松地使用 firebase update api 使用以下查询一次更新多个实体:

    const updateQuery = {
        "workouts/id": ...,
        "exercises/id": ...,
        "programs/id": ...,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 2016-12-28
      • 2018-07-08
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      相关资源
      最近更新 更多