8

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

型号 1

如您所见,这是非常基本的,但我对此有些担忧。User 根实体和 Organization 根实体通过两个一对多关系访问同一个 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。谢谢

4

6 回答 6

4

这是典型的多对多关系。Organization_Users 表是桥接表。Infact NHibernate 和所有其他 ORM 工具都具有支持桥接表的内置功能。

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

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

于 2009-07-09T06:45:29.010 回答
2

在 DDD 中首先要考虑的是:

  • 忘记您的数据库架构(没有数据库!)
  • 从领域的角度来看,您将对这些实体执行什么操作?
于 2009-07-09T16:25:14.477 回答
2

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

如果您的域从用户的角度来看关系,您可以将维护(添加、删除等)关系的方法放在用户上,并在组织上公开一个只读集合。

针对您的第二个设计(如果您编辑了原始问题会更好):我一点也不喜欢它。您的原始设计很好。在设计您的类时,我不一定会忽略数据库,一个好的设计应该准确地建模域并且可以直接在关系数据库中实现。有时您必须在两个方向上妥协才能达到最佳效果。打破聚合界限不会被判入狱。:-)

于 2009-07-09T17:31:11.973 回答
2

我曾多次使用类似于您的第一个模型的方法。这种方法的一个问题是您需要在您的域中创建一个OganizationUser类来处理您的域中的角色标记字段。这会让你在你的代码中留下类似的东西。

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。这似乎不是我想从我的域中支持的东西。

于 2009-07-09T22:28:49.703 回答
1

我的理解是:

一个用户可以属于 0 对多的组织。AND 一个组织由 0 对多用户组成。

这两个都对吗?如果是这样,那对我来说听起来确实是多对多。

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

这使我认为您本身不应该将 user_organization 作为您的域的一部分。感觉就像一个实现细节。

另一方面,在您的域中,拥有一个将用户保存在组织中并存储他们的角色和特定于该关系的其他信息的名册可能是有意义的。

于 2009-07-09T17:14:18.920 回答
0

谢谢大家的回答。他们非常有帮助。

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

替代文字

我的想法是这样的:

  1. 当用户登录站点时,系统会找到他们的帐户,然后返回他们所属的组织列表,并从 user_organizations 对象中获取此信息。

  2. 当用户单击他们所在的组织之一时,会将他们定向到组织的控制面板。

  3. 然后,所选组织在其 org_user_details 中查找该用户的角色,以了解该用户应该对该组织控制面板具有什么访问权限。

那有意义吗?:)

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

您对此有何看法?我是不是想太多了?:P

于 2009-07-09T18:31:53.067 回答