2

SQL Server で n レベルのツリーをモデル化する必要があります。Node私はもともとテーブルを作成するために次のようなことをしました:

[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 を使用しています。

4

1 に答える 1

1

これを行うために私が見たより効果的な手法の1つは、クラスター化された主キーをノードの可変長の完全なツリーパスにすることです(リチャードヘンダーソンへの帽子のヒント)。サブツリーを削除するには、値の範囲を削除するだけです。

于 2012-11-12T22:50:58.110 に答える