2009-12-28 122 views
0

我有四個表:幫助,刪除關係表

  • users:ID,THREAD_ID
  • threads:ID,LANGUAGE_ID
  • posts:ID,USER_ID,LANGUAGE_ID
  • languages:ID

USERS.thread_id是一個外鍵THREADS.id,POSTS.user_id是USERS.id的外鍵和LANGUAGES.id的POSTS.language_id外鍵。

我無法刪除用戶,因爲POSTS.user_id會引發外鍵約束錯誤,並且我無法刪除帖子,因爲我希望所有帖子(和線程)都可以在那裏讀取,即使用戶被刪除。

我該怎麼辦?

回答

2

看起來一切正在按設計:)如果MySQL讓你刪除的用戶,同時保留posts.user_id指向它,您的數據庫將變得不一致。

如果你想從已刪除用戶的帖子是可讀的,刪除用戶之前重置其USER_ID別的東西(0?空?)。

如果你想在用戶信息保持過,那麼你顯然不能刪除用戶的行。您應該添加某種「用戶已刪除」列,以更改用戶在用戶界面上的顯示方式。

+0

是的,你的第三個解決方案聽起來不錯。我在很多論壇上看到,當用戶被刪除時,他會在帖子中說「用戶已刪除」。 – ajsie 2009-12-28 06:22:19

0

外鍵用於強制執行數據完整性。既然你有理由讓帖子和線程存在沒有一個有效的用戶ID,那麼你並不需要外鍵數據的完整性。

我要麼完全刪除外鍵,要麼利用foreign key creation clauseON DELETE部分。當引用的外部值發生更改時,您可以使用MySQL CASCADE,RESTRICT或​​。

在這種情況下,您可以使用ON DELETE SET NULL創建外鍵,並且在刪除用戶時,您的帖子表中的用戶標識將設置爲NULL。外鍵在默認情況下使用RESTRICT創建,這就是爲什麼您不能刪除用戶並在posts表中保留孤立值的原因。

4

這就是所謂的軟刪除,你可以在這裏看到它在這裏工作。當您看到來自「已刪除」用戶的答案時,它們會變灰。

保持用戶在數據庫中,但增加一個標誌列isDeleted你當用戶被刪除設置。

然後(明顯)禁止針對該用戶的所有登錄和(任選地)特別顯示它們。

+0

+1:但列應該是ACCOUNT_STATUS_CODE,其外鍵爲「ACCOUNT_STATUS_CODE」表。 – 2009-12-28 07:49:59

+0

爲什麼不是枚舉? – 2009-12-28 19:36:52

0

實際上不要將外鍵約束添加到表中。他們沒有必要。沒有他們,你可以自由地做任何你想做的事情。只有在必要時才添加它們。

+0

當然,但請考慮一下OP的情況。如果他們這樣做,那麼他們查詢線程或發佈的每個地方都必須在用戶表上使用外部聯接,然後檢查是否有用戶出現。 – Dan 2009-12-28 16:53:44