数据库中的重复数据与计算数据

时间:2019-02-26 16:32:50

标签: database database-design relational-database database-normalization

我开始追踪生活中的许多变量(QuantifiedSelf)。我有很多输入源,我正在努力将其全部粘贴到数据库中。我打算将此数据库与R一起使用,以询问有关我的生活的任意问题(“哪种路线最快”,或“哪些食物会影响我的心情”等)

我要在此处回答的关键问题是“在将输入内容粘贴到数据库之前是否要对其进行处理?”

“过程”的示例:

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

    • 如果我处理数据,则会丢失原始数据。也许我改变了心情以使用另一个名字。如果我在规范化的数据库中执行此操作,那么我会丢失以下信息:更改之前,我的心情是“ oldName”
    • 如果我不处理数据,则说明数据重复
  2. 另一个输入是GPS位置列表(纬度,经度)。但是,我大部分时间都花在一个地方或开车上。我是否要处理这些数据以创建两个表“ Locations”和“ Routes”?

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

但是,我感觉自己陷入了两个相对的“理想”之间:

  1. 如果我处理数据,则没有原始数据。
  2. 如果我不处理数据,则说明我有重复且难以使用的数据。

我考虑过同时存储原始数据和计算结果。感觉就像两全其美:我的某些表不是原始表,如果表不对,则需要完全重新计算,而其他表是原始表,但难以使用且具有重复数据。

1 个答案:

答案 0 :(得分:0)

对于评论中的某些要点,我认为您存储的数据取决于应用程序的需求,并且我将通过用例的角度来处理每组数据。

在第一个用例中,情绪数据听起来很有价值,因为随着时间的推移,可以看到这些数据(例如,在过去的一个月中,我的情绪一直在改善),并且可以提高个人事件(例如,在日期x,我吃了一个汉堡包,这在日期x之后的随后的情绪输入中如何影响我的情绪)。

如果是我,我将创建一个具有两个属性的Mood表:

  • 名称
  • 编号(pk)

此表实际上将用作定义表。在这里,您可以添加特定于心情的属性(例如描述)。

然后我将创建具有以下属性的MoodHistory表: -时间戳 -MoodId -IsCurrent(布尔值)

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

对于第二个用例,这不仅取决于计划的使用情况,而且还取决于数据来自何处(尤其是对于路由)。我不确定您是如何计划将位置分组为“路线”的,但是如果您在注释中进行了说明,我很乐意添加到我的答案中。

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

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

  • 时间戳
  • 纬度
  • 经度
  • 当前 通过以与MoodHistory数据类似的方式处理IsCurrent数据,可以很容易地抓住上一个输入的位置。如果要避免重复,也可以进行一些其他处理。本质上,在更新IsCurrent之前,查询IsCurrent = 1的行。然后在插入新记录之前,将记录的纬度和经度与新的纬度和经度进行比较。如果有任何更改,请继续插入,否则,无需插入新记录。

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

  • 纬度
  • 经度
  • 名称

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