如果表是非常大的(數以百萬計基數),而無需登錄的DELETE交易,丟棄約束和TRUNCATEing並重新創建約束是遠遠最有效的方法。另外,如果在其他表中有外鍵(並且在這個特定的表設計中它看起來如此),那麼在所有情況下也必須首先刪除這些行。
規範化沒有提及遞歸/層次/樹關係,所以我相信在你回覆DVK建議將它分解成它自己的表的時候,它是一個紅色的鯡魚 - 它當然可以對此表進行垂直分區並考慮是否可以利用這一點來獲得我在下面列出的任何其他好處。正如DVK所暗示的,在這個特別的設計中,我經常看到一個單獨的鏈接表來記錄自我關係和其他類型的關係。這有很多好處:
- 有很多很多上下,而不是多到一個(不常見,但可能很有用)
- 跟蹤不同類型的直接關係 - 經理,顧問,助理,工資審批,費用審批,技術報告,來 - 與關係和關係型表,而不是在員工表中的新列的行
- 按部就班地進行,包括活動指標和有效的改變在時間上一致的方式層次結構(包括離職員工層次的歷史)關係行上的日期 - 這隻有在將關係歸一化到其自己的表中時纔是完全可能的
- SeniorID中的NULL(實際上在任一ID上) - 這是避免錯誤邏輯的明顯優勢,但NULL通常會出現在視圖中,無論如何您必須將關聯表左連接到
- 更好的專用索引策略 - 而不是添加SeniorID到你已經擁有員工的特定索引(尤其是關係類型的數量增長)
當然,與這種關係相關的信息越多,表明關係本身值得一張表(即它是在這個詞的真正意義上的「關係」在關係數據庫中使用 - 相關數據被存儲在一個關係或表 - 與主鍵),從而爲關係的正常形態可能會強烈地表明,關係表在employee表中創建而不是簡單的外鍵關係。
好處還包括其簡單的刪除場景:
DELETE FROM EmployeeRelationships;
DELETE FROM Employee;
您會在這裏對SO注意到一個引人注目的等效性接受的答案,因爲,你的情況,沒有高層關係的員工有一個NULL - 所以在那個答案海報首先設置NULL爲消除關係,然後刪除員工。
根據約束(EmpployeeRelationships通常能夠被TRUNCATEd,因爲它的主鍵通常是一個組合鍵而不是任何其他表中的外鍵),可能有適當的TRUNCATE用法。
這是很清楚的的Jhonny的是最有效和最好的答案,我只留礦爲充當一個提醒,有時候我沒有,因爲我覺得我聰明。 – 2010-03-20 13:41:18
@Larry。因爲它會先更新所有行然後刪除它們,因此應該效率更低。而不是直接刪除。哪個操作更高效,循環或查詢?請讓我清楚。我不知道這兩個 – 2010-03-20 13:43:57
基於集合的命令的想法可能會比運行在一個循環內衆多基於集合的命令,即使在後一種情況下每個命令的影響較少的行得更快。實際結果可能會有所不同,例如,表格索引或參考級別數量;你必須測試以確保你有真正的最佳狀況。但是Jhonny的「看起來」更好,而且肯定會更清晰,更容易實施。 – 2010-03-20 13:49:28