2

我需要在SQL Server中建模一個n級樹。我原來是這樣的,以創建一個Node表:使用級聯刪除對SQL Server中的N級樹進行建模

[Id] [bigint] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](50) NOT NULL, 
[ParentId] [bigint] NULL 

這是一個自我參照表,其中ParentID指回到另一個Node實體(根有nullParentID)。 但是當我嘗試添加約束級聯刪除,我得到這個:

Introducing FOREIGN KEY constraint 'FK_dbo.Nodes_dbo.Nodes_ParentId' on table 'Nodes' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

從我讀,這似乎是一個在SQL Server中非常熟知的,合理的限制。有人建議使用觸發器來實現這一點,但如果可能的話,我寧願避免這種情況。

所以我的問題是 - 爲了允許級聯刪除,應該如何在SQL中建模一個n級層次結構或樹?

我使用SQL Server 2012的

+0

請參閱http://stackoverflow.com/questions/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths – JohnLBevan

+0

ps。你能夠使用存儲過程來執行刪除操作嗎?即不是將該邏輯放入約束/觸發器中,而是在發生刪除時處理父母的遞歸刪除,將所有這些邏輯放入存儲過程並調用該刪除。如果人們可以直接訪問數據庫,這將無濟於事,但大多數時候我會假設人們將通過一個前端程序,因此您可以將其指向proc而不是編寫刪除語句。 – JohnLBevan

+0

@JohnLBevan,這就是我最終做的。我使用的是EntityFramework,所以我只使用了Repository Pattern,並使存儲庫的刪除函數遞歸。我不在乎效率與這個應用程序,但如果我這樣做,我可能會將邏輯移動到存儲過程。 – Eric

回答

1

一個我見過這樣做是爲了使聚集主鍵是節點的可變長度滿樹路徑更有效的技術(hat tip to Richard Henderson );要刪除一個子樹,只需要刪除一個範圍的值。