0

多くのイベントを保存するデータベースを作成しています。それらはたくさんあり、それぞれに秒単位の正確な時間が関連付けられています。例として、次のようなものがあります。

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

アクション、ソース、およびターゲットはすべて 6NF にあります。テーブルを正規化したままにしたいのですEventが、考えられるすべてのアプローチには問題があります。データに対する私の期待を明確にするために、大部分 (99.9%) のイベントは上記の 4 つのフィールドだけで一意になります (したがって、行全体を PK として使用できます)。ただし、いくつかの例外は無視できません。 .

  1. 代理キーを使用する: 4 バイトの整数を使用する場合、これは可能ですが、理由もなくテーブルを膨らませているように見えます。さらに、データベースを長期間使用してキースペースを使い果たすことも懸念しています。

  2. カウント列をイベントに追加:カウントが小さいと予想されるため、より小さいデータ型を使用できます。これにより、データベース サイズへの影響が小さくなりますが、挿入前にアップサートまたはデータベース外でデータをプールする必要があります。どちらも複雑さが増し、データベース ソフトウェアの選択に影響を与えます (アップサートを行う Postgres を使用することを考えていましたが、喜んでではありませんでした)。

  3. イベントを小さなグループに分割する:たとえば、同じ秒内のすべてのイベントはBundle、グループの代理キーとその中の各イベントの代理キーを持つことができる の一部である可能性があります。これにより、抽象化とサイズの別のレイヤーがデータベースに追加されます。そうでなければ重複したイベントが一般的になれば良い考えですが、それ以外の場合はやり過ぎのように思えます。

これらはすべて実行可能ですが、私のデータにはあまり適していないように感じます。メインテーブルに一意性制約を適用せずに典型的なSnowflakeを実行することを考えていましたが、このEventようなPerformanceDBAの回答を読んだ後、もっと良い方法があるのではないかと思いました.

では、正規化された少数の繰り返しイベントで時系列データを保持する正しい方法は何ですか?

編集:明確化 - データのソースはログで、ほとんどがフラット ファイルですが、いくつかはさまざまなデータベースにあります。このデータベースの 1 つの目標は、それらを統合することです。秒単位よりも正確な時間分解能を持つソースはありません。このデータは、「一定間隔でターゲットに対してアクションを実行した異なるソースの数は?」などの質問に使用されます。ここで、Interval は 1 時間以上です。

4

1 に答える 1

4

最も簡単な答えは

  • より高い精度でタイムスタンプを保存する、または
  • タイムスタンプを秒に保存し、重複キーのために INSERT が失敗した場合は (少し後のタイムスタンプで) 再試行します。

あなたが言及した3つのアイデアはどれも、正規化とは何の関係もありません。これらは、何を保存するかに関する決定です。概念レベルでは、何を保存するかを決定した後に正規化します。行が何を意味するか (つまり、各列が何を意味するか) は重要です。これらの意味は、テーブルの述語を構成します。述語を使用すると、古い真の事実から新しい真の事実を導き出すことができます。

代理キーとして整数を使用すると、キー スペースを使い果たす可能性は低くなります。ただし、まだ自然キーを宣言する必要があるため、この場合のサロゲートは役に立ちません。

物事を数えるのが理にかなっていれば、「count」列を追加することは理にかなっています。それ以外の場合はそうではありません。これらの 2 つの例を見てください。

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

ここでの意味の違いは何ですか?「タイムスタンプ」の意味は特に重要です。正規化はセマンティクスに基づいています。何をする必要があるかは、列の名前ではなく、データの意味によって異なります。

イベントのグループがシステムで意味を持つ場合、イベントを小さなグループに分割することは理にかなっています (「カウント」列を追加するのと同じように)。

于 2013-02-19T12:29:59.840 に答える