リピドのアイデアは良いですが、残念ながら、提案されたソリューションには明らかにマイナーだが重大な欠陥があり、3 番目の要件をカバーしていません。関連クラスとしてモデル化された Role は、User オブジェクトと Document オブジェクトの間のリンク インスタンスとしてのみ存在できます。このソリューションでは、ロールを独立したインスタンスとして定義することはできません! また、ロールの再利用は許可されません。
この問題を解決する 2 つの解決策があります。追加の条件に従って、それらの中から選択する必要があります (注を参照)。

- 3 つの概念 (ユーザー、ドキュメント、ロール) はすべて互いに独立して存在し、自由かつ独立して作成および照会できます。
- 「アクセス」の新しい概念は、ユーザーが特定のドキュメントのコンテキストでロール (または複数のロール) を持っているという事実をモデル化します。Access をモデル化するには、さらに独自の属性が必要かどうかに応じて、2 つの方法があります (図を参照)。独立したクラスとしてアクセスすると、ロールの再利用が可能になります。どちらのソリューションでも、アクセスにはドキュメントが 1 つ、ユーザーが 1 つ、ロールが 1 つ以上あります。
- ユーザーは、アクセスできるドキュメントごとに 1 つ以上のロールを持つことができます
- getAllUsers、getAllDocuments、gettAllRoles、getUsersRoles(Document)、getRoles(User, Document) など、考えられるすべてのクエリが可能です。
UPDATE(コメントの後)
オブジェクトのランタイム構造を説明するオブジェクト図を次に示します (これは、n-ry 関連ではなく関連クラスを持つ 2 番目のクラス図に基づいています)。

コメントの注意事項を参照してください。Access インスタンスがクラスと関連インスタンス (リンク) の両方であるわけではありません。そのため、関連付けられた両方のクラスのインスタンスが常に 1 つだけあり、この場合はロールが 1 つだけです。一方、各ユーザーは多くのドキュメント (0.. ) にアクセスでき、各ドキュメントは 0 人以上のユーザー (0.. ) からアクセスできます。