階層的なデータの永続性を研究し、クロージャ テーブルに導き、この研究の集大成に基づいてこのコメント構造をつなぎ合わせました。
クロージャ テーブルに新しいノードを作成するためのクエリは簡単に把握でき、クロージャ テーブルの を介して子孫のデータを取得するのJOIN
は簡単です。
ただし、それを拡張して、x の深さまでの親/子の両方の数によって結果を並べ替えて制限したいと思います。
外部キーとインデックスを利用して、物事をタイムリーかつ効率的に保つようにしています (コメント テーブルが非常に大きくなると思います)。私は、タイトルで求めていることを実行できるオールインワン クエリを目指していますが、速度/効率を向上させるために分割することに反対していません。
現在のテーブル構造:
CREATE TABLE `comments` (
`comment_id` int(11) UNSIGNED PRIMARY KEY,
`reply_to` int(11) UNSIGNED NOT NULL DEFAULT '0',
`user_id` int(11) UNSIGNED NOT NULL,
`comment_time` int(11) NOT NULL,
`comment` mediumtext NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES users(`user_id`)
) Engine=InnoDB
CREATE TABLE `comments_closure`(
`ancestor_id` int(11) UNSIGNED NOT NULL,
`descendant_id` int(11) UNSIGNED NOT NULL,
`length` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY(`ancestor_id`, `descendant_id`),
KEY `tree_adl`(`ancestor_id`, `descendant_id`, `length`),
KEY `tree_dl`(`descendant_id`, `length`),
FOREIGN KEY (`ancestor_id`) REFERENCES comments(`comment_id`),
FOREIGN KEY (`descendant_id`) REFERENCES comments(`comment_id`)
) Engine=InnoDB
私がやろうとしていることのより明確な要約は、ancestor_id
時間を共有する 20 のコメントを取得することです。また、各人のコメント 2length
をより深く取得しながら (これらをはるかに少ない量 2 に制限しておきます)、時間順に並べ替えます。
ただし、常に時間でソートするつもりはありません。また、これらcomment_id
すべてを単一のクエリで実行することは可能ですか? どこから始めればよいかよくわかりません。