1

MySQL でクロージャ テーブルを使用して階層をモデル化するときに、兄弟ノードの名前に一意の制約を適用する方法を考えています。

これは私のスキーマです:

create table spaces (
  id int not null, 
  name varchar(50) not null,
  parent int not null,
  primary key (id),
  foreign key (parent) references spaces(id),
  unique key (name, parent)
)

create table space_paths (
  ancestor int not null,
  descendant int not null,
  depth int not null,
  primary key (ancestor, descendant),
  foreign key (ancestor) references spaces(id),
  foreign key (descendant) references spaces(id)
)

このスキーマでは、spacesテーブルに一意の制約を使用して、同じ名前の兄弟がないことを確認しています。

このアプローチの欠点は、space_pathsテーブルにカプセル化された階層メタデータが非正規化されることです。parentつまり、テーブル内のフィールドとspacesテーブル内のパスの一貫性を手動で管理する必要があるということですspace_paths

非正規化することなく、データベースが兄弟間で一意の名前の制約を適用するようにスキーマを再設計する方法はありますか?

4

1 に答える 1

0

クロージャ テーブルを使用することは、ここでの問題の実際の部分ではありません。単にUNIQUE KEYonparent, nameが必要であり、それがすでに定義されているように見えるので、うまくいくはずです。

悲しみを引き起こしている可能性のあることの1つは、列にNOT NULL制約があることです。parent「ルート」ノードをどのようにサポートしますか? ルートノードにID列と等しい親値を使用させることもできますが、それには自己割り当ての主キーが必要です(私の知る限り、挿入ステートメントで自動インクリメント値を参照することはできません):

INSERT INTO spaces(id, name, parent) values (0, 'root', 0);
于 2013-02-10T18:30:08.590 に答える