Oop DDD:作为聚合根的地址?

Oop DDD:作为聚合根的地址?,oop,domain-driven-design,aggregate,Oop,Domain Driven Design,Aggregate,我正在努力设计一个地址是最核心信息的系统。在这种情况下,地址不仅仅是几行字符串。我们正在存储市政(代码、名称)、地区(邮政编码、名称)、街道(代码、名称)、属于市政的特定地区街道上的门牌号。这是一个非常规范化的方案 因此,我们有市政、地区、街道和门牌号等实体,每个实体都相互关联,定义了一个人(或其他人)的完整地址 现在我一直在试图弄清楚,拥有一个名为Address的聚合根是否有意义?然后,地址实体(聚合根)将具有对门牌号、街道、地区和市政的引用。然后,一个人将被关联到一个地址 严格地说,这个聚合

我正在努力设计一个地址是最核心信息的系统。在这种情况下,地址不仅仅是几行字符串。我们正在存储市政(代码、名称)、地区(邮政编码、名称)、街道(代码、名称)、属于市政的特定地区街道上的门牌号。这是一个非常规范化的方案

因此,我们有市政、地区、街道和门牌号等实体,每个实体都相互关联,定义了一个人(或其他人)的完整地址

现在我一直在试图弄清楚,拥有一个名为Address的聚合根是否有意义?然后,地址实体(聚合根)将具有对门牌号、街道、地区和市政的引用。然后,一个人将被关联到一个地址

严格地说,这个聚合根不是必需的,但是如果我没有它,我将不得不遍历许多对象来获得完整的地址。基于该参数创建聚合根有意义吗

在这种情况下,用户永远不会引用聚合根以外的任何内容,但是UI可能只显示市政当局(在浏览地址等时)。这是否违反了聚合根概念

我真的很想听听你的建议,并接受这个问题。任何帮助都将不胜感激


关于我的问题的另一次讨论的一点更新

在聚合中需要管理一些不变量。例如我 在一个区/市的街道上不能有门牌号 邮政信箱位于另一个不同的区/市。所以当分配 一个邮箱到一个地址/人,我需要确保他们在同一个地址/人 地区

还有一些一致性边界(如果我理解这个概念的话) 正确的方式)。如果我有一个地址,这必须有一个在一个地区的门牌号 (那个地区的)一条街道。一条街道可以跨越多个地区,因此 确保该街道上的门牌号正确非常重要 地区


有关设计聚合的更新:

门牌号实际上是地址的入口点。门牌号与街道和地区相关联。因此,一个人与一个门牌号相关联。我还想定义的是,一个人是否对该门牌号负有“邮寄责任”。引入聚合根地址,使人与之关联,而不是与门牌号关联。在数据库中,聚合地址将包含与门牌号的1-1关联,而地址与个人的关联为1-*。我应该在哪里存储表示此人是否负有邮政责任的值?我应该在地址聚合中这样做吗?或者你会去哪里
你把它放在哪里了?我的实体也是如此——我应该在哪里指出此人是否负有邮政责任?

我认为,如果

  • 有一个围堵 与其关联的 物体
  • 对象 聚合存储在数据库中, 只有根应该是 可通过查询获得。这个 应获取其他对象 通过遍历关联
  • 您需要在包含的对象中统一实施不变规则
  • 您的场景似乎不能满足这两个条件中的任何一个。所以我的意见是否定的


    同时阅读这篇文章并提供答案:

    为了区分地址是值对象还是实体,问自己一个问题——如果一个人的地址发生变化,而第二个人的地址相同——两者是否都会发生变化?如果它们都发生了变化,地址将被提升为实体(因为地址标识很重要,而不是值)


    为了区分地址是实体还是聚合根,问自己一个问题——地址本身是否有意义,或者它总是和人联系在一起,通过它被修改,和它一起被删除?若地址和person无关,而是单独存在(在您正在建模的模型中,而不是在现实中),那个么地址就是聚合根


    严格地说,这个聚合根不是必需的,但是如果我没有它,我将不得不遍历许多对象来获得完整的地址。基于该参数创建聚合根有意义吗

    不,没有。技术问题不应该影响你的领域。实体可以作为“子集合”,地址可以将市政、城市等联系在一起,但仍然只是一个实体(因为它没有人是没有意义的)

    在这种情况下,用户永远不会引用聚合根以外的任何内容,但是UI可能只显示市政当局(在浏览地址等时)。这是否违反了聚合根概念

    演示文稿不应该也影响您的领域。在我看来,如果只显示实体列表并隐藏它们所属的聚合,这是非常好的


    两个人可以关联到同一个地址,如果其中一个人移动,另一个人不会自动移动

    问题是-您想如何对移动过程建模

    我看到两种方式:

  • 当人员#1移动时,地址被修改,但人员#2的地址不相同,因此-不受影响。在本例中,地址只是一个实体
  • 当person#1移动时,移动过程地址切换到另一个地址。在本例中,-address是聚合根
  • 地址是独立存在的,如果一个人移动到某个地址,他就会与之关联

    这意味着您要坚持第二种方式(当地址是聚合根时)。这很好,并没有什么问题,但您应该重新检查地址是否可以降级为实体,因为这样可以降低域模型的复杂性


    请记住,没有“模型”,只有“模型”。你不能模仿现实