MySQLバージョン管理

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

例を考えてみましょう。 TTroubleticketテーブルに基づいた最も単純な苦情システムがあるとします。
Troubleticketテーブル
fkey申請番号
fcontact申請者の連絡先
ftextアプリケーションテキスト

連絡先情報とアプリケーションテキストに加えて、アプリケーションステータスとその変更の全履歴を保存する必要があります。 この決定はすぐに頼りになります:変更の全履歴とともに別のテーブルにステータスを保存します。
TStatusHistoryテーブル
fkey
f_troubleticketTTroubleticketの記録へのリンク
価値価値
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_troubleticketTTroubleticketの記録へのリンク
価値価値
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_troubleticketTTroubleticketの記録へのリンク
価値価値
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_troubleticketTTroubleticketの記録へのリンク
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.マトヴェーエフ。

Source: https://habr.com/ru/post/J58293/


All Articles