タグの親子関係をデータベースに持たせたいのですが、「親タグテーブル」か「子タグテーブル」か、どちらが便利でしょうか? つまり
タグの親子関係をデータベースに持たせたいのですが、「親タグテーブル」か「子タグテーブル」か、どちらが便利でしょうか? つまり 【A】「tagsテーブル」と「parent_tagsテーブル」を作る 【B】「tagsテーブル」と「child_tagsテーブル」を作る のいずれが、どういうときに便利か、という問題です。 例えば次の CREATE になるイメージです。 // タグテーブル CREATE TABLE tags ( ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, tag_name VARCHAR(100), PRIMARY KEY (ID) ); // 【A】の親タグテーブルを作る場合 CREATE TABLE parent_tags ( tag_ID BIGINT(20) UNSIGNED NOT NULL, parent_tag_id BIGINT(20) UNSIGNED NOT NULL, UNIQUE u_parent_tags1 (tag_ID,parent_tag_id), CONSTRAINT fk_parent_tags1 FOREIGN KEY (tag_ID) REFERENCES tags(ID), CONSTRAINT fk_parent_tags2 FOREIGN KEY (parent_tag_id) REFERENCES tags(ID) ); // 【B】の子タグテーブルを作る場合 CREATE TABLE child_tags ( tag_ID BIGINT(20) UNSIGNED NOT NULL, child_tag_id BIGINT(20) UNSIGNED NOT NULL, UNIQUE u_child_tags1 (tag_ID,child_tag_id), CONSTRAINT fk_child_tags1 FOREIGN KEY (tag_ID) REFERENCES tags(ID), CONSTRAINT fk_child_tags2 FOREIGN KEY (child_tag_id) REFERENCES tags(ID) );
ベストアンサー
「どういう使い方をするのか」によります。親子だけなのか、孫(それ以上の階層)もあるのかにもよるでしょう。 個人的には(単純に「親子」だけの関連なら)親子関係のためのテーブルは作らずに create table tags ( id int auto_increment, parent_id int, tag_name varchar(100), primary key (id) ); 子から取得が適切なら parent_id>0(子)のレコードをparent_id順id順で読みつつ自テーブルと join して、親レコードから親のtag_nameも取得する(joinせずに、parent_idがidになっているレコードを直接取得しても可)。 親から取得が適切なら parent_id=0(親)のレコードをid順で読みそのidがparent_idになっているレコード(子)をid順で読むという二重ループにする。 といった感じでできないかを考えると思います(それでマズイとなったら、親子関係のためのテーブルを作るべきかを悩む)。
質問者からのお礼コメント
ご回答誠にありがとうございます。
お礼日時:5/31 2:23