1

特定のイベントグループへのユーザーサブスクリプションを持つWebアプリを開発しています。例:ユーザーがブロブにコメントを作成し、このブログを購読しているすべてのユーザーのリストにこのイベントが含まれている必要があります。

現在、このデータを保存するためのデータモデルを探しています。

すべてのイベントを1つのテーブルに保存することは、使いやすさの観点からは良い考えのようです。

  • オブジェクト(例:コメント参照)
  • サブスクライブ可能なオブジェクト(例:ブログ参照)
  • イベントを生成したユーザー
  • イベントタイプ(更新、作成など)

特定のユーザーのサブスクリプションイベントは、ユーザーサブスクリプションによってイベントをフィルタリングするSQLクエリによって収集される場合があります。

このデータモデルの問題は、サブスクライブ可能なオブジェクトが「継承」を持っている可能性があることです。例:ユーザーは、ブログまたはブログ内の特定の投稿へのサブスクリプションを持っている場合があります。つまり、ブログのサブスクリプションはサブスクリプション後の拡張であり、このデータモデルはこの動作を反映していません。この場合、ブログ用と投稿用の2つのイベントを生成する必要があります。

すべてのイベントを1つのテーブルにまとめるか、それらをいくつかの方法で異なるテーブルに分割することをお勧めしますか?とにかく、イベントテーブルには膨大な量のデータが含まれます。イベントログを整理するためのより良いアイデアはありますか?

4

1 に答える 1

1

サブクラスを 1 つのテーブルに、サブクラスを別のテーブルに配置することはよくある質問です。

「良いアイデア」の答えはありません。どちらも良いアイデアです。

1 つの問題は、それらをどのように照会するかです。

すべての個別のイベント サブタイプを結合することはめったになく、重複する機能がほとんどない場合は、個別のテーブルがうまく機能する可能性があります。

いくつかの異なるイベント サブタイプをまとめるユニオン スタイルのクエリを頻繁に実行する場合、または重複する機能が多数ある場合は、1 つのテーブルでうまくいく可能性があります。

もう 1 つの問題は、ポリモーフィズムの 1 つです。

すべてのイベント サブタイプが適切にポリモーフィックである場合、アプリケーション (およびデータベース) はイベント サブタイプの混合コレクションを処理します。これにより、単一のテーブルが表示されます。

イベントのサブタイプがすべて大きく異なり、ポリモーフィックに使用できない場合は、別のテーブルに配置する必要があります。

結果

1 つのテーブルにすべてのサブタイプがある場合、すべてのサブタイプに共通ではない属性には NULLABLE 列を使用する必要があります。行が表すサブタイプを示す列も必要です。

単一のテーブルに複数のサブタイプを配置する場合、行がどのサブタイプであるべきかを示す識別子列が必要です。

サブタイプを別々の表に入れると、2 つの計画があります。

  • すべての表で共通の要素を繰り返します。共通点がほとんどない場合にこれを行います。

  • サブタイプ テーブルをスーパータイプ テーブルに結合し、共通要素を 1 つのテーブルに配置します。ほとんどすべてが共通の場合にこれを行います。

于 2009-10-15T10:28:24.430 に答える