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
實體(根有null
ParentID
)。 但是當我嘗試添加約束級聯刪除,我得到這個:
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的
請參閱http://stackoverflow.com/questions/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths – JohnLBevan
ps。你能夠使用存儲過程來執行刪除操作嗎?即不是將該邏輯放入約束/觸發器中,而是在發生刪除時處理父母的遞歸刪除,將所有這些邏輯放入存儲過程並調用該刪除。如果人們可以直接訪問數據庫,這將無濟於事,但大多數時候我會假設人們將通過一個前端程序,因此您可以將其指向proc而不是編寫刪除語句。 – JohnLBevan
@JohnLBevan,這就是我最終做的。我使用的是EntityFramework,所以我只使用了Repository Pattern,並使存儲庫的刪除函數遞歸。我不在乎效率與這個應用程序,但如果我這樣做,我可能會將邏輯移動到存儲過程。 – Eric