私の今後のプロジェクトでは、(私が呼んでいるもの)「抽象エンティティ参照」を含む設計を検討しています。これは、より一般的なデータ モデルの設計とは大きく異なりますが、必要な柔軟性を実現するために必要な場合があります。他のアーキテクトがこのようなシステムの経験を持っているかどうか、また注意点はどこにあるのか疑問に思っています。
このプロジェクトには、さまざまな人物によるさまざまなエンティティ (論理的にはビジネス オブジェクト、物理的にはデータベース行) へのアクセスを制御するという要件があります。たとえば、次のようなルールを作成したい場合があります。
- ユーザー Alice は Z 社のメンバーです
- ユーザー Bob は、ユーザー Charlie、Dave、および Eve を持つグループ Y のマネージャーです。
- ユーザー Frank は、[重要なビジネス オブジェクト] X のデータと、[重要なビジネス オブジェクト グループ] U の [重要なビジネス オブジェクト] のデータを入力できます。
- ユーザー George は T 社のメンバーではありませんが、T 社のレポートを表示できます。
さまざまなセキュリティ保護可能なオブジェクト、ロール、グループ、およびアクセス許可があり、システムでこれを処理する必要があるという考えです。理想的には、このシステムは、起動後に新しい状況に対応するためのコーディングをほとんど、またはまったく必要としません。それは非常に柔軟でなければなりません。
「従来の」データ設計では、次のようなエンティティ/テーブルがある場合があります。
- ユーザー
- 会社
- ユーザー/会社相互参照
- ユーザー・グループ
- ユーザー/ユーザーグループの相互参照
- CBO (「重要なビジネスオブジェクト」)
- ユーザー/CBO 相互参照
- CBOグループ
- ユーザー/CBOGroup 相互参照
- CBO/CBOGroup 相互参照
- レポートへのアクセス専用のユーザーと会社間の相互参照であるReportAccess
相互参照テーブルの数が多いことに注意してください。このシステムは非常に柔軟ではありません。新しいアクセス手段を追加したいときはいつでも、新しい相互参照テーブルを導入する必要があるからです。つまり、追加のコーディングを意味します。
提案されたシステムでは、すべての主要なエンティティ (ユーザー、会社、CBO) がエンティティと呼ばれる新しいテーブルの値を参照します。(コードでは、これらすべてのエンティティーを Entity スーパークラスのサブクラスにする可能性があります)。次に、エンティティの「サブクラス」でもある Entity * Group を参照する 2 つの追加テーブルがあります。* EntityRelation は、任意のタイプ (グループを含む) の 2 つのエンティティ間の関係です。これにはおそらく、関係を説明/修飾するためのある種の「関係タイプ」フィールドもあります。
このシステムは、少なくとも一見しただけでは、私たちの多くの要件を満たしているように見えます。今後、新しいエンティティを導入する可能性がありますが、これらのエンティティ間のグループ化と関係を処理するために追加のテーブルを作成する必要はありません。これは、Group と EntityRelation が既に処理できるためです。
しかし、これが実際にはうまく機能しないのではないかと心配しています。エンティティ間の関係は非常に複雑になり、人々 (ユーザーと開発者の両方) がそれらを理解するのが非常に難しくなる可能性があります。また、それらは非常に再帰的です。これにより、SQL に依存するレポート作成スタッフにとって事態はさらに困難になります。
似たようなシステムを経験した人はいますか?