2011-03-08 53 views
2

我有許多表格,其中數據需要「標記爲刪除」但未被刪除,或在已發佈數據和隱藏數據之間切換。爲刪除的數據設計表格

處理這些情況的最直觀方式是在數據庫deleted int(1)public int(1)中添加一列。這引起了每次訪問該表時不忘記指定WHERE deleted=0的擔憂。

我考慮通過爲已刪除/未發佈的數據(例如article =>article_deleted)創建重複表格並移動數據而不是刪除數據來克服此問題。這提供了2個問題:

  1. 外鍵約束最終是非常惱人保持
  2. 表數與隱藏的內容雙打(對我來說〜20變爲〜40桌)

我最後的想法是創建一個名爲unreleased的整個數據庫的副本並在那裏遷移數據。

我的問題不是關於數據管理的safety,而是更多的 - 從一開始就做這件事的正確方法是什麼?

+0

這是你非常常見的問題所帶來的額外痛苦。有一個額外的列'刪除'要簡單得多。我建議不要重複表格。 – Nishant 2011-03-08 18:13:26

+0

我很感激MySQL中有'DNR_ON_SELECT'行(不返回)行中的內置列,如果這樣的列存在並設置爲1,則顯式的'SELECT IGNORE_DNR ...'需要 – Mikhail 2011-03-08 18:17:28

+0

一個小建議,但我認爲有一個'active'字段而不是''deleted''會更合乎邏輯。 (也許這只是我,但自動包含一個'WHERE ... active = 1'從句更自然。) – 2011-03-08 18:21:10

回答

3

我已經遇到過這個確切的問題,我認爲這是一個壞主意,創建一個不必要的繁瑣的數據庫,因爲你害怕糟糕的代碼。

我認爲在釋放到產品之前在您的測試服務器上進行徹底測試是一個更好的主意。當我第一次遇到它時,即使我被「已刪除」列絆倒了幾次,但我最終還是被抓住了,如果你有適當的開發/測試/生產環境,你應該沒問題。

總之,保持刪除列,並要求您的編碼器更多。

UPDATE:

或者你可以創建一個視圖,只翻出未刪除,並確保每個人的記錄,使用了爲select查詢。

+1

Upvote&accept創建視圖。這可以擴展到允許在製作中使用的表必須以特定字符開始的位置。這允許有「已刪除」或「不活動」或「staff_only」標誌,而只需修改視圖 – Mikhail 2011-03-08 18:35:52

+0

+1中的所有「SELECT」即可「創建視圖」。實際上,它沒有兩個視圖,一個用於「活動」,另一個用於「不活動」的文章,以及觸發器(如果需要)讓您更新視圖,這是非常糟糕的。然後,您可以使用視圖而不是基表。 – 2011-03-10 11:35:14

0

我認爲你的初始方法是「正確的」和「正確的」,但你對它的擔心有點容易出錯是有效的。

您可能只需確保您的測試程序足夠精確以發現錯誤。

0

第一種方法是我想到的最好的方法。我將該列稱爲活動而不是刪除。該記錄存在,但可以是活動的或不活動的。那麼如果你真的需要刪除東西,術語不會變得棘手。

說「刪除不活動的記錄」有道理,但說「刪除已刪除的記錄」只是讓人困惑。