我正在创建一个数据库来存储很多事件。它们会有很多,它们每个都有一个精确到秒的相关时间。例如,像这样:
Event
-----
Timestamp
ActionType (FK)
Source (FK)
Target (FK)
行动、来源和目标都在 6NF 中。我想保持Event
表格标准化,但我能想到的所有方法都有问题。为了明确我对数据的期望,绝大多数(99.9%)事件将是唯一的,仅具有上述四个字段(因此我可以将整行用作 PK),但不能忽略少数例外.
使用代理键:如果我使用四字节整数,这是可能的,但似乎只是无缘无故地夸大表格。此外,我担心长时间使用数据库并耗尽密钥空间。
将计数列添加到事件:由于我希望计数较小,因此我可以使用较小的数据类型,这对数据库大小的影响较小,但在插入之前需要更新插入或汇集数据库外部的数据。其中任何一个都会增加复杂性并影响我对数据库软件的选择(我正在考虑使用 Postgres,它会进行 upserts,但并不乐意。)
将事件分成小组:例如,同一秒内的所有事件都可能是 a 的一部分,
Bundle
其中可能有一个代理键用于组,另一个用于其中的每个事件。这为数据库增加了另一层抽象和大小。如果其他重复的事件变得普遍,那将是一个好主意,但否则似乎有点矫枉过正。
虽然所有这些都是可行的,但它们感觉不适合我的数据。我正在考虑只做一个典型的雪花而不是在主表上强制执行唯一性约束,但是在阅读了这样Event
的PerformanceDBA 答案后,我认为也许有更好的方法。
那么,保持具有少量重复事件的时间序列数据归一化的正确方法是什么?
编辑:澄清 - 数据来源是日志,主要是平面文件,但也有一些在各种数据库中。该数据库的一个目标是统一它们。没有一个来源的时间分辨率比第二个更精确。这些数据将用于诸如“有多少不同的来源在时间间隔内对目标执行操作?”之类的问题。其中间隔不会少于一个小时。