10

私はいくつかの階層的なデータを持つ新しいプロジェクトを開始しており、その時点でデータベースに格納するためのすべてのオプションを検討しています。データベース内の階層データ:再帰的クエリ対クロージャーテーブルとグラフデータベース

私はPostgreSQLを使用していますが、再帰的なクエリが可能です。また、closure tablesのようなリレーショナルデータベースの設計パターンを調べ、neo4jなどのグラフデータベースソリューションを調べました。

私はこれらのオプションを決めるのが難しいと感じています。たとえば、私のRDBMSで再帰的なクエリが可能であるとすれば、クロージャーテーブルを使用するのは理にかなっていますが、これは保守性とパフォーマンスの点でグラフデータベースソリューションとどう違うのでしょうか?

何か意見や経験があれば幸いです!

+1

そのクロージャーテーブルのものは実際にはきれいです。あなたが再帰的なクエリを持っているが、まだきちんとしていれば不必要です。それを私の注目に持ってくれてありがとう。 –

答えて

8

全体の閉鎖テーブルが冗長です)とそれに関連するトリガーを示します。

私はpostgresで再帰的なクエリを使って簡単なテストを行っています。テーブル内の数百万行のクエリでは、特定の子のすべての親を返すために依然として< 10msでした。親のレベルに応じて、すべての子供を返すことも速かった。それは、ディスクIOがクエリ速度よりもむしろ行をフェッチすることに依存するように見えました。これはシングルユーザで行われていたため、ロード時にどのように動作するかは不明です。私はあなたがまたメモリのテーブルの大部分を保持することができればそれが非常に速いと思う(そしてpostgresを正しく設定する)。親IDでテーブルをクラスタリングすることも役に立ちました。

+0

ありがとう、私はそれがそうかもしれないと思った – tospo

+1

ベンチマークのおかげで。 –

+0

一般的には、Bill KarwinのSQL Antipatternsを参照してください。ただし、adjacency listアプローチ(parent_idがフィールドの場合)の代替案を使用したい場合があります。 – Joffer

2

クロージャテーブルのレベルフィールド(「深度」)は冗長です。それを計算するためにただ1つの再帰的なクエリが必要です。それはそれについてまとめています。あなたは、私はそれはあなたが余分なIO(およびディスク・スペースとの契約よりも、一度把握する必要があり、複雑な再帰クエリを持ってはるかに良いことだと思う再帰​​クエリ:)

を使用できるかどう

関連する問題