SQL Server データベースで使用されている一連の階層データがあります。データは guid を主キーとして格納され、parentGuid はオブジェクトの直接の親を指す外部キーとして格納されます。WebApi プロジェクトの Entity Framework を介して最も頻繁にデータにアクセスします。状況をもう少し複雑にするために、親に適用されるアクセス許可がそのすべての子孫に適用されるように、この階層に基づいてアクセス許可を管理する必要もあります。私の質問はこれです:
私はあちこちを検索しましたが、この状況を処理するのに最適な方法を判断できません。次のオプションがあることを知っています。
Recursive CTEs
階層データを処理するために、Common Table Expression (別名 RCTE) を作成できます。これは通常のアクセスでは最も単純なアプローチのようですが、子オブジェクトのアクセス許可レベルを決定するために使用すると遅くなる可能性があるのではないかと心配しています。- テーブルにデータ型フィールドを作成し、
hierarchyId
SQL Server が提供するGetAncestor()
、IsDescendantOf()
、などの関数を使用できます。これによりクエリがかなり簡単になるようですが、hierarchyId フィールドを正しく維持するには、かなり複雑な挿入/更新トリガーが必要になるようです。インサートとムーブを通して closure table
すべてのリレーションシップをテーブルに格納する を作成できます。私はそれを次のように想像しています:親列と子列、それぞれの親 - >子関係が表されます。(つまり、1->2 2->3 は、データベースでは 1-2、1-3、2-3 として表されます)。欠点は、挿入、更新、および削除のトリガーがかなり単純であるにもかかわらず必要であり、この方法では大量のレコードが生成されることです。
私はあちこち検索してみましたが、これら3つの方法の間でアドバイスを与えるものは何も見つかりません.
PS私はまた、この問題に対する代替ソリューションを受け入れます