代码之家  ›  专栏  ›  技术社区  ›  Nathan Merrill

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

  •  0
  • Nathan Merrill  · 技术社区  · 7 年前

    我开始追踪生活中的许多变量(量化的自我)。我有很多输入源,我正在努力将它们全部粘贴到数据库中。我计划将这个数据库与R一起使用,询问有关我生活的任意问题(“哪条路线最快工作”,或者“什么食物影响我的情绪”,等等)

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

    “过程”的例子:

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

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

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

    然而,我觉得自己被困在两个对立的“理想”之间:

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

    我考虑过同时存储原始数据和计算数据。这让我感觉两种情况都很糟糕:我的一些表不是原始的,如果它们是错误的,需要完全重新计算,而其他表是原始的,但很难使用,并且有重复的数据。

    0 回复  |  直到 7 年前
        1
  •  0
  •   Daniel Long Daniel Roseman    7 年前

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

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

    如果是我,我会创建一个具有两个属性的情绪表:

    • 名称
    • Id(主键)

    这个表基本上是一个定义表。在这里,您可以添加特定于情绪的属性(例如描述)。

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

    在应用程序中输入情绪之前,请更新MoodHistory SET IsCurrent=0,其中IsCurrent=1,然后插入IsCurrent=1的新记录。这种结构是标准化的,通过IsCurrent列进行索引或分区(老实说,即使没有任何索引/分区),即使您的表变得相当大,您也应该能够超快速地查询当前的情绪。

    对于第二个用例,这不仅取决于您的计划使用情况,还取决于数据来自何处(尤其是对于路线)。我不确定你打算如何将地点分为“路线”,但如果你在评论中澄清,我很乐意补充我的答案。

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

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

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

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

    • 纬度
    • 经度
    • 名称

    加入这张关于经纬度的表格应该会告诉你在某个特定地点的时间,比如说“家”和“工作”