2012-07-01 56 views
4

我有一個數據庫設計問題,我一直在研究一段時間,但無法得到正確的答案。比方說,我們有兩個表,house_schemahouse如下:在一個表中刪除記錄,其中存儲另一個表的屬性

house_schema { 
     id big int, 
     house_height int, 
     house_width int, 
     house_decoration vchar(1024), 
     build_date timestamp, 
     primary key id, 
} 

house { 
     id big int, 
     owner vchar(255), 
     price big int, 
     house_schema_id big int, 
     primary key id, 
     foreign key fk_house_house_schema_id (`house_schema_id`) reference `house_schema`.`id` 
} 

house_schema表存儲的house一些物理屬性。在軟件用戶界面上,用戶選擇一個模式,然後單擊「生成」按鈕。房屋建成並儲存在house。還有其他一些表格,如house_schema來描述如何建造房屋。

在一個簡單的設計中,一個外鍵看起來效果很好。但是,當構建者決定刪除他們認爲已過時的架構時,會產生問題。已經有一些從模式構建的房屋,並且外鍵防止它被刪除。如果我們將外鍵更改爲DELETE ON CASCADE,那麼這些房屋會丟失它所建的信息。

什麼是最好的設計模式來處理這個問題?我可以想象的是,有一個house_schema的重複表,一旦建成房屋,將house_schema中的行復制到重複表中。

但是,這導致在數據庫中有很多重複的表格,因爲我有多個與house_schema相似的表格。它似乎違反了數據庫規範化規則。

有沒有人有一個好主意?

回答

3

如果您想保留使用什麼模式構建房屋的歷史,典型的解決方案是在您的house_schema表上實施軟刪除

而不是實際刪除在house_schema行你就必須

  • 添加Active列於表
  • 集此列false方案時,過時
  • 調整您的應用程序不顯示非活動模式的

請注意,有相當一些關於軟刪除的材料,都建議ag ainst和for。

從個人的經驗,我們採用的可選項目(下拉列表)我們主要應用軟刪除沒有任何值得一提的問題爲止。

當一個項目變得過時時,無論它在哪裏使用,都需要保留該值,但對於新文檔,它不應再顯示在下拉列表中。我還不得不遇到一個更好的解決方案,以便能夠處理這種情況其他比軟刪除。

0

有一些可能性:

  • 你可以在house_schema,你會以指示架構標誌不再存在有一個「刪除」領域。這意味着改變許多查詢。

  • 你可以有一個「不可刪除」的默認模式,當其中一個被刪除時,它的房屋將回退到該模式。

0

作爲一個簡單的解決方案,你可以添加一個標誌「刪除」house_schema。這樣你保持歷史條目。向用戶顯示可用的house_schema條目時,請選擇不刪除的過濾條件。

0

可能增加了「deprecated_schema」,您只需將要刪除的house_schema行復制到棄用的保存部分即可。您需要一個字段來存儲原始house_schema ID字段,以便您仍可以訪問房屋表中的正確條目。

然後您可以從house_schema表中刪除,並仍然保留對基於該架構的房屋的訪問權限。

0

爲了增加另一個觀點,你是否認爲存儲在* house_schema *中的細節實際上是房屋的屬性,應該如此存儲?
這可能被視爲過度歸一化的情況。

+0

我將模式存儲在單獨的表中,因爲它是構建房屋之前的某種配置。用戶選擇一個配置,然後建立一個房屋,現在配置變成房子的屬性。但在此之前,因爲有房子,所以這不是屬性。 –

相關問題