MySQLバージョン管理

1Cには非常に便利な機能があります-定期的な詳細、それらを使用すると、値だけでなく、その変更の履歴全体も保存できます。 たとえば、ルーブルに対するドルの値を保存すると、現在の値だけでなく、昨日、前日などの値も保存されます(保存期間は任意です)。 MySQLには、残念ながらそのような機能はありません(おそらく必要ありません)。 だから自分でやる;)。



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



All Articles