例を考えてみましょう。 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.マトヴェーエフ。