处理数据库和架构问题
Working with database & architectural issue
我正在开发一个网络应用程序(不是 ASP.NET),我遇到了一个小的架构问题:
所以,我有两个 class 与用户一起工作。
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
// Other properties...
}
public class Profile
{
public int Id { get; set; }
public string PhotoUrl { get; set; }
public string DisplayName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<PostItem> Posts { get; set; }
}
我不得不拆分这些 classes 因为有一个功能允许您查看特定成员的个人资料,显然您不想从包含用户密码、姓名的数据库中检索数据和其他私人的东西(虽然它没有显示在视图中)。所以我将此数据存储在不同的 table 中:table Users 包含个人信息,而 table Profiles 包含 public 个(任何人都可以查看)。
但同时,为了不破坏单一职责原则,我不得不实现UserRepository和ProfileRepository classes 做一些检查、添加和其他事情。
他们来了:
问题 1:处理用户注册的代码现在变成了真正的地狱,我必须通过实例化两个存储库来检查两个不同的 table 中是否存在具有特定用户名的记录。
问题2:同样在查看public数据的页面,需要显示最新的帖子,但是这里又出现了一个问题:无法存储复杂的值在一个专栏中,所以我也必须将帖子存储在另一个 table 中。这意味着我需要实现 PostRepository,同时 属性 Posts in Profile class 没用(虽然我需要它来显示视图中的最新帖子),因为为了检索最新帖子,您需要查看 UserRepository 中的其他 table,但它应该由 PostRepository。例如,评论也是如此。
所以,这是我的小问题。有什么建议吗?
好的,依次拿取每一项;
1) 通过一个存储库检查用户的身份并将他们对存储在另一个存储库中的应用程序的权限检查是完全正常的。事实上,这是联合身份背后的基本思想。考虑到您可能会扩展您的应用程序以允许 Facebook 提供身份,但权限由您自己的应用程序提供,您会发现将它们分开是有意义的。
2) 是的,绝对是。是什么让您认为像 Posts 这样的大容量存储最好由您在其中存储低更改率数据集(如 Permissions)的同一个存储库提供服务?一个可能在 Mongo 中,另一个在 Active Directory 中,身份是 OAUTH。您会看到,由于您拥有整个应用程序,您将这些视为不必要的复杂性,而它们代表了良好的架构分离。
Identity => 不属于您的应用程序。缓慢的变化率。
权限 => 由您的应用程序拥有。缓慢的变化率。
帖子 => 由您的应用程序拥有。快速变化的愤怒。
仅查看这三个用例,使用不同的存储库似乎是个好主意,因为它们具有如此不同的配置文件。如果最终您的存储库都映射到 SQL 服务器(或其他)实现,那么就这样吧;但是通过在架构上分离这些,您可以使用最好的底层实现。
我正在开发一个网络应用程序(不是 ASP.NET),我遇到了一个小的架构问题:
所以,我有两个 class 与用户一起工作。
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
// Other properties...
}
public class Profile
{
public int Id { get; set; }
public string PhotoUrl { get; set; }
public string DisplayName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<PostItem> Posts { get; set; }
}
我不得不拆分这些 classes 因为有一个功能允许您查看特定成员的个人资料,显然您不想从包含用户密码、姓名的数据库中检索数据和其他私人的东西(虽然它没有显示在视图中)。所以我将此数据存储在不同的 table 中:table Users 包含个人信息,而 table Profiles 包含 public 个(任何人都可以查看)。
但同时,为了不破坏单一职责原则,我不得不实现UserRepository和ProfileRepository classes 做一些检查、添加和其他事情。
他们来了:
问题 1:处理用户注册的代码现在变成了真正的地狱,我必须通过实例化两个存储库来检查两个不同的 table 中是否存在具有特定用户名的记录。
问题2:同样在查看public数据的页面,需要显示最新的帖子,但是这里又出现了一个问题:无法存储复杂的值在一个专栏中,所以我也必须将帖子存储在另一个 table 中。这意味着我需要实现 PostRepository,同时 属性 Posts in Profile class 没用(虽然我需要它来显示视图中的最新帖子),因为为了检索最新帖子,您需要查看 UserRepository 中的其他 table,但它应该由 PostRepository。例如,评论也是如此。
所以,这是我的小问题。有什么建议吗?
好的,依次拿取每一项;
1) 通过一个存储库检查用户的身份并将他们对存储在另一个存储库中的应用程序的权限检查是完全正常的。事实上,这是联合身份背后的基本思想。考虑到您可能会扩展您的应用程序以允许 Facebook 提供身份,但权限由您自己的应用程序提供,您会发现将它们分开是有意义的。
2) 是的,绝对是。是什么让您认为像 Posts 这样的大容量存储最好由您在其中存储低更改率数据集(如 Permissions)的同一个存储库提供服务?一个可能在 Mongo 中,另一个在 Active Directory 中,身份是 OAUTH。您会看到,由于您拥有整个应用程序,您将这些视为不必要的复杂性,而它们代表了良好的架构分离。
Identity => 不属于您的应用程序。缓慢的变化率。 权限 => 由您的应用程序拥有。缓慢的变化率。 帖子 => 由您的应用程序拥有。快速变化的愤怒。
仅查看这三个用例,使用不同的存储库似乎是个好主意,因为它们具有如此不同的配置文件。如果最终您的存储库都映射到 SQL 服务器(或其他)实现,那么就这样吧;但是通过在架构上分离这些,您可以使用最好的底层实现。