質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

2回答

4358閲覧

[アルゴリズム][データベース設計]階層構造のデータベース設計

makiikeda1216

総合スコア128

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

1グッド

3クリップ

投稿2017/02/17 08:31

編集2017/02/17 10:43

階層構造をデータベースに落とし込む際に範囲検索が簡単な
[入れ子集合モデル]を採用しようと思っています。

木構造(親node一つのみ)なら
[入れ子集合モデル]に落とし込むことで検索の高速化を計れると思います。

ですが

セミラティス構造(親nodeを複数持てる)の場合
[入れ子集合モデル]に落とし込むと複数の親を持つnodeを複製する必要が
でてきます。結果、システムが複雑になりパフォーマンスが落ちてしまいます。

どなたか複製せずに、セミラティス構造のnode検索を高速化するアルゴリズム、
アイディアをご存知の方がいらっしゃいましたらご教授ください。
特に、[入れ子集合モデル]である必要はございません。

追記:[条件]複数の親を持てるのは葉nodeのみ
追記:使用しているデータベース:MySQL
追記:検索=親を指定するとその子孫たる葉nodeすべて取得
追記:nodeに対する操作
親を指定しnode追加➡️必須
既存のnodeを削除➡️必須
既存のnode間にnodeを追加➡️必須
既存のnode間の親子関係を削除➡️必要なし
既存のnode間に親子関係を追加➡️必要なし

[問題のところ]
親を複数指定しnodeを追加➡️追加したnodeは葉nodeで複数の親をもつ葉nodeにnodeは追加できません。

KiyoshiMotoki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2017/02/17 08:43

お使いのDB製品の名称(MySQL や PostgreSQL など)を記載すると、具体的な回答がつきやすくなると思います。階層構造の表現は、DB製品によって得意・不得意が分かれるからです。
makiikeda1216

2017/02/17 08:46

追記依頼ありがとうございます、使用しているDBを追記しました。
yuba

2017/02/17 08:55

ここでいう検索とは、「親を指定するとその子孫ノードがすべて取得できる」ことを意味するでしょうか。「それとも子孫たる葉ノードをすべて取得」?
makiikeda1216

2017/02/17 09:00

yubaさん「子孫たる葉ノードをすべて取得」になります
yuba

2017/02/17 09:07

他にはどんな操作ができる必要がありますか? 親(複数)を指定しノードを追加? 既存のノード間に親子関係を追加? 既存の親子関係を削除?
makiikeda1216

2017/02/17 09:15

yubaさん操作に関して追記で記載させていただきます。少々時間をください。
t_obara

2017/02/17 10:01

ちなみに、DBMSはMySQLでないとダメなのですよね?選択の余地はなしということ?
makiikeda1216

2017/02/17 10:08 編集

MySQLでないとダメです。ですが他のDBMSで何か事例がありましたら教えていただきたいです。
t_obara

2017/02/17 10:45

事例>グラフDBというNoSQLの一種が合っているかなと。
guest

回答2

0

閉包テーブルモデルはいかがでしょう。親子関係を別のテーブルに保持するため、複数の親を持つことやノードの追加・削除が柔軟に可能です。

SQL: ナイーブツリーと閉包テーブルモデル
閉包テーブル(Closure Table)を試してみた

投稿2017/02/18 02:01

SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Panzer_vor

2017/02/19 01:25

横から失礼します。 閉包テーブルの活用は実にRDBらしいアプローチで良いですよね。 別テーブルで階層を管理する手法はいずれのDBMSでも適用可能ですし。 MySQLだと今の所不可能ですが、他の主要なDBMSだと隣接データモデルとCTEを用いた再帰クエリも割と手軽な手法かもしれませんね。
makiikeda1216

2017/02/22 08:51

回答ありがとうございます。閉包テーブルによるnode管理をすれば確かに複数の親を持っても葉ノードの検索が可能となりますが、現在想定する葉ノードの数が20万ノードを想定しており今後も拡張する予定がありますので、今のところ葉ノードを別テーブルに切り離してleft joinを使った入れ子集合モデルによる管理が一番パフォーマンスがよさそうです。
yuba

2017/02/24 00:13

20万ですか。深さは大体どのくらいに?
guest

0

この課題、まだ生きているでしょうか。
質問を読み直してみたのですが、

複数の親を持てるのは葉nodeのみ

この条件があるのだったら話は簡単かと思いました。
枝構造と葉を切り離してしまえばいいのです。
葉のことをいったん忘れればセミラティス構造ではなくこれは単純なツリーです。それならば入れ子集合モデルで簡単に実現できます。

その上で、葉とツリーノードを結びつける交差テーブルを設ければいい、となります。

検索操作は、親ツリーノードを一個指定するとまず入れ子集合モデルに従ってその子孫ツリーノードをすべて求め、それと交差テーブルをinner joinし、group by leaf_id すれば属する葉の一覧が得られるという流れになります。葉の情報も必要ならさらに葉テーブルもinner joinする感じですか。

投稿2017/04/06 03:24

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問