1

私はしばらくの間、このクロージャ テーブルを使ってぐるぐる回っています。私が抱えている問題は、子孫の2番目の出現にあります。複数の親カテゴリに表示されるサブカテゴリのインスタンスがあります。簡単にするために、この例に戻りました。

drop table if exists closure;
drop table if exists nodes;

create table nodes (
node int auto_increment primary key,
label varchar(20) not null
);

insert into nodes (node, label) values
(1, 'rootree'),
(2, '1stbranch'),
(3, 'midbranch'),
(4, 'corebranch'),
(5, 'leafnodes'),
(6, 'lastbranch'),
(7, 'lastleaf');

create table closure (
ancestor int not null,
descendant int not null,
primary key (ancestor, descendant),
foreign key (ancestor) references nodes(node),
foreign key (descendant) references nodes(node)
);

insert into closure (ancestor, descendant) values
(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7),
(2,2),
(3,3), (3,4), (3,5),
(4,4), (4,5),
(5,5),
(6,6), (6,7),
(7,7);

次のクエリを使用して、目的の結果を得ることができます。

select group_concat(n.label order by n.node separator ' -> ') as path
from closure d
join closure a on (a.descendant = d.descendant)
join nodes n on (n.node = a.ancestor)
where d.ancestor = 1 and d.descendant != d.ancestor
group by d.descendant;

結果:

rootree -> 1stbranch
rootree -> midbranch
rootree -> midbranch -> corebranch
rootree -> midbranch -> corebranch -> leafnodes
rootree -> lastbranch
rootree -> lastbranch -> lastleaf

しかし、別の子、たとえば既に存在する子を追加する場合、leafnodes を roottree -> lastbranch -> lastleaf の子にしたい

2 つの新しいレコード (6-5) と (7-5) をクロージャー テーブルに挿入します。

その後、すべての地獄が解き放たれます。考えられることはすべて試しましたが、どこにも行きません。

4

1 に答える 1

0

私はここで答えを見つけました: Converting the Closure Table from a Weak Entity

回答:祖先と子孫の両方の ID を保持するために、クロージャ テーブルに 2 つのフィールドを追加しました。現在、ノードは実際の値から独立しています。構造は接続されたままで、挿入、削除、クエリなどに使用されますが、各ノードで保持される値は独自のエンティティであり、ツリーの構造に影響を与えることなく他のエンティティに置き換えることができます。これにより、複数の親カテゴリで同じ子カテゴリを使用していた特定の問題を解決できました。他にもまだ発見されていない多くの利点があると思います。

于 2012-08-23T12:31:51.477 に答える