什么是用于跟踪Firebase中每日日志记录的适当数据模型?

时间:2018-06-13 18:07:48

标签: firebase firebase-realtime-database google-cloud-firestore data-modeling

我正在尝试为健身追踪应用决定相对平坦的数据模型。对于给定的一天,用户将能够输入1)他们的锻炼时间,2)吃掉的零食量,以及3)针对每月挑战的二元切换。电子表格表示将是这样的:

fitness log

将会有几个团队,每个团队有五到六人。用户可以在主仪表板上查看累积的团队分数,并查看其团队仪表板上输入点的完整细分(基本上是此电子表格的视图或类似内容)。

可以添加新的团队成员,并且每个月都会有一个现有用户加入新团队。

显然我需要一个"用户"表。我不确定存储日志的最佳方法。是否会有一个主要的日期"桌子或者是一个"团队"表?或两者兼而有之?

团队表

{
  "team1": {
    "entry1": {
      "user": "user1",
      "exercise": 1,
      "snacks": 2,
      "outside": false,
      "date": "6/1"
    },
    "entry2": {
      "user": "user2",
      "exercise": 4,
      "snacks": 0,
      "outside": false,
      "date": "6/1"
    },
    "entry3": {
      "user": "user2",
      "exercise": 1.5,
      "snacks": 1,
      "outside": true,
      "date": "6/3"
    },
    "entry4": {
      "user": "user1",
      "exercise": 1,
      "snacks": 1,
      "outside": true,
      "date": "6/2"
    }
  }
}

日期表

{
  "6-1-18": {
    "entry1": {
      "user": "user1",
      "exercise": 1,
      "snacks": 2,
      "outside": false,
    },
    "entry2": {
      "user": "user2",
      "exercise": 4,
      "snacks": 0,
      "outside": false,
    },
    "entry3": {
      "user": "user3",
      "exercise": 1.5,
      "snacks": 1,
      "outside": true,
    },
    "entry4": {
      "user": "user4",
      "exercise": 1,
      "snacks": 1,
      "outside": true,
    }
  }
}

还是完全不同的东西?

1 个答案:

答案 0 :(得分:1)

如果您不确定要运行的查询,那么最好的方法,也可以在#No; NoSQL" DB,正在使用标准化数据模型,您可以从ER或相应的UML类图中自动获取。

在类图中,您将有三个类:TeamUserUserFitnessDayUserTeam之间会存在多对一关联,这会在team类或相应的外键列中转换为User引用属性(或ID引用属性)team_idUserUserFitnessDay之间也存在不可分割的组合,因此UserFitnessDay的实例是特定User的生命周期依赖组件。在这样的组合中,对应于组件类(UserFitnessDay)的表具有复合主键(user_id, date),其中一个属性(user_id)是引用对应于该表的表的外键。复合类(User)。

我认为您可以使用以下数据模型:

Team( id, name)
User( id, name, team_id FOREIGN KEY REFERENCES Team)
UserFitnessDay( 
  user_id FOREIGN KEY REFERENCES User CASCADE DELETE, 
  date, 
  nmrOfExercises, 
  nmrOfSnacks, 
  hasBeenOutside,
  PRIMARY KEY( user_id, date)
)

即使Firebase不支持外键,您也需要在应用代码中处理它们的逻辑。因此,使用类似RDB的架构会有所帮助。