【问题标题】:Normalizing Time Series Data标准化时间序列数据
【发布时间】:2013-02-03 22:52:35
【问题描述】:

我正在创建一个数据库来存储大量事件。它们会有很多,它们每个都有一个精确到秒的相关时间。例如,像这样:

Event
-----
Timestamp
ActionType (FK)
Source (FK)
Target (FK)

动作、来源和目标都在 6NF 中。我想保持Event 表标准化,但我能想到的所有方法都有问题。为了明确我对数据的期望,绝大多数 (99.9%) 事件将是唯一的,仅具有上述四个字段(因此我可以将整行用作 PK),但不能忽略少数例外.

  1. 使用代理键:如果我使用四字节整数,这是可能的,但似乎只是无缘无故地夸大表格。此外,我担心长时间使用数据库并耗尽密钥空间。

  2. 将计数列添加到事件:由于我希望计数较小,因此我可以使用较小的数据类型,这对数据库大小的影响较小,但需要更新插入或池化插入前数据库外的数据。其中任何一个都会增加复杂性并影响我对数据库软件的选择(我正在考虑使用 Postgres,它会进行 upserts,但并不乐意。)

  3. 将事件分成小组:例如,同一秒内的所有事件都可能是 Bundle 的一部分,Bundle 可以有一个代理键用于组,另一个用于每个事件在里面。这为数据库增加了另一层抽象和大小。如果其他方面重复的事件变得普遍,那将是一个好主意,但在其他方面似乎有点矫枉过正。

虽然所有这些都是可行的,但它们感觉不适合我的数据。我正在考虑只做一个典型的雪花而不是对主要的 Event 表执行唯一性约束,但是在阅读了像 this one 这样的 PerformanceDBA 答案后,我想也许有更好的方法。

那么,保持具有少量重复事件的时间序列数据归一化的正确方法是什么?

编辑:澄清 - 数据的来源是日志,主要是平面文件,但也有一些在各种数据库中。该数据库的一个目标是统一它们。没有一个来源的时间分辨率比第二个更精确。这些数据将用于诸如“有多少不同的来源在时间间隔内对目标执行操作?”之类的问题。其中间隔不会少于一个小时。

【问题讨论】:

  • 我厌倦了 SO 的政治并离开了。 4年后,我回来了。答案是不正确的。如果您想对这个问题有更好的回答,请用我的句柄对此发表评论。
  • @PerformanceDBA 不幸的是,我以某种方式错过了您的评论。我不再在这个问题中描述的系统上工作,看起来你已经离开了几年,但如果你回来并想解释正确的方法,我会很高兴阅读它。
  • @PerformanceDBA 你还可以给我们一个更好的答案吗?

标签: relational-database normalization time-series snowflake-schema 6nf


【解决方案1】:

最简单的答案似乎是

  • 以更高的精度存储时间戳,或者
  • 将时间戳存储到第二个,如果由于重复键而导致 INSERT 失败,则重试(使用稍晚的时间戳)。

您提到的三个想法都与规范化无关。这些是关于存储什么的决定;在概念层面,您在决定存储什么之后进行规范化。行的含义(因此,每列的含义)很重要;这些含义构成了表的谓词。谓词让您可以从旧的真实事实中推导出新的真实事实。

使用整数作为代理键,您不太可能耗尽键空间。但是您仍然必须声明自然键,因此在这种情况下,代理对您没有任何用处。

如果对事物进行计数有意义,则添加“计数”列是有意义的;否则它不会。看看这两个例子。

Timestamp            ActionType  Source  Target
--
2013-02-02 08:00:01  Wibble      SysA    SysB
2013-02-02 08:00:02  Wibble      SysA    SysB

Timestamp            ActionType  Source  Target  Count
--
2013-02-02 08:00:01  Wibble      SysA    SysB    2

这里有什么区别含义? “时间戳”的含义尤为重要。规范化是基于语义的;您需要做什么取决于数据的含义,而不是列的名称。

如果事件组在您的系统中有意义,

将事件分成小组可能有意义(例如添加“计数”列可能有意义)。

【讨论】:

  • 你说得对,规范化并不是最好的词。我编辑了问题以提供有关我的来源和预期用途的详细信息 - 最重要的是计数。虽然事件组确实有意义,但我无法在插入时确定分组。
  • 存储计数。制作主键 {Timestamp, ActionType, Source, Target}。
猜你喜欢
  • 2013-10-15
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2020-08-11
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多