首页
学习
活动
专区
圈层
工具
发布

DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)

1 聚合 实体一般对应业务对象,具有业务属性和业务行为 值对象主要是属性集合,描述实体的状态和特征 但都只是个体化对象,其行为表现出的是个体能力。...即聚合间通过聚合根ID关联引用,若需要访问其它聚合的实体,就要先访问聚合根,再导航到聚合内部实体,外部对象不能直接访问聚合内实体。...设计原则 在一致性边界内建模真正的不变条件 要从限界上下文中发现聚合,我们需要了解模型中真正的不变条件。这样才能决定什么样的对象可以放在一个聚合。 不变条件表示一个业务规则,该规则应该总是保持一致。...好的做法是使用根实体(Root Entity)来表示聚合,其中只包含最小数量的属性或值类型属性。这里的“最小数量”表示所需的最小属性集合,不多也不少。 哪些属性是所需的呢?...简单的答案是:那些必须与其他属性保持一致。比如,一个Product拥有name和 description属性,它们需要保持一致,将它们放在两个不同的聚合中显然无意义。

2.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Entity Framework 系统约定配置

    在EF中是以一种约定的方式进行表、列同实体类进行映射的,与此同时为了提高最大的灵活性EF中可以通过Fluent API和Data Annotations两种方式对映射进行灵活配置。...Entity Framework 默认约定 1.将数据类的类名复数形式作为数据表名称,并且使用“dbo”作为默认架构。   ...3.使用导航属性约束两个表之间的关系,在从表数据类中除了导航属性,推荐定义一个外键属性在从表数据类中(如果不指定将默认生成一个“+”的外键列;此外在主表中推荐定义一个集合从表属性用户导航...例如有一个Order类,主键为OrderID,在OrderDetail类中有一个导航属性Order(Order类型),那么当你定义一个OrderID在OrderDetail中,那么在Order和OrderDetail...Entity Framework 手动定义约定  EF的默认约定不是一成不变的,我们可以选择移除和修改它,例如EF默认生成数据表时将数据类名的复数形式作为表名,下面的代码就可以移除这个规则: using

    1.2K20

    DDD领域驱动设计实战-理解聚合(Aggregate)和聚合根(AggregateRoot)

    1 聚合 实体一般对应业务对象,具有业务属性和业务行为 值对象主要是属性集合,描述实体的状态和特征 但都只是个体化对象,其行为表现出的是个体能力。...不变条件表示一个业务规则,该规则应该总是保持一致。 有多种类型的一致性: 事务一致性 要求立即性和原子性 最终一致性 在讨论不变条件时,我们讨论的是事务一致性。...推荐使用根实体(Root Entity)表示聚合,其中只包含最小数量的属性或值类型属性。 哪些属性是必需的? 最简单的:必须与其他属性保持一致的。...在你的领域中,迫使你设计大聚合的不变条件约束并不多。遇到这种情况,可考虑添加实体或集合,但始终都应将聚合设计得尽量小。...在不持有对象引用的情况下,不能修改其他聚合,因此可避免在同一事务中修改多个聚合。但这样限制性太强,因为在领域模型中,我们总需要对象之间的关联关系来完成任务。对此,又该怎么办呢?

    20K73

    领域驱动设计 (DDD) 总结

    但我们往往也需要考虑到性能问题,尤其是当集合内元素非常多的时候,此时往往需要通过单独查询来获取关联的集合信息; 关联尽量保持单向的关联; 在建立关联时,我们需要深入去挖掘是否存在关联的限制条件,如果存在...聚合与聚合根的特点如下: 每个聚合有一个根和一个边界,边界定义了一个聚合内部有哪些实体或值对象,根是聚合内的某个实体; 聚合内部对象可以直接相互引用,但聚合外部要访问聚合内部对象时,必须通过聚合根进行导航...从更广义的角度来理解,我们经常会像集合一样,从某个类似集合的地方,根据某个条件获取一个或一些对象,往集合中添加对象或移除对象。也就是说,我们需要提供一种机制,可以提供类似集合的接口来帮助我们管理对象。...此外,尽管仓库可以像集合一样在内存中管理对象,但是仓库一般不负责事务处理。一般事务处理会交给工作单元 (Unit Of Work)。关于工作单元的详细信息我在下面的讨论中会讲到。 五....聚合设计原则 6.1 不变性的封装 这个原则强调了聚合的真正用途:除了封装我们本身所关心的信息外,聚合最主要的目的是为了封装业务规则,保证数据的一致性。

    3.7K51

    领域驱动设计简介(下篇)

    实体通常是持久的,通常是可变的并且(因此)倾向于具有一生的状态变化。在许多体系结构中,实体将作为行数据保存在数据库表中。同时,模块(包或命名空间)是确保领域模型保持解耦的关键,并且不会成为一团泥球。...维护这些不变量是聚合根的责任。 但是......只有聚合根才能完全在聚合中维护对象之间的不变量。...存储库,工厂和服务 在企业应用程序中,实体通常是持久的,其值表示这些实体的状态。但是,我们如何从持久性存储中获取实体呢? 一个数据库库是在持久存储的抽象,满足某些条件返回实体。...存储库不是从持久层引入对象的唯一方法。如果使用对象关系映射(ORM)工具(如Hibernate),我们可以在实体之间导航引用,允许我们透明地遍历图。...根据经验,对其他实体的聚合根的引用应该是延迟加载的,而聚合中的聚合实体应该被急切加载。但与ORM一样,期望进行一些调整,以便为最关键的用例获得合适的性能特征。

    82210

    领域驱动设计(DDD)实践之路(三):如何设计聚合

    这些地址对象可以从它们在层次结构中的父对象获取邮政编码,而且如果邮政服务决定重新划分邮政区,那么所有地址都将随之改变。在这里地址是一个实体。...但这却是软件设计中的一个重要问题,幸而我们可以借助“聚合”来应对。 首先,我们需要用一个抽象来封装模型中的引用。聚合就是一组相关对象的集合,我们把它作为数据修改的单元。...除根以外的其他实体都有本地标识,但这些标识只在聚合内部才需要加以区别,因为外部对象除了根之外看不到其他对象。...根ENTITY即Car具有全局标识,它最终负责检查固定规则。 根ENTITY具有全局标识。边界内的ENTITY具有本地标识,这些标识只在从聚合内部才是唯一的,比如上面的车轮集合。...但有些重要的领域操作无法放到实体或值对象中,这当中有些操作从本质上讲是一些活动或动作,而不是对象。

    1.7K30

    如何有效管理XDPeBPF以获得更好的DDoS保护

    此根(可能是虚拟的)组织各种配置实体以形成活动配置。实体要么直接连接到根以进行立即全局访问,要么嵌套在其他实体中以进行结构化组织。...访问特定实体从根开始,按顺序(逐级“解除引用”)进行,直到所需的实体。例如,要从集合中的“选项”结构中检索布尔标志,你需要导航到集合,找到结构,然后检索标志。...随着配置变得更加复杂,条目之间的相互联系也变得更加紧密。几个父条目指向单个子条目或一个条目扮演双重角色的情况很常见,既充当一个实体的属性,又成为集合的一部分。...在这种情况下,需要更新多个映射条目,原子转换是不可行的。但精确且顺序的更新操作可以对配置进行有条不紊的更新。如果按正确的顺序执行,对引用的配置子树的一些操作将变得安全。...尽管 eBPF 缺乏原子替换一组映射的机制,但映射通常链接到特定的 eBPF 程序。将相互连接的映射和相应代码划分为由尾调用链接的单独 eBPF 程序可以解决这个问题。

    83510

    在 EF Core 中操作 PostgreSQL 数据表的 JSONB类型字段

    本文着眼于 JSONB 在 PostgreSQL 中的作用,以及它如何与 Entity Framework Core 连接,帮助开发人员构建严重依赖数据的复杂应用程序。...SELECT details->'specs' FROM products; 筛选数据 '@>' 运算符检查左侧的 JSONB 值是否在顶层包含正确的 JSONB 路径/值条目。...SELECT * FROM products WHERE details->>'brand' = 'Apple'; 从 Items 中选择 Specific Attribute Value 从 jsonb...其中一项功能是对 JSONB 的支持,JSONB 是 PostgreSQL 中的一种 JSON 二进制格式。 定义实体 我们的主要实体是 Product,代表我们库存中的商品。...评论: 客户评论的集合。 翻译: 用于管理多种语言产品名称的字典。 Specification 类封装有关产品的详细信息。

    4.6K00

    解决RAG检索瓶颈:RAPL线图转换让知识图谱检索准确率提升40%

    在RAG架构中,检索(Retrieval)组件成为唯一的关键故障点。 传统的RAG系统主要依赖从大量非结构化文本(如维基百科条目或企业内部文档)中进行检索。...尽管这种方法具有实用性,但其本质上是在海量信息中进行模糊搜索。非结构化文本通常包含冗余信息、语义歧义,且缺乏明确的关系定义。...实体是地标,关系是街道、大道和小巷的复杂组合。要从起点(问题实体)到达目的地(答案),需要在街道网络中导航。虽然可能找到捷径,但也可能迷失在与目标无关的区域中。这正是"最短路径"方法的问题所在。...步骤2:从城市街道到地铁线路(线图转换) 这是RAPL最重要的技术贡献,也是地铁类比的核心。标准图具有节点(实体)和边(关系)。在此图上运行的图神经网络通过聚合来自邻居的信息来更新实体表示。...这种前瞻机制对于防止模型从看似有希望但最终是死胡同的推理路径开始至关重要。 结果是一个不仅检索三元组集合的系统,而是检索一个或多个完整的、有序的、逻辑上连贯的推理路径,然后将其传递给下游的语言模型。

    31410

    DDD聚合设计的困境

    但像知乎,就算Question没了,Answer也会留存。 OO聚合与DDD聚合是什么样的关系呢?...从数据生命周期看,一般如果数据库中顾客数据删除了,那么他对应的订单也会删除。 但不适合建模成聚合。 因为这两个类并没有共同体现一个完整的领域概念;同时,这两个类也不存在不变量的约束关系。...在你的领域中,迫使你设计大聚合的不变条件约束并不多。当你遇到这样的情况时,可以考虑添加实体或者是集合,但无论如何,我们都应该将聚合设计得尽量小。...通过标识引用并不意味着完全丧失了对象导航性。有时在聚合中使用Repository来定位其他聚合。这种作法也被称为失联领域模型(Disconnected Domain Model)。...这会慢慢演化成贫血模型,因为一部分逻辑在对象中,另一部分会放到service中。 所以我们得重新审视一些指导原则。或者时时提醒是不是过多的考虑了实现细节,破坏了模型。

    1.1K30

    使用 EF Core 的 PostgreSQL 中的 JSONB

    本文着眼于 JSONB 在 PostgreSQL 中的作用,以及它如何与 Entity Framework Core 连接,帮助开发人员构建严重依赖数据的复杂应用程序。...本文着眼于 JSONB 在 PostgreSQL 中的作用,以及它如何与 Entity Framework Core 连接,帮助开发人员构建严重依赖数据的复杂应用程序。...它与 PostgreSQL 中的传统 json 数据类型不同,因为它以分解的二进制格式存储数据。这种格式允许高效的数据处理,因为它消除了每次访问 JSON 数据时重新解析 JSON 数据的需要。...其中一个功能是对 JSONB 的支持,这是 PostgreSQL 中的一种 JSON 二进制格式。 定义实体 我们的主要实体是产品,代表我们库存中的商品。...**评论:**客户评论的集合。 **翻译:**用于管理多种语言产品名称的词典。 规范类封装有关产品的详细信息。

    3.8K10

    Entity Framework Core 2.0 入门

    其参数可以是params或者集合. 可以看到这个和之前Add的Sql语句是完全不同的: 这个语句我不是很明白....除了ToList(Async)可以触发查询以外, 遍历foreach也可以触发查询: 但是这种情况下, 可能会有性能问题....因为: 在遍历开始的时候, 数据库连接打开, 并且会一直保持打开的状态, 直到遍历结束. 所以如果这个遍历很耗时, 那么可能会发生一些问题. 最好的办法还是首先执行ToList, 然后再遍历....看一下Sql: 这个过程一共分两步: 1 插入主表, 2,使用刚插入主表数据的Id, 插入子表数据. 2.为数据库中的数据添加导航属性....尽管我只update了一个department, 但是efcore把其他关联的数据都识别出来了. 从DbContext的ChangeTracker属性下的StateManger可以看到有多少个变化.

    3.9K80

    ENRIE(Tsinghua):知识图谱与BERT相结合,为语言模型赋能助力

    作者提出,要将知识嵌入到自然语言模型表达中去,有两个关键的挑战: 知识的结构化编码 对于一个给定的文本,如何从知识图谱中,高效地将和文本相关的常识或知识抽取出来并编码是一个重要问题。...相比于直接使用知识图谱中基于图结构的信息,作者通过TranE这样的知识嵌入算法,对知识图谱的图结构实体进行编码,然后将这富有信息的实体表示作为ERNIE的输入,这样就可以把知识模块中的实体的信息表示,引入到模型下层的语义表示中去...因为不一定每一个token都对应得到KG中的一个entity,所以在大多数情况下m不等于n。所有token的集合也就是字典为V,在KG中所有entity的列表为E。...通过随机地mask一些entity然后要求模型通过知识图谱中实体来进行选择预测,起名为denoising entity auto-encoder(dEA)。...其余的情况下,保持token-entity alignments 不变,来将entity的表示融合进token的表示,以获得更好的语言理解能力。

    2.1K40

    9个数据科学中常见距离度量总结以及优缺点概述

    缺点 尽管这是一种常用的距离度量,但欧几里德距离并不是比例不变的,这意味着所计算的距离可能会根据要素的单位而发生偏斜。通常,在使用此距离度量之前,需要对数据进行标准化。...实际上,它是集合之间相似实体的总数除以实体的总数。例如,如果两个集合有1个共同的实体,而总共有5个不同的实体,那么Jaccard索引将是1/5 = 0.2。...大型数据集可能会对指数产生很大影响,因为数据量大的话可能显著增加并集,同时保持交集不变。 用例 Jaccard索引通常用于使用二进制或二进制数据的应用程序中。...尽管它们的计算方法类似,但Sørensen-Dice索引更直观一些,因为它可以被视为两个集合之间重叠的百分比,这是一个介于0和1之间的值。...实际上,它是集合之间相似实体的总数除以实体的总数。例如,如果两个集合有一个共同的实体,而总共有5个不同的实体,那么DICE指数将是1/5 = 0.2。 ?

    2.1K10

    「首席架构看设计」权威领域驱动设计(DDD)简介

    在某些体系结构中,它还可能负责确保从基础结构/持久层中检索的域对象在与之交互之前已正确初始化(尽管我更喜欢基础结构层执行此操作)。...维护这些不变量是root的责任。 但是......只有聚合根才能完全在聚合中维护对象之间的不变量。...存储库,工厂和服务 在企业应用程序中,实体通常是持久的,其值表示这些实体的状态。但是,我们如何从持久性存储中获取实体呢?...如果使用对象关系映射(ORM)工具(如Hibernate),我们可以在实体之间导航引用,允许我们透明地遍历图形。根据经验,对其他实体的聚合根的引用应该是延迟加载的,而聚合中的聚合实体应该被急切加载。...我们可以定义一个公开我们需要的功能的服务,以便我们的应用程序可以将条目发布到总帐。这些服务有时会定义自己的实体,这些实体可能会持久化;这些实体实际上影响了在另一个BC中远程保存的显着信息。

    1.1K10

    Entity Framework Core 2.0 入门

    其参数可以是params或者集合. 可以看到这个和之前Add的Sql语句是完全不同的: 这个语句我不是很明白....除了ToList(Async)可以触发查询以外, 遍历foreach也可以触发查询: 但是这种情况下, 可能会有性能问题....因为: 在遍历开始的时候, 数据库连接打开, 并且会一直保持打开的状态, 直到遍历结束. 所以如果这个遍历很耗时, 那么可能会发生一些问题. 最好的办法还是首先执行ToList, 然后再遍历....看一下Sql: 这个过程一共分两步: 1 插入主表, 2,使用刚插入主表数据的Id, 插入子表数据. 2.为数据库中的数据添加导航属性....尽管我只update了一个department, 但是efcore把其他关联的数据都识别出来了. 从DbContext的ChangeTracker属性下的StateManger可以看到有多少个变化.

    4.2K140

    一文彻底解析数据库设计思路

    实体关系建模的方法更多依赖于直觉而非机器, 但会导致相同的设计。 E-R 模型 实体 (Entity) 实体是具有公共性质的可区别的现实世界对象集合。...举例: 学生 教师 课程 选课 一般而言, 一个实体被映射到一张关系表中, 代表一组对象的集合; 表中的每一行被称为一个实体发生(Entity Occurrence)或实体实例(Entity...规则三: N-N Relationships 当两个实体 E 和 F 参与一个多对多二元联系 R 时, 在相关的关系型数据库中, 联系被映射成一个表 T, 表 T 中包含所有从 E 和 F 转化而来的两个表的主键的所有属性...若 max_card(F, R) = 1,并且 F 为联系中的多方, 那么从实体 F 转换出的关系表 T 中包括从 E 转换出的关系表的主键属性列, 这被称为 T 的外键(可以简单理解为表的一列是另一张表的主键...便于增,删,更新。 保持依赖性 (FD Preserved) 前置条件: 通用表 T, 函数依赖集 F, 无损分解 {T1,T2,…,Tk}。

    1.4K20

    数据库设计

    实体关系(Entity-Relationship, E-R)概念 E-R 模型是一种描述数据库的抽象方法 实体关系建模的方法更多依赖于直觉而非机器, 但会导致相同的设计 E-R 模型 实体 (Entity...) 实体是具有公共性质的可区别的现实世界对象集合 举例 学生 教师 教师 课程 选课 一般而言, 一个实体被映射到一张关系表中, 代表一组对象的集合; 表中的每一行被称为一个实体发生(Entity Occurrence...)或实体实例(Entity Instance), 代表一个特定对象 在 E-R 图中, 用矩形框表示 属性 (Attribute) 属性是描述实体(Entity)或者关系(Relationship)...若 max_card(F, R) = 1,并且 F 为联系中的多方, 那么从实体 F 转换出的关系表 T 中包括从 E 转换出的关系表的主键属性列, 这被称为 T 的外键(可以简单理解为表的一列是另一张表的主键...(Ti), 则称在 Ti 保持了依赖性 若 和 相互等价, 即 , 称这个分解是保持依赖性的 超键 (Super Key) 超键在关系中能够唯一标识元组的属性集, 允许有多余属性 给定表

    3.6K20
    领券