3

現在、さまざまなルックアップテーブル(性別、州など)を作成して、静的データ(性別、結婚状況、州など)をDBに保存しています。ほぼ10個のルックアップテーブルがあります。これらのテーブルはすべて、トランザクションテーブルへのFKです-user(すべてのユーザーの人口統計情報を格納します)。これらの静的データの一部は、他のトランザクションテーブルでも使用されます。これで、ユーザー情報を取得するときに、通常、これらのテーブルに結合を設定して、関連するテキストを取得します。確かに、これらの多くの結合はパフォーマンスの問題を引き起こす可能性があります。また、MSDNによると、選択クエリに5つを超える結合を含めることはできません。これを回避するために、すべての静的データをxmlファイルに移動し、それらから読み取ることができます。確かに、xmlデータをキャッシュして、一度だけ読み取られるようにします。私が知りたいのは、それは良いアプローチです。以下のトレードオフを見ることができます-

  1. 参照整合性を維持できません。
  2. 負荷分散を使用している間、すべてのサーバーにxmlファイルが必要です。

これらはローカライズする必要があるため、値を列挙型にしたくありません。xmlに保持することの唯一の利点は、DBへのオーバーヘッドを削減することです(10個のテーブルを作成します)。DBに保存されている静的データを非常にうまくキャッシュできます。では、データをxmlに保存することは、DBよりも良い選択であることを知りたいですか?

PS:アプリケーションはWebアプリであり、.net3.5で開発されています。

4

1 に答える 1

0

解決策 1

合成キーを使用しないでください。つまり、MaritalStatus テーブルには列 msId と StatusText (例: 1、"Married") があり、msId をキーにしています。データ テーブルは msId フィールドを保持し、常に MaritalStatus テーブルに結合してテキストを取得する必要があります。代わりに、有用なテキストを保存し、これを一意のキーとして設定します。この場合、テーブルには単一のテキスト列 (「既婚」、「独身」など) のみが保持されます。次に、データ テーブルには MStatus テキスト フィールドがあり、MaritalStatus テーブルへの外部キーがあります。ただし、データ テーブルを読み取ると、ステータス テキストが既にあるため、参照テーブルに結合する必要はありません。制約により、データの整合性が維持されます。もちろん、参照テーブルに複数の列を格納する必要がある場合、これは機能しませんが、可能であれば合成キーを避けることをお勧めします.

解決策 2

単一の ReferenceData テーブルを用意します。Type、Id、および Value の列を作成します。「MaritalStatus」など、個別のテーブル名の代わりに Type フィールドを使用します。Type 列のリテラル値を指定して参照テーブルに結合し、Id または Value で照合します。これはおそらく FK 制約でも機能するはずです (ただし、別のデータベース ソフトウェアでチェックする必要があります)。

于 2013-08-21T12:45:32.247 に答える