Domain driven design 当关系是数据库规范化的一部分时,如何处理域中的关系

Domain driven design 当关系是数据库规范化的一部分时,如何处理域中的关系,domain-driven-design,clean-architecture,hexagonal-architecture,Domain Driven Design,Clean Architecture,Hexagonal Architecture,您有Job*--1Board,因此在数据库中的jobs表中有Board\u id 现在,在域中,Job可以在没有Board的情况下生存。因此,考虑向其添加boardId属性对我来说不符合逻辑 通过存储库管理它可以吗?例如调用BoardRepository.addJob(Board-Board,Job-Job)?因此,存储库会将作业映射到数据库对象,然后在插入作业时添加board\u id字段 问题是。。。 如果我想通过/jobs/{id}查询作业,我需要在域类中具有boardId属性,这样它就不

您有
Job
*--1
Board
,因此在数据库中的
jobs
表中有
Board\u id

现在,在域中,
Job
可以在没有
Board
的情况下生存。因此,考虑向其添加
boardId
属性对我来说不符合逻辑

通过
存储库管理它可以吗?例如调用
BoardRepository.addJob(Board-Board,Job-Job)
?因此,存储库会将作业映射到数据库对象,然后在插入作业时添加
board\u id
字段

问题是。。。 如果我想通过
/jobs/{id}
查询作业,我需要在域类中具有
boardId
属性,这样它就不会映射到正确的DTO


希望我说得清楚。

通常每个存储库有一个聚合。所以Repository.addJob(Board-Board,Job-Job)似乎不是一个好的选择。我不知道你的问题领域。。但当我们将董事会作为一个集合或集合的根实体时,董事会就负责管理其工作。所以它保存了一个作业列表,其中作业可能是另一个实体。通常,聚合是一个由连接的域对象组成的集群,其作用类似于一个门面,用于操纵其状态及其实体和值对象的状态。 通过应用这些原则,您可能会以如下方式结束:

Board.addJob(Job job)    
BoardRepository.add(Board board)
如果您的查询变得太复杂,并且不适合您的DDD模型,那么只需添加一个额外的QueryService将简单的DTO映射到您的数据库,就可以在逻辑上分离写模型和读模型。 希望我能帮点忙:)

存储库是对持久性策略的抽象。因此,您将在域层中为存储库提供一个接口:

接口存储库{
增加(董事会);
更新(董事会);
删除(BoardId);
get(BoardId);
}
如果您使用SQL持久性策略,那么您将在基础架构层(例如)中实现此接口,如下所示

类SqlBoardRepository实现BoardRepository{ ... }
因此,是的,存储库负责持久化聚合。每个聚合将有一个存储库!不是每个实体都有一个存储库

主键和外键是与数据库相关的主题,通常在域模型中您并不关心它们。域模型中的实体由业务密钥(也可以用作主键)标识。例如,isbn在全球范围内标识一本书,它是一个图书实体的业务密钥,也可以用作数据库中的主键。有时,当在持久性模型中使用业务密钥过于复杂时,您可以在实体中使用额外的代理密钥,该代理密钥主要在持久性层上标识实体。 您可以使用数据库中的业务密钥或代理密钥对域对象之间的关系进行建模,sql存储库负责将域模型映射到数据库,反之亦然


也许你应该读一读,这样你会理解得更好。Eric Evans的蓝皮书或Vaughn Vernon的实现域驱动设计是一个良好的开端:)

通常每个存储库有一个聚合。所以Repository.addJob(Board-Board,Job-Job)似乎不是一个好的选择。我不知道你的问题领域。。但当我们将董事会作为一个集合或集合的根实体时,董事会就负责管理其工作。所以它保存了一个作业列表,其中作业可能是另一个实体。通常,聚合是一个由连接的域对象组成的集群,其作用类似于一个门面,用于操纵其状态及其实体和值对象的状态。 通过应用这些原则,您可能会以如下方式结束:

Board.addJob(Job job)    
BoardRepository.add(Board board)
如果您的查询变得太复杂,并且不适合您的DDD模型,那么只需添加一个额外的QueryService将简单的DTO映射到您的数据库,就可以在逻辑上分离写模型和读模型。 希望我能帮点忙:)

存储库是对持久性策略的抽象。因此,您将在域层中为存储库提供一个接口:

接口存储库{
增加(董事会);
更新(董事会);
删除(BoardId);
get(BoardId);
}
如果您使用SQL持久性策略,那么您将在基础架构层(例如)中实现此接口,如下所示

类SqlBoardRepository实现BoardRepository{ ... } 因此,是的,存储库负责持久化聚合。每个聚合将有一个存储库!不是每个实体都有一个存储库

主键和外键是与数据库相关的主题,通常在域模型中您并不关心它们。域模型中的实体由业务密钥(也可以用作主键)标识。例如,isbn在全球范围内标识一本书,它是一个图书实体的业务密钥,也可以用作数据库中的主键。有时,当在持久性模型中使用业务密钥过于复杂时,您可以在实体中使用额外的代理密钥,该代理密钥主要在持久性层上标识实体。 您可以使用数据库中的业务密钥或代理密钥对域对象之间的关系进行建模,sql存储库负责将域模型映射到数据库,反之亦然


也许你应该读一读,这样你会理解得更好。Eric Evans的蓝皮书或Vaughn Vernon的实现域驱动设计是一个良好的开端:)

感谢您的回答。在您的示例中,当您将一个作业添加到一块板上,并且它得到持久化时,您如何持久化它??存储库是否由savin负责