これは、しばらく私を悩ませてきた精神的なエクササイズです。この種の問題を解決するには、どのような戦略を使用しますか?
次の単純なデータベース構造を考えてみましょう。ディレクトリがあり、明らかにそれらのツリーです。また、常にいくつかのディレクトリに常駐するコンテンツ アイテムもあります。
create table directory (
directoryId integer generated always as identity primary key,
parentId integer default null,
directoryName varchar(100)
);
create table content (
contentId integer generated always as identity primary key,
directory integer references directory(directoryId),
contentTitle varchar(100),
contentText varchar(32000)
);
ここで、ディレクトリ ツリーが巨大で、コンテンツの量が膨大であると仮定しましょう。ソリューションは適切にスケーリングする必要があります。
主な問題: 指定されたディレクトリとそのサブディレクトリから見つかったすべてのコンテンツ アイテムを効率的に取得する方法は?
私の見方では、SQL を使用してサブセレクトのすべての directoryIds を簡単に取得することはできません。私は正しいですか?
単純な再帰ループを使用して、アプリケーション側でこれを解決できます。ただし、これは実際には非常に重くなる可能性があり、特に妥当な最初のアクセス時間を隔離するために、トリッキーなキャッシングが必要になる場合があります。
マテリアライズド クエリ テーブルを作成し、多次元インデックスを動的に追加することもできます。可能ですが、実装の混乱。複雑すぎる。
私の最も好きな解決策は、おそらく次のような新しいテーブルを追加することです
create table subdirectories (
directoryId integer,
subdirectoryId integer,
constraint thekey primary key (directoryId,subdirectoryId)
)
ディレクトリが移動/削除/作成されているときは、常に手動で更新するようにしてください。したがって、常に directoryId を使用して選択を行い、より複雑なクエリのサブ選択を含め、サブディレクトリのすべての ID を取得できます。また、rdbms がクエリを適切に最適化できることも気に入っています。
皆さんはどう思いますか?