首页 > 解决方案 > 重复数据与数据库中的计算数据

问题描述

我开始跟踪我生活中的许多变量(QuantifiedSelf)。我有很多输入源,我正在努力将它们全部放入数据库中。我计划使用这个数据库和 R 来询问关于我生活的任意问题(“哪些路线工作最快”,或“哪些食物会影响我的心情”等)

我在这里试图回答的关键问题是“我是否在将输入粘贴到数据库之前对其进行处理?”

“过程”的例子:

  1. 我的一些输入是情绪列表(每天一个)。截至目前,只有 5 种可用的心情(评级在 -2 和 2 之间的名称)。我是否要规范化这些数据并创建两个表:Mood 表(包含 5 个项目)和 DailyMood 表?

    • 如果我处理数据,那么我会丢失原始数据。也许我改变了心情,换了个名字。如果我在规范化的数据库中执行此操作,那么我会丢失在更改之前我有一种情绪“oldName”的信息
    • 如果我不处理数据,那么我有数据重复
  2. 另一个输入是 GPS 位置列表(纬度、经度)。然而,我一天中的大部分时间都在一个地方度过,或者花在开车上。我是否处理这些数据以创建两个表“位置”和“路线”?

    • 如果我不处理数据,那么我有一大堆重复的位置(在不同的时间戳),很难查询并从中获取好的数据。
    • 如果我处理数据,那么我会丢失原始数据。我最终得到了一组易于查询的位置和路线,但如果这些位置或路线错误,我将不得不重新下载输入源并重建数据库。

然而,我觉得我被困在两个相反的“理想”之间:

  1. 如果我处理数据,那么我没有原始数据。
  2. 如果我不处理数据,那么我就有重复的、难以使用的数据。

我考虑过存储原始数据和计算数据。这感觉就像我正在两全其美:我的一些表不是原始的,如果它们是错误的,则需要完全重新计算,而其他表是原始的,但很难使用并且有重复的数据。

标签: databasedatabase-designrelational-databasedatabase-normalization

解决方案


对于评论中的某些观点,我认为您存储哪些数据取决于您的应用程序的需求,我将通过用例镜头处理每组数据。

对于第一个用例,情绪数据,听起来随着时间的推移能够看到这些数据(即似乎在过去一个月里,我的情绪一直在改善)以及提取个别事件(即在日期 x,我吃了一个汉堡包,这对我在日期 x 之后的后续情绪输入中的情绪有何影响)。

如果是我,我会创建一个 Mood 表,它有两个属性:

  • 姓名
  • 标识 (pk)

该表本质上将用作定义表。在这里,您可以添加特定于情绪的属性(例如描述)。

然后,我将创建一个具有以下属性的 MoodHistory 表: - Timestamp - MoodId - IsCurrent (Boolean)

在您的应用程序中输入情绪之前,UPDATE MoodHistory SET IsCurrent = 0 WHERE IsCurrent = 1,然后使用 IsCurrent = 1 插入您的新记录。此结构通过 IsCurrent 列的索引或分区进行规范化(老实说,即使没有任何索引/分区),即使您的表变得非常大,您也应该始终能够超级快速地查询当前心情。

对于您的第二个用例,这不仅取决于您的计划使用情况,还取决于数据的来源(尤其是路线)。我不确定您计划如何将位置分组为“路线”,但如果您在评论中澄清,我很乐意添加到我的答案中。

但是,对于位置,我假设您在某个设定的时间间隔内拍摄位置快照。我将创建一个与 MoodHistory 表结构类似的 LocationSnapshot 表:

然后,我将创建一个具有以下属性的 MoodHistory 表:

  • 时间戳
  • 纬度
  • 经度
  • IsCurrent 通过以与 MoodHistory 数据类似的方式处理 IsCurrent 数据,获取最后输入的位置应该非常简单。如果你想避免重复,你也可以做一些额外的处理。本质上,在更新 IsCurrent 之前,查询 IsCurrent = 1 的行。然后在插入新记录之前将该记录纬度和经度与您的新纬度和经度进行比较。如果有变化,继续插入,否则,不需要插入新记录。

您还可以创建一个已知位置表,例如 KnownLocation:

  • 纬度
  • 经度
  • 姓名

在纬度和经度上加入此表应该会告诉您您何时在特定位置花费时间,例如“家”与“工作”


推荐阅读