組織階層の推移閉包を表すテーブルがあります(つまり、単一のルートを持つツリー)。
create table ancestry (
ancestor integer,
descendant integer,
distance integer
);
各ユーザーがアクセスを許可されている組織を含む別のテーブルがあります。
create table accessible (
user integer,
organization integer
);
システムは、ユーザーがアクセスできる各組織に関連付けられた支出のロールアップをユーザーに表示します。私はいつでも、ユーザーに会社のビュー(つまり、ルート)を表示して、ユーザーに直接の子組織のリストと、彼の組織が合計にどれだけ貢献しているかを表示することから始めることができます。ほとんどの場合、子は1人であり、ユーザーは複数の子を表示する前に複数のレベルをドリルダウンする必要があります。私は、複数の子供を示す最初の組織(つまり、LCA)からプレゼンテーションを開始したいと思います。
特定のユーザーの場合、ルートへのパスのセットを簡単に見つけることができますが、最も一般的でない祖先を見つけるのに問題があります。私はpostgresql9.1を使用していますが、データベースに依存しないソリューションを好みます。最悪の場合、ルートへのパスをアプリケーションのコードに戻し、そこでLCAを計算できます。