【发布时间】:2013-02-03 22:52:35
【问题描述】:
我正在创建一个数据库来存储大量事件。它们会有很多,它们每个都有一个精确到秒的相关时间。例如,像这样:
Event
-----
Timestamp
ActionType (FK)
Source (FK)
Target (FK)
动作、来源和目标都在 6NF 中。我想保持Event 表标准化,但我能想到的所有方法都有问题。为了明确我对数据的期望,绝大多数 (99.9%) 事件将是唯一的,仅具有上述四个字段(因此我可以将整行用作 PK),但不能忽略少数例外.
使用代理键:如果我使用四字节整数,这是可能的,但似乎只是无缘无故地夸大表格。此外,我担心长时间使用数据库并耗尽密钥空间。
将计数列添加到事件:由于我希望计数较小,因此我可以使用较小的数据类型,这对数据库大小的影响较小,但需要更新插入或池化插入前数据库外的数据。其中任何一个都会增加复杂性并影响我对数据库软件的选择(我正在考虑使用 Postgres,它会进行 upserts,但并不乐意。)
将事件分成小组:例如,同一秒内的所有事件都可能是
Bundle的一部分,Bundle可以有一个代理键用于组,另一个用于每个事件在里面。这为数据库增加了另一层抽象和大小。如果其他方面重复的事件变得普遍,那将是一个好主意,但在其他方面似乎有点矫枉过正。
虽然所有这些都是可行的,但它们感觉不适合我的数据。我正在考虑只做一个典型的雪花而不是对主要的 Event 表执行唯一性约束,但是在阅读了像 this one 这样的 PerformanceDBA 答案后,我想也许有更好的方法。
那么,保持具有少量重复事件的时间序列数据归一化的正确方法是什么?
编辑:澄清 - 数据的来源是日志,主要是平面文件,但也有一些在各种数据库中。该数据库的一个目标是统一它们。没有一个来源的时间分辨率比第二个更精确。这些数据将用于诸如“有多少不同的来源在时间间隔内对目标执行操作?”之类的问题。其中间隔不会少于一个小时。
【问题讨论】:
-
我厌倦了 SO 的政治并离开了。 4年后,我回来了。答案是不正确的。如果您想对这个问题有更好的回答,请用我的句柄对此发表评论。
-
@PerformanceDBA 不幸的是,我以某种方式错过了您的评论。我不再在这个问题中描述的系统上工作,看起来你已经离开了几年,但如果你回来并想解释正确的方法,我会很高兴阅读它。
-
@PerformanceDBA 你还可以给我们一个更好的答案吗?
标签: relational-database normalization time-series snowflake-schema 6nf