- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当拥有某种“复杂”的域模型时,不可避免地会存在相关实体(这就是聚合根的意义)。但我该如何从事件中重建关系呢?在序列化事件中通过其他聚合 ID 进行搜索显然不是一个选择。
我有一个使用这种数据库结构的想法(例如)。它具有仅包含 id 和外键的聚合表,以简化从不同实体检索所有必要事件的过程。这不是违反了ES原则吗?
最佳答案
DDD says that "rich domain model" consists from entities which handles business logic, and we work with them as they model the domain objects
是的,当您使用事件溯源时仍然如此。
So I can imagine i.e. order.addItem(product) method, where OrderItem creating and making relationship with Order and Product.
啊哈,不——这两种方法都不是。如果 Order 和 Product 是不同的聚合,则 order.addItem(product)
不是您将使用的拼写。订单和产品不对产品的状态承担责任。或者,换句话说,我们从不将聚合根嵌套在彼此内部。
根据 DDD 规则,通常的拼写为 order.addItem(product.id)
。请注意这一重要区别:更改订单不能更改产品的任何详细信息。
这是要点的一部分:域中的每个状态都有一个负责维护其一致性的权威机构。
注意:拼写 order.addItem(product)
对于模型来说是有意义的,其中 Product 是一个不是聚合根的实体,而是从属于 Order(更准确地说,每个 Product只与一个订单相关联)。
But if Item has many-to-one relationship to Order, shouldn't it contain orderId instead? (Not Order containing list of ItemId). But that would mean it should be Item.AddToOrder(order.Id), which makes not so much sense.
简单的回答是,根据您决定如何对数据建模以及哪些项目负责维护聚合的完整性,您会获得不同的方法拼写。
向后工作 - 聚合的部分动机(而不仅仅是在整个模型周围有一个大的一致性边界)是并发修改模型的不同部分的想法。 OrderItem 是否是与 Order 不同的聚合将部分取决于同时修改两个不同 OrderItem 的重要性。
对于在线购物车之类的情况,这可能不是非常重要。
对于多方尝试同时修改同一订单的设置,例如
OrderItem.create(order.id, product.id)
这也不是没有道理的。
And still, aggregate root contains other aggregates, and OrderItem in that case is aggregate, not aggregate root or value object.
聚合根负责一个聚合。该聚合(从根本上来说就是“状态”)在概念上可以是从属于根的多个实体的当前状态,每个实体管理整体的特定部分。
And if I'm right, aggregate root contains business logic to control inner aggregates, so we still need to build aggregate root which contains other entities in it.
“内部聚合”没有意义——聚合不能嵌套。 实体嵌套,最外面的实体扮演聚合根的角色。
那么,我们如何构建嵌套实体?
让我们退后一步,看看我们通常如何创建单个实体。我们运行一些查询(如 getById)来获取我们之前保存的状态。
Factory {
Entity fromState(currentState) {
return new (entity);
}
State fromEntity(theEntity) {
return theEntity.getState();
}
}
嵌套实体的工作方式相同,下级实体接管部分工作。对于订单来说,它可能看起来像......
Factory {
Order fromState(currentState) {
List<OrderItem> items = ...
for (State.Item itemState : currentState.items()) {
OrderItem orderItem = OrderItem.from(itemState)
items.add(orderItem)
}
return new Order(items);
}
}
Order {
State getState() {
State currentState = State.EMPTY;
for(OrderItem orderItem : this.items) {
currentState = currentState.addItemState(orderItem.getState())
return currentState
}
}
当我们使用事件源时,变化的一点是我们使用事件集合而不是状态。
Factory {
Order fromEvents(history) {
// The one tricky bit -- the history we will be looking
// at is a mix of histories from all of the entities that
// coordinate the changes to the aggregate, so we may need
// to untangle that.
Map<OrderItemId, Events> = itemHistories
for (Event e : history )
items.put(e.orderItemId, e)
List<OrderItem> items = ...
for (Events events: itemHistories.values) {
OrderItem orderItem = OrderItem.from(events)
items.add(orderItem)
}
return new Order(items);
}
}
Order {
List<Event> getEvents () {
List<Event> events = new List();
for(OrderItem orderItem : this.items) {
events.addAll(orderItem.getEvents())
}
return events
}
}
关于architecture - 如何正确处理事件溯源中的聚合关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44438522/
下面的说法正确吗? “人最好的 friend 是狗。” public class Mann { private BestFriend dog; //etc } 最佳答案 我想说这样
我一直在 documentation 中查看 Laravel 4 中的关系我正在尝试解决以下问题。 我的数据库中有一个名为“事件”的表。该表具有各种字段,主要包含与其他表相关的 ID。例如,我有一个“
我的表具有如下关系: 我有相互链接的级联下拉框,即当您选择国家/地区时,该国家/地区下的区域将加载到区域下拉列表中。但现在我想将下拉菜单更改为基于 Ajax 的自动完成文本框。 我的问题是,我应该有多
我正在尝试弄清楚如何构建这个数据库。我之前用过Apple的核心数据就好了,现在我只是在做一个需要MySQL的不同项目。我是 MySQL 的新手,所以请放轻松。 :) 对于这个例子,假设我有三个表,Us
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。 文档间可以通过嵌入和引用来建立联系。 MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多)
您能解释一下 SQL 中“范围”和“分配单元”之间的区别或关系吗? 最佳答案 分配单元基本上只是一组页面。它可以很小(一页)或很大(很多页)。它在 sys.allocation_units 中有一个元
我有一个表 geoLocations,其中包含两列纬度和经度。还有第二个表(让我们将其命名为城市),其中包含每对唯一的纬度和经度对应的城市。 如何使用 PowerPivot 为这种关系建模?创建两个单
我想用 SQLDelight 建模关系,尤其是 一对多关系。 我有 2 张 table :recipe和 ingredient .为简单起见,它们看起来像这样: CREATE TABLE recipe
我是 Neo4J 新手,我有一个带有源和目标 IP 的简单 CSV。我想在具有相同标签的节点之间创建关系。 类似于... source_ip >> ALERTS >> dest_ip,或者相反。 "d
我正在创建一个类图,但我想知道下面显示的两个类之间是否会有任何关联 - 据我了解,对于关联,ClassA 必须有一个 ClassB 的实例,在这种情况下没有但是,它确实需要知道 ClassB 的一个变
是否可以显示其他属性,即“hasTopping”等? 如何在 OWLViz 中做到这一点? 最佳答案 OWLViz 仅 显示类层次结构(断言和推断的类层次结构)。仅使用“is-a”关系进行描述。 OW
public class MainClass { ArrayList mans = new ArrayList(); // I'm filling in this arraylist,
我想知道“多对二”的关系。 child 可以与两个 parent 中的任何一个联系,但不能同时与两个 parent 联系。有什么办法可以加强这一点吗?我也想防止 child 重复条目。 一个真实的例子
我有一个已经创建的Grails插件,旨在支持许多应用程序。该插件具有一个Employee域对象。问题在于,当在主应用程序中使用该应用程序中的域对象时,需要将其引用回Employee对象。因此,我的主应
我有一个类(class)表、类(class)hasMany部分和部分hasMany讲座以及讲座hasMany评论。如果我有评论 ID 并且想知道其类(class)名称,我应该如何在 LectureCo
我有一个模型团队,包含 ID 和名称。所有可能的团队都会被存储。 我的模型游戏有两列 team_1 和 team_2..我需要哪种关系? 我已经测试了很多,但它只适用于一列.. 最佳答案 也许你可以试
我读了很多关于 ICE 或 Corba 等技术中使用的仆人和对象的文章。有很多资源我可以读到这样的东西: 一个仆人可以处理多个对象(为了节省资源)。 一个对象可以由多个仆人处理(为了可靠性)。 有人可
嗨, 我有一个令人沮丧的问题,我在这方面有点生疏。我有两个这样的类(class): class A{ int i; String j ; //Getters and setters} class B
class Employee { private String name; void setName(String n) { name = n; } String getNam
如果您有这样的关系: 员工与其主管员工之间存在多对一关系 员工与其部门的多对一关系 部门与其经理一对一 我会在 Employee 实体中写入: @ManyToOne (cascade=CascadeT
我是一名优秀的程序员,十分优秀!