例を考えてみましょう。 TTroubleticketテーブルに基づいた最も単純な苦情システムがあるとします。
Troubleticketテーブル | |
fkey | 申請番号 |
fcontact | 申請者の連絡先 |
ftext | アプリケーションテキスト |
連絡先情報とアプリケーションテキストに加えて、アプリケーションステータスとその変更の全履歴を保存する必要があります。 この決定はすぐに頼りになります:変更の全履歴とともに別のテーブルにステータスを保存します。
TStatusHistoryテーブル | |
fkey | |
f_troubleticket | TTroubleticketの記録へのリンク |
価値 | 価値 |
fsdate | 値割当日 |
次に、現在の値を取得するには、次のクエリを実行する必要があります。
SET @f_troubleticket = 10; 選択 tt.fkey、tt.fcontact、tt.ftext、 (選択 価値 から TStatusHistory どこ f_troubleticket = tt.fkey ORDER BY fsdate DESC 制限0.1 )AS fstatus から TTroubleticket AS tt どこ fkey = @f_troubleticket LIMIT 0、1
すべてが折りたたまれ、すべてが正常であり、それ以上のものはありません。必要に応じて、ステータス変更の履歴全体を常に確認できます。 最初の問題は、ある日付の値を取得しようとしたときに始まります。 したがって、別のフェデレートフィールド、つまり値が期限切れになる日付を追加します。 冗長な情報をこのフィールドに保存しますが、これにより
TStatusHistoryテーブル | |
fkey | |
f_troubleticket | TTroubleticketの記録へのリンク |
価値 | 価値 |
fsdate | 値割当日 |
連邦日付 | 有効期限値 |
ここで、日付の値を取得するには、リクエストをわずかに変更する必要があります。
SET @f_troubleticket = 10; SET @dt = 20090401000000; #2009年4月1日00:00 選択 tt.fkey、tt.fcontact、tt.ftext、 (選択 価値 から TStatusHistory どこ f_troubleticket = tt.fkey およびfsdateとfedateの間 ORDER BY fsdate DESC 制限0.1 )fstatusとして から TTroubleticket AS tt どこ fkey = @f_troubleticket LIMIT 0、1
この複雑さに対処しました。 しかし、時間が経ち、システムは改善されています。アプリケーションの種類や定期的なパラメーターが必要でした。 でたらめ!-別のテーブルを追加します。
TTypeHistoryテーブル | |
fkey | |
f_troubleticket | TTroubleticketの記録へのリンク |
価値 | 価値 |
fsdate | 値割当日 |
連邦 | 値の有効期限 |
ザロスは変換されます:
SET @f_troubleticket = 10; SET @dt = 20090401000000; #2009年4月1日00:00 選択 tt.fkey、tt.fcontact、tt.ftext、 (選択 価値 から TStatusHistory どこ f_troubleticket = tt.fkey およびfsdateとfedateの間 ORDER BY fsdate DESC 制限0.1 )AS fstatus、 (選択 価値 から TTypeHistory どこ f_troubleticket = tt.fkey およびfsdateとfedateの間 ORDER BY fsdate DESC 制限0.1 )AS ftype から TTroubleticket AS tt どこ fkey = @f_troubleticket LIMIT 0、1
そして、時間が経つにつれて、追加のテーブルがたくさんあるかもしれません。 システムは複雑になっており、良い点はありません。
アプローチを改善します-周期変数ごとに個別のテーブルを作成せず、すべての周期変数を1つのテーブルに保存します。
歴史的テーブル | |
fkey | |
f_troubleticket | TTroubleticketの記録へのリンク |
fstatus | 状態 |
ftype | タイプ |
日付 | 値の割り当て |
連邦日付 | 有効期限値 |
また、現在の値はすべてメインテーブルに保存されます。
Troubleticketテーブル | |
fkey | 申請番号 |
fcontact | 申請者の連絡先 |
ftext | アプリケーションテキスト |
fstatus | 現状 |
ftype | 現在のタイプ |
そして、実際の値を取得する必要がある場合、単純なリクエストを完了するだけです。
SET @f_troubleticket = 10; 選択 fkey、fcontact、ftext、 fstatus ftype から Tトラブルチケット どこ fkey = @f_troubleticket LIMIT 0、1
日付の値を取得する必要がある場合は、LEFT JOINコンストラクトを使用します。
SET @f_troubleticket = 10; SET @dt = 20090401000000; #2009年4月1日00:00 選択 tt.fkey、tt.fcontact、tt.ftext、 his.fstatus、 his.ftype から TTroubleticket AS tt LEFT JOIN TTroubleticketHistory as his his.f_troubleticket = tt.fkeyで および@dt間his.fsdateとhis.fedate どこ tt.fkey = @f_troubleticket LIMIT 0、1
それだけです。 それは非常に難しい決断のようです。 そして、定期的な値をどのように保存しますか?
psアイデアをありがとうA.マトヴェーエフ。