2010-08-27 55 views
4

我們應用程序中的用戶參與論壇並創建各種實體。在架構中,將這些表中的引用標記爲外鍵引用。我們無法從數據庫中刪除此用戶條目,因爲它有幾個可以刪除的外鍵約束。如何處理用戶刪除

解決的一種方法是將其他表中的用戶字段設爲可爲空,以便在刪除用戶條目之前將這些值標記爲可爲空。從其他表格中刪除信息根本不是一個選項,因爲它會導致不一致(例如,刪除屬於用戶的論壇帖子會導致問題)。

另一種選擇是將用戶條目標記爲可移除,並且不會將其作爲用戶查詢的一部分提供。這在理論上意味着沒有用戶可以從系統中刪除,並且如果有人想要使用與刪除的用戶相似的登錄ID,則可能會出現問題。

想知道,別人怎麼解決這個問題?

回答

11

我們通常只是軟刪除用戶。換句話說,在users表中有一列表示它們不再處於活動狀態,並修改所有查詢,以便它們只對活動用戶有效。

這有兩個好處:

  • 不會的東西與其他表的外鍵約束;和
  • 它保留所有關於您需要在某個點恢復它的機會的數據。

除非您的用戶數量已達到數十億或您的營業額非常高,否則保持舊用戶不會對大多數數據庫造成壓力。

這可以用來制定類似的方案,以什麼SO。當用戶「消失」時,由他們撰寫的問題和答案仍然有作者信息,但它是灰色的。

如果您對用戶信息進行了無效處理(或者即使您有一位Unknown用戶將郵件分配給不希望允許NULL的用戶),也不會有此信息。

+1

+1總是軟刪除用戶。此外,通常在審計目的中,用戶名被存儲,而不是用戶ID FK,以防萬一昏迷的管理員復活非活動用戶並將該ID重新分配給新的職員。 – StuartLC 2010-08-27 09:45:02

+1

我通常將刪除列設置爲true,只要用戶被刪除並且可行查詢只選擇已刪除= false的用戶 – KoolKabin 2010-08-27 09:47:31

2

我會用你最後提到的方法,即使用軟刪除。 有一個「活動」標誌並將其標記爲不活動,一旦用戶被刪除。

關於想要使用相同的userid,我會建議不要讓userId你的主鍵。

在這種情況下,您可以自由使用同一個用戶ID - 只要你做的檢查有沒有其他「活動」用戶 - 你不讓老用戶重新激活他的身份證,除非有沒有其他「活動」用戶

但是,這種方法要求所有其他表的外鍵應該是某種IDENTITY類的列,而不是您的userid本身。 假設已完成(並且如果您尚未使用ID,則可能需要進行大量模式更改),但我沒有看到此方法存在任何其他潛在問題