我在这个模型中打破了我的聚合边界吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在这个模型中打破了我的聚合边界吗?相关的知识,希望对你有一定的参考价值。

我正在使用NHibernate建模一个非常基本的ASP.NET MVC应用程序,我似乎陷入了我的设计。这是我模型的草图:

model 1

正如你所看到的,这是非常基本的,但我有一些担忧。用户根实体和组织根实体通过两个一对多关系访问同一Organization_Users实体子实体。这似乎不对,我认为我打破了聚合边界。这个模型对我来说很有趣,但我喜欢这个主意,因为我希望有这样的代码:

var user = userRepository.Load(1);
var list = user.Organizations; // All the organizations the user is a part of.

var org = orgRepository.Load(1);
var list = org.Users; // All the users in an organization.

表格和角色中的额外数据也将由组织实体使用。这是一个糟糕的设计吗?如果你有任何想法会很棒。我还在试着想一想DDD的想法。谢谢

答案

我曾多次使用类似于你的第一个模型的方法。这种方法的一个缺点是您需要在域中创建一个OganizationUser类来处理来自Domain的Role和Flagged字段。这会在你的代码中留下类似的东西。

var user = userRepository.Load(1);
var list = user.OrganizationUsers; // All the organizations the user is a part of including their role and flagged values.

var organization = list[0].Organization; 

*如果您经常在所有用户组织中进行迭代,您可能希望与OrganzitionUser一起急切加载组织实体

使用您提交的第二个设计,看起来您可以将用户添加到OrgUserDetails而无需将用户添加到OrganizationUser。这似乎不是我想要从我的域支持的东西。

另一答案

这是典型的多对多关系。而“组织用户”表是桥接表。事实上NHibernate和所有其他ORM工具都有内置功能来支持桥接表。

这个问题应该在数据建模级别而不是在应用程序级别上解决。您应该分析您的数据模型,建议避免多对多关系(在某种意义上,如果不是域模型的必要性,您应该尽量避免多对多关系)。

首先,您需要确保数据模型中的多对多关系是映射域实体所必需的。完成此操作后,图表中显示的模型可以在应用程序级别映射这些关系

另一答案

DDD要考虑的第一件事是:

  • 忘记你的数据库架构(没有数据库!)
  • 从域的角度来看,您将对实体执行哪些操作?
另一答案

我认为你的模型很好。我通常会想到域聚合根源,当我想到它们时,根据公开的内容,而不是内部实现。通过关系,我想到了关系中哪个实体“穿裤子”。也就是说,将用户添加到组织或将组织添加到用户是否更自然?在这种情况下,两者都可能有意义,用户加入组织;组织接受用户的会员资格。

如果您的域从用户的角度看到了该关系,您可以将这些方法用于维护(添加,删除等)用户关系,并在组织上公开只读集合。

为了回应你的第二个设计(如果你编辑了原始问题会更好):我根本不喜欢它。你原来的设计很好。在设计类时,我不一定会忽略数据库,一个好的设计应该准确地建模域并在关系数据库中直接实现。有时你必须在两个方向妥协才能达到最佳位置。破坏聚合边界没有监禁。 :-)

另一答案

我的理解是:

用户可以属于0对多组织。 AND组织由0到多用户组成。

这些都是正确的吗?如果是这样,那对我来说听起来像是多对多。

在多对多中,你几乎需要一种类似关系的对象来弥补这种差距。问题是,域中没有user_organization。

这让我觉得你不应该将user_organization作为域的一部分。感觉就像一个实现细节。

另一方面,也许在您的域中有一个名册来保存组织中的用户并存储他们的角色以及特定于该关系的其他信息。

另一答案

谢谢大家的回答。他们非常乐于助人。

当我更多地考虑我的模型时,我勾勒出了一些我认为会更好的新东西。

alt text

我的想法是这样的:

  1. 当用户登录到站点时,系统会找到他们的帐户,然后返回他们所在的组织列表,并从user_organizations对象获取此信息。
  2. 当用户点击其中一个组织时,它们就会将它们引导到组织的控制面板。
  3. 然后,所选组织在其org_user_details中查找该用户的角色,以了解该用户应对该组织控制面板具有哪些访问权限。

那有意义吗? :)

我觉得这在模型中会很好,但我对数据库的实现有些怀疑。我知道我甚至不应该担心它,但我不能打破我的坏习惯!您可以看到user_organizations对象和org_user_details对象中存在一些重复数据。我不是数据库专业人员,但这是一个糟糕的数据库设计?我是否应该将来自user_organizations和org_user_details的数据合并到一个表中,就像我在第一篇文章中的那样,然后告诉NHibernate用户将其视为多对多关系,而组织将其视为一对多关系?这听起来像是在欺骗系统。对不起,如果我对此感到非常困惑。

你对此有何看法?我在想这个吗? :P

以上是关于我在这个模型中打破了我的聚合边界吗?的主要内容,如果未能解决你的问题,请参考以下文章

我打破了我的 Mysql View 查询。我如何解决它?

tailwindcss 在我的 Angular 项目中打破了我的一些风格

我应该在子视图模型中存储对父视图模型的引用吗?

TextView用字母打破了我的话

打破 Serverless 落地边界,阿里云 SAE 发布 5 大新特性

添加新实体标量时实体框架 4 映射片段错误