2017-10-20 123 views
0

我正在使用MySQL Workbench的EER工具爲我正在開發的應用程序進行數據庫設計。跟蹤數據庫中的數據更改非常重要,所以我遵循this後,這使得很多意義上被接受的答案。我的問題是,我不太瞭解主鍵,所以我有點困惑這應該如何工作,因爲每次進行更改都會有另一行插入相同的ID,因此數據庫不會允許這是我的權利?我需要使用外鍵的主鍵。跟蹤myql更改的最佳方式

+0

您引用的答案使用複合PK,只要valid_from和/或valid_until不同,客戶ID就可以重複;這樣的PK使用組合的所有字段來表示身份。 (我看到的答案細節中的一個問題是,它指的是使用觸發器,但觸發器無法修改它們「ON」的表)。我喜歡一個涉及「歷史」表的解決方案,該表由「當前」表上的觸發器更新和填充。 – Uueerdo

+0

@Uueerdo ohh,我明白了,但是後來將valid_until作爲主鍵是錯誤的,因爲這可能是無效的嗎?我觀察到的另一件事是EER正在使用主鍵來引用外鍵,這是最佳實踐嗎? –

+0

NULL值可以是主鍵和唯一索引的一部分;但行爲有點不同(任何兩個NULL是彼此「唯一」的。)這個答案可能已經離開只有一個(ID,從)PK; (id,from,to)不會阻止(0,1,4)和(0,2,5)等數據同時存在,當您在查找「when between between between to」時,會出現問題。 – Uueerdo

回答

0

我的正常 「模式」 在(非常)僞代碼:

  • 表A:A_ID(PK),a_stuff
  • 表A_history:a_history_id(PK),A_ID(FK引用A.a_id) ,VALID_FROM日期,失效日期a_stuff

觸發器上的一個:

  • 上的插入:用VALID_FROM =現在,和VA將值插入A_history lid_to = null。
  • 更新時:將valid_to = now設爲a_id的最後歷史記錄;並使用該行的更新值從「插入時」觸發器執行相同的插入操作。
  • 刪除時:爲a_id的最後歷史記錄設置valid_to = now。

在這種情況下,你會查詢歷史記錄爲「x> =從和X <爲」( BETWEEN作爲先前記錄的「從」值應與下一對「價值」)。

+0

a_id反映了最後一個狀態或起始狀態? –

+0

a_id引用表A中的單個行;它顯示錶A_history中的行是A中該行的狀態(如果valid_to不爲空,則爲前一狀態);表A只會有當前狀態。 – Uueerdo

+0

謝謝,我明白爲什麼有一個單獨的表可能會更好,可能有助於提高查詢性能? –