如何设计适当的Firebase / NoSQL数据结构

时间:2016-11-01 10:04:42

标签: ios swift firebase firebase-realtime-database

我是Firebase的新手并使用NoSQL数据库结构。我正在努力实现举重追踪器iOS应用程序的最终目标。

该应用程序将容纳不同的用户,每个用户将记录他们自己的锻炼,然后应该能够查看他们已经执行的锻炼的历史记录以及他们已经解除的权重,从而可以监控进度。

数据库将包含一个预定义练习列表,可以添加独特的练习,使其仅适用于该用户以及预定义列表。

用户将能够定义一个例程,该例程通过存储名称,创建日期,锻炼中的练习以及练习之间休息的默认计时器来创建。

然后,用户将执行一个训练程序,在那里他们将实际选择上面创建的程序并跟踪他们举起的重量以及多少组,例如:

Bench Press:
Set 1: 80kg x 8 reps
Set 2: 80kg x 8 reps
Set 3: 80kg x 6 reps
...

然而,在开始锻炼之前,用户可能并不总是创建例程,因此他们将从预定义练习列表中选择练习。

我的NoSQL数据库有以下结构,想知道我所做的是否正确,这是我第一次尝试设计问题模型,欢迎任何建议,以帮助改进和可能解释所以我可以离开并改进整体设计:

{
  "users": {
    "user unique identifier": {
      "name": "User Full Name",
      "email": "User Email",
      "profileImageUrl": "Profile Image Url",
      "routines": {
        "routine unique identifier": true
      },
      "workout routine":{
        "workout routine unique identifier": true
      }
    }
  },
  "exercises": {
    "exercise unique identifier": {
      "exercise_name": "exercise name",
      "body_part": "body part",
      "routines": {
        "routine unique identifier": true
      }
    }
  },
  "routines": {
    "routine unique identifier": {
      "routine_name": "routine name",
      "routine_create_date": "routine created date",
      "exercises":{
        "exercise unique identifier": true
      },
      "default timer": "timer duration"
    }
  },
  "workout routine": {
    "workout routine unique identifier": {
      "date": "workout routine start date",
      "start_time": "workout routine start time",
      "end_time": "workout routine end time",
      "duration": "start_time - end_time",
      "end_date": "workout routine end date",
      "routine unique identifier": {
        "exercise unique identifier": {
          "exercise name": "exercise name",
          "set n weight": "weight lifted in set n"
          "set n reps": "Reps performed for set n",
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

应该是一个数组,而不是一个对象

  • <德尔> users.uid.workoutroutine
  • <德尔> exercises.uid.routines
  • <德尔> routines.uid.exercieses

我建议你的workoutroutine.uid引用其他对象,而不是让它们成为另一个对象。

这样做的原因是您在转换对象时没有任何问题,使用当前结构,uid.routineId将具有不同的键(可能会出现转换错误。

您可以在Firebase的Structure Data文档

中详细了解最佳做法

修改

为混淆道歉,我实际上指的是使用类似于以下伪代码的定义密钥对结构

{users:
    [userid]:{
        ...
        workoutroutine:[{
            workoutroutineId:XXXX},
            ....
        ]
     }
}

这样,上述推理仍然有效,同时为您提供了避免任何投射错误的灵活性。而且,正如@ Frank-van-Puffelen所说,没有一个正确的设计,将取决于你的应用程序。将其视为改进它的建议。