2017-10-20 16 views
0

私は開発中のアプリケーションのデータベース設計を行うためにMySQLワークベンチのEERツールを使用しています。 DB上のデータ変更を追跡することは非常に重要なので、私は受け入れられた答えを多く意味する投稿thisをフォローしていました。問題は私が主キーをよく理解していないということです。変更が行われるたびに同じIDで挿入された別の行が存在するため、DBが許可しないため、これがどのように機能するかについて少し混乱しますそれは正しい?私は外部キーのためにプライマリキーを使用する必要があります。myqlの変更を追跡する最善の方法

+0

あなたが参照する答えは複合PKを使用しますが、valid_fromおよび/またはvalid_untilが異なる限り、顧客IDを繰り返すことができます。そのようなPKはすべてのフィールドを同一性のために使用します。 (私が知っている問題の1つは、トリガーを使用することを指しているが、トリガーは「ON」のテーブルを変更できないということです)。私は、 "現在の"テーブルのトリガによって更新され投入される "履歴"テーブルを含むソリューションを好む。 – Uueerdo

+0

@Uueerdoオハイオ州、私はそれがnullrightすることができますので、主キーとしてvalid_untilをひそむに間違って参照してください?私が観察している別のことは、EERはプライマリキーは、外部キーを参照する列は、 –

+0

NULL値は、主キーと一意のインデックスの一部になります。 (どちらか2つのNULLはお互いに「ユニーク」です)。その答えは、PKのIDだけでなくなりました。 (id、from、to)は、(0,1,4)と(0,2,5)のようなデータが同時に存在するのを防ぐわけではありません。 – Uueerdo

答えて

0

(非常に)擬似コードマイ通常 "パターン":

  • 表A_history a_stuff A_ID(PK):

    • 表A a_history_id(PK)、A_ID(FKがA.a_idを参照) 、VALID_FROM、VALID_TO、上

    トリガーa_stuff:インサートで

    • :今= VALID_FROMとA_historyに値を挿入し、VA lid_to = null。
    • 更新時:a_idの最終履歴レコードに対してvalid_to = nowを設定します。その行の更新された値を使用して「オン・インサート」トリガーから同じインサートを実行します。
    • 削除時:a_idの最終履歴レコードに対してvalid_to = nowを設定します。このシナリオでは

    、あなたは「X> = <へからおよびX」で歴史を照会したい(ない BETWEEN値「から」前のレコードの次の「値」へと一致している必要があります)。

  • +0

    a_idは最後の状態または開始状態を反映していますか? –

    +0

    a_idはテーブルAの単一の行を参照します。テーブルA_historyの行がAの行の状態であることを示しています(valid_toがnullでない場合は直前の状態)。テーブルAは現在の状態のみを保持します。 – Uueerdo

    +0

    ありがとう、私は別のテーブルを持っているほうがいいかもしれないと思うのですが、クエリのパフォーマンスを助けるかもしれませんね? –

    関連する問題