2015-03-31 38 views
0

我在表中有版本邏輯。所以,每個表都包含'is_deleted'和'version'字段。當我從數據庫中我使用,其中對於每個引用的表的條款和表本身記錄(「版本」字段被引用於單表所有版本)創建FOREIGN KEY到版本化表

table1(id, field1_1, field1_2, is_deleted, version[fk to versions.id]) 
table2(id, field2_1, field2_2, table1_id, is_deleted, version[fk to versions.id]) 
versions(id, main_version) 

。喜歡的東西:

SELECT * FROM table1 AS t1 
WHERE (
    (
    (t1.id, t1."version") IN 
    (SELECT sub_t1.id, max(sub_t1."version") FROM table AS sub_t1 GROUP by sub_t1.id) 
) 
    AND t1.is_deleted IS FALSE 
) 

對於MySQL,你可以爲「IS_DELETED」更改條件

is_deleted = 0 

現在,我添加新表,我想使用外鍵,但外鍵只能引用唯一的列,但id不是唯一的(它通過版本保存),我不能使用複雜的鍵,因爲新版本只有在更改了smth並且只爲該記錄創建時才創建。

我應該忽略FK嗎?還是應該爲每個版本化表添加僅包含一個列ID的附加表?除了數據完整性以外,添加這些表格還會帶來一些好處嗎添加這樣的表格會使邏輯更加複雜。

所以,我應該活不變或使水木清華這樣的:

table1_ids(id) 
table1_versions(id, table1_id[fk to table1_ids.id], ...) 
table2_versions(id, ..., table1_id[fk to table1_ids.id],...) 
table2_ids(id) 

回答

1

你能爲,而每個版本的創建模式? 這將是更乾淨的解決方案。

+0

我有相當大的一組數據 - 大約15000條記錄(對於表的連接部分)。因此,如果一個記錄中的單個字段發生了變化,那麼複製全集並不好。而且這種改變每小時都會在記錄中出現。如果我將創建 – mshutov 2015-03-31 11:18:19

+0

在你的答案之後,我正考慮在單獨的表中存儲以前的值(如果發生更改)的可能性,因爲99%的記錄只有一個版本(對於當前活動的main_version),所以我可以使用FK main_version而不是版本,然後將其包含到PK中,但它會將表的數量加倍... – mshutov 2015-03-31 11:35:05