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.マトヴェーエフ。