背景:
サーバーアプリケーションを設計し、さまざまなサブシステム用に個別のDLLを作成しています。話を簡単にするために、2つのサブシステムがあるとします。1)Users
2)Projects
ユーザーのパブリックインターフェイスには、次のようなメソッドがあります。
IEnumerable<User> GetUser(int id);
また、Projectsの公開インターフェースには次のようなメソッドがあります。
IEnumerable<User> GetProjectUsers(int projectId);
したがって、たとえば、特定のプロジェクトのユーザーを表示する必要がある場合は、呼び出すことができます。これによりGetProjectUsers
、オブジェクトがデータグリッドなどに表示するのに十分な情報を返します。
問題:
理想的には、Projects
サブシステムはユーザー情報も保存せず、プロジェクトに参加しているユーザーのIDのみを保存する必要があります。提供するためにGetProjectUsers
、それが呼び出す必要GetUser
のUsers
自身のデータベースに格納された各ユーザーIDのシステム。ただし、これには多数の個別のGetUser
呼び出しが必要であり、User
サブシステム内に多数の個別のSQLクエリが発生します。私は実際にこれをテストしていませんが、このおしゃべりなデザインを使用するとシステムのスケーラビリティに影響します。
私はさておき、サブシステムの分離を置けば、私は可能性があり、両方のシステムにより、単一のスキーマアクセス可能で、すべての情報を保存し、Projects
簡単に行うことができJOIN
、単一のクエリですべてのプロジェクトのユーザーを取得します。クエリ結果からオブジェクトProjects
を生成User
する方法も知っている必要があります。しかし、これは多くの利点を持つ分離を壊します。
質問:
誰もがこれらの個別のGetUser
呼び出しをすべて回避しながら、分離を維持する方法を提案できますGetProjectUsers
か?
たとえば、私が考えていたのは、ユーザーが外部システムにラベルと値のペアでユーザーに「タグを付ける」機能を与え、特定の値を持つユーザーに要求することでした。たとえば、
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
次に、プロジェクトシステムは、プロジェクトに追加された各ユーザーにタグを付けることができます。
AddUserTag(userId,"project id", myProjectId.ToString());
GetProjectUsersの実行中、1回の呼び出しですべてのプロジェクトユーザーをリクエストできます。
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
私がこれについて確信が持てない部分は、はい、ユーザーはプロジェクトにとらわれませんが、実際にはプロジェクトメンバーシップに関する情報はプロジェクトではなくユーザーシステムに保存されます。私は自然に感じないので、ここで私が見逃している大きな欠点があるかどうかを判断しようとしています。