2011-09-15 8 views
1

簡略化するには...ユーザーEAVデータの履歴を、特にアドレスを指している場所に入れたいのですが、冗長性を排除するのは難しいようです。EAVのアドレス履歴をデータベースに保存する方法を教えてください。

アドレスには独自のテーブルがあります。

ユーザは、usersテーブルと他のエンティティテーブルの標準データに加えて、奇妙なデータの負荷があります。この奇妙なユーザーデータをEAVテーブルに入れることを計画していました。このユーザEAVデータは、アドレステーブルに格納されたアドレスを指す複数のエントリを含むこともできます。

変更の履歴を記録します。

したがって、ユーザーのアドレスはそれが起こる必要があるように思えるものを変更したときです:

  • 新しいアドレスがアドレステーブルに追加されます。
  • 古いアドレス行を指す代わりに古いEAVエントリは、アドレステーブルの新しい行を指すように更新されます。多くの仕事のように見えるのではなく
  • EAV行への変更はEAV履歴テーブルに書き込まれます(トリガを使用します)

正直に言うと:

  • 万一古いですアドレステーブルのエントリは永遠に読み取り専用になりますか? (OK、私の推測ははい、倉庫に入れられている古いレコードをクリアしているが、ちょうどそうだと思う... icky)。
  • これらのアドレスエントリを再利用するにはどうすればよいですか? (おそらく、新しいユーザーの入力に一致する既存のエントリを提供することにより)

をすべてがちょうどEAVので、汚れたようで、ない;)

答えて

1

あなたは人の住所の履歴を追跡する場合は、EAV月"エレガントな"少しの解決策になります。 EAVではアドレスがフィールドに分割され、各フィールドが属性であることを意味していると仮定しています。したがって、誰かが動いても、同じ都市に滞在すると住所ラインは変わりますが、都市、州、およびZIP(おそらく)は同じままです。

人は常に移動します。私は統計を忘れていましたが、毎年16%または18%の人が移動しています。人々の住所の監査履歴を持つことはビジネス上の理由が多いことがあります。

アドレスの履歴を追跡している場合は、スナップショットベースの履歴テーブルを保持し、トリガーを使用してそのテーブルにデータを格納する方がよいでしょう。

ADDRESS_HISTORY 
    person_key int 
, change_date datetime 
, address_1 nvarchar(50) 
, address_2 nvarchar(50) null 
, city  nvarchar(30) 
, state  nvarchar(2) 
, zip   nvarchar(10) 
, primary key (person_key, change_date) 

もちろん、スキーマは独自のアドレス属性構造を反映する必要があります。

これは洗練された再利用はありませんが、このような再利用が必然的に伴うと思われる混乱を避けることができます。各アドレスの完全なスナップショットを保持するには少し余分なスペースを使用しますが、実際に履歴を使用する方がはるかに簡単です。

+0

EAVは、アドレスとしてよく理解されているもののために使用する最悪の構造です。 –

+0

申し訳ありませんが、おそらく多少の誤解(私は質問を少し明示的に調整しました)。アドレスはすでにテーブルにあります。そのアドレスインスタンスは奇妙なデータです(オプションで多少稀です)ので、その参照はEAVテーブルに格納されます。 のように: - ><ユーザーeavテーブル(単列参照)> - ><住所表> –

+0

申し訳ありませんが、最初はあなたに従っていませんでした。顧客に関連するEAVデータをその顧客に属する住所に関連付けている場合は、正しい経路にある場合とそうでない場合があります。 EAVデータがどのようにアドレスに依存するかによって異なります。それは硬い依存か柔らかいものか?あなたが私に従うならば、それは「顧客の請求先住所」または「実際に私たちがその請求書を送った場所」を指していますか?真に "厄介な"部分は、古いデータをパージします。参照整合性を維持しようとするとかなり醜いです。それ以外の場合は、おそらく正しい方向に向いています。 –

関連する問題