背景:
我正在设计一个服务器应用程序,并为不同的子系统创建单独的dll。为简化起见,假设我有两个子系统: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
都可以访问的单个模式中,并且可以简单地执行a操作,JOIN
以在单个查询中获取所有项目用户。Projects
还需要知道如何User
从查询结果中生成对象。但这打破了具有许多优点的分离。
问题:
有人可以建议一种在避免所有这些单独GetUser
通话的同时保持分隔的方法GetProjectUsers
吗?
例如,我曾想过让用户为外部系统提供使用标签值对“标记”用户并请求具有特定值的用户的能力,例如:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
然后,Projects系统可以在将每个用户添加到项目中时对其进行标记:
AddUserTag(userId,"project id", myProjectId.ToString());
在GetProjectUsers期间,它可以在一次调用中请求所有项目用户:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
我对此不确定的部分是:是的,用户与项目无关,但实际上有关项目成员资格的信息存储在用户系统中,而不是项目中。我只是感觉不自然,所以我试图确定我是否缺少一个很大的劣势。