2010-10-26 75 views
2

因此,您有一個關係數據庫,並且爲引用完整性定義了一些外鍵。但是現在有什麼更好的方法來利用它們呢?假設我們要刪除表中有外鍵的行到其他表中。關係數據庫外鍵約束在實踐中的用法

  1. 使用他們作爲垃圾收集 - 設置爲級聯所有約束。因此,在您的應用程序中,首先檢查目標行是否有任何「子」,並向用戶提供中止刪除操作的選項,如果不希望從屬行也被刪除。

  2. 將它們作爲實際使用約束 - 在您的應用程序中,試圖刪除目標行。如果操作失敗,,然後檢查是否有子項並向用戶提供選項;如果用戶想要繼續操作,請首先手動刪除依賴行。

第二個選項使刪除循環引用相當艱難 - 您必須將外鍵設置爲null,然後才能刪除任何內容。

回答

1

有2級典型的外鍵的場景:

  • 協會:鏈接,可以在自己的
  • 成分存在2個實體:子實體鏈接到它的父實體(子實體它存在不存在不一個父母,例如:訂單和訂單項目)

我只會在組合的情況下級聯,並分別處理每個關聯情況。

+0

我認爲你回答了錯誤的問題,或者我錯誤地解釋了你的答案......但是我的困境適用於你的情況。我的問題是要求**應該強制執行完整性 - 而不是應該強制執行還是不強制執行。在這兩種情況下,一行取決於另一行;問題是,刪除時,誰進行檢查 - 數據庫或應用程序? – 2010-10-26 11:20:37

+0

我會依靠數據庫來處理組合級聯刪除,因爲刪除父母時保留孩子是沒有意義的。對於關聯而言,邏輯更加複雜,取決於業務規則的位置。如果它們在數據庫之外,那麼業務層(應用程序,服務)應負責級聯刪除。但這種情況沒有金科玉律。當您刪除與部門關聯的最後一名員工時,是否刪除該部門?也許,可能不會,這取決於... – 2010-10-26 12:12:14

+0

我不是在尋找一條黃金法則;我想聽聽其他人在_practice_中採用哪種方式。不過,謝謝你的意見。 – 2010-10-27 07:47:30