0

私のプログラムでは、エントリをテーブルに保存します。エントリには子アイテムも含まれる場合があります。

id uniqueidentifier not null primary key
parent uniqueidentifier null (another id from the same table or null)
... other columns

このテーブルでは、最上位のエントリのみが子アイテムを持つことができるため、循環または再帰は不可能です。

エントリを削除すると、子アイテムも削除したい。残念ながら、そのようなテーブルに ON DELETE CASCADE を追加する方法はありません。

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

ただし、delete ステートメントで追加の条件を指定するだけで、同じことができます。

DELETE FROM mytable WHERE id = @GUID OR parent = @GUID

問題は、親列がインデックス化されていないことです。この列には多くの重複値 (NULL) もあり、私が知っているように、重複値はインデックスで使用すると非常に悪いものになります。知りたいのですが、この問題の最善の解決策は何ですか

  1. 子アイテムと親アイテムの両方を削除するためのより良い解決策はありますか?
  2. 親列でインデックスを使用する必要がありますか? はいの場合、この場合はどのタイプのインデックスを使用する必要がありますか?重複する値がたくさんあります
  3. 確かではありませんが、上記のソリューションの OR ステートメントを使用すると、主キー インデックスが役に立たなくなり、SQL サーバーがテーブル全体をスキャンするだけになることをお勧めします。

PS

子アイテムを格納する別のテーブルを作成できません。

4

0 に答える 0