首页 > 其他分享 >DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)

DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)

时间:2024-05-10 13:11:33浏览次数:25  
标签:面试题 聚合 实体 建模 和表 面试 尼恩 DDD

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领

免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)

尼恩特别说明: 尼恩的文章,都会在 《技术自由圈》 公号 发布, 并且维护最新版本。 如果发现图片 不可见, 请去 《技术自由圈》 公号 查找

尼恩说在前面:

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:

DDD 的外部接口调用,应该放在哪一层?

DDD架构,如何落地?

谈谈你的DDD落地经验?

谈谈你对DDD的理解?

如何保证RPC代码不会腐烂,升级能力强?

微服务如何拆分?

微服务爆炸,如何解决?

你们的项目,DDD是怎么落地实操的?

所以,这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V155版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

除了本文,尼恩输出了一个 《DDD学习圣经》系列,帮助大家彻底掌握DDD。

同时,尼恩持续输出最新的《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取,后台回复:领电子书

蚂蚁面试真题:说说,DDD聚合和MYSQL表的对应关系是什么?

这是尼恩社群,一个小伙伴面蚂蚁,遇到的。

他没有回答好,这里给大家做个系统化、体系化、结构化的梳理。

首先:说说什么是聚合?

“聚合”即“高内聚,低耦合”中的“内聚”之意;

聚合是业务和逻辑紧密关联的实体和值对象组合而成,聚合是数据修改和持久化的基本单元,一个聚合对应一个数据的持久化;

聚合在DDD分层架构中属于领域层,领域层包含了多个聚合,共同实现核心业务逻辑,聚合内的实体以充血模型实现个体业务能力,以及业务逻辑的高内聚; 跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现;

首先我们来看下聚合模式的定义:

将实体和值对象划分为聚合并围绕着聚合定义边界。

选择一个实体作为每个聚合的根,并仅允许外部对象持有对聚合根的引用。作为一个整体来定义聚合的属性和不变量,并把其执行责任赋予聚合根或指定的框架机制。

一个聚合包含一个聚合根(aggregation root)和一些相关的其他领域对象。

然后:说说,什么是聚合根?

在《DDD学习圣经》中,我们讲到了“什么是聚合根”,这里再重复一下。

聚合根中的“聚合”即“高内聚,低耦合”中的“内聚”之意;

而“根”则是“根部”的意思,也即聚合根是一种统领式的存在。

事实上,并不存在一个教科书式的对聚合根的理论定义,你可以将聚合根理解为一个系统中最重要最显著的那些名词,这些名词是其所在的软件系统之所以存在的原因。

为了给你一个直观的理解,以下是几个聚合根的例子:

  • 在一个电商系统中,一个订单(Order)对象表示一个聚合根
  • 在一个CRM系统中,一个客户(Customer)对象表示一个聚合根
  • 在一个银行系统中,一次交易(Transaction)对象表示一个聚合根

你可能会问,软件中的概念已经很多了,为什么还要搞出个聚合根的概念?

我们认为这里至少有2点原因:

  1. 聚合根遵循了软件中“高内聚,低耦合”的基本原则
  2. 聚合根体现了一种模块化的原则,模块化思想是被各个行业所证明的可以降低系统复杂度的一种思想。所谓的DDD是“软件核心复杂性应对之道”,也即这个意思,它将软件系统在人脑中所呈现地更加有序和简单,让人可以更好地理解和管控软件系统。

在实际项目中识别聚合根时,我们需要对业务有深入的了解,因为只有这样你才知道到底哪些业务逻辑是内聚在一起的。

这也是我们一直建议程序员和架构师们不要一味地埋头于技术而要多关注业务的原因。

事实上,如果让一个从来没有接触过DDD的人来建模,十有八九也能设计出上面的订单、客户和交易对象出来。

没错,DDD绝非什么颠覆式的发明,依然只是在前人基础上的一种进步而已,这种进步更多的体现在一些设计原则上,对此我们将在下文进行详细阐述。

最后,说说Domain 聚合和MYSQL 数据表的对应关系是什么

Domain 聚合属于领域建模

MYSQL 数据表设计属于 DB建模

注意,从理论上来说, DB建模(数据表建模)和领域建模没有关系,二者在处于不同的 设计阶段:

  • 领域建模处于 概要设计阶段, 理清楚业务的内外边界,业务的内外流程,成果物为 HLD 概要设计文档。
  • DB建模 处于 详细设计阶段, 理清楚业务的“关系数据模型”进而推导出“物理数据模型”,成果物为 LLD 详细设计文档。

具体如下图

DDD建模的四个标准动作,具体请参见 尼恩《DDD学习圣经》以及配套视频。

数据建模的经典方法就是 E-R Model建模, 而当我们做MYSQL E-R建模的时候,我们需要考虑:

  • 需要建什么主表 - 可以类比为对象 (当然也有些表只是为了关系映射)
  • 表里面需要什么列 - 可以类比为这对象所需的属性
  • 需要什么关联 - 表现数据对象与数据对象之间的联系

当然,E-R Model是数据模型的一种表现形式(数据建模不只是E-R Model一种表现形式) ,E-R Model以数据为中心,关注的是对象的实体和关系,建模时并不考虑Entity的行为。

在E-R概念模型的基础上可以建立“关系数据模型”进而推导出“物理数据模型”,这是一条以E-R Model为起始的数据建模的路线

ER模型分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。
ER模型的实体(entity)即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示,每个实体都有自己的实体成员(entity member)或者说实体对象(entity instance),例如学生实体里包括张三、李四等,实体成员(entity member)/实体实例(entity instance) 不需要出现在ER图中。

ER模型的属性(attribute)即数据对象所具有的属性,例如学生具有姓名、学号、年级等属性,用椭圆形表示,属性分为唯一属性( unique attribute)和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性。

ER模型的关系(relationship)用来表现数据对象与数据对象之间的联系,例如学生的实体和成绩表的实体之间有一定的联系,每个学生都有自己的成绩表,这就是一种关系,关系用菱形来表示。
ER模型中关联关系有三种:

1对1(1:1) :1对1关系是指对于实体集A与实体集B,A中的每一个实体至多与B中一个实体有关系;反之,在实体集B中的每个实体至多与实体集A中一个实体有关系。
1对多(1:N) :1对多关系是指实体集A与实体集B中至少有N(N>0)个实体有关系;并且实体集B中每一个实体至多与实体集A中一个实体有关系。
多对多(M:N) :多对多关系是指实体集A中的每一个实体与实体集B中至少有M(M>0)个实体有关系,并且实体集B中的每一个实体与实体集A中的至少N(N>0)个实体有关系。

在数据建模中通常将E-R Model就称之为概念数据模型,接下来的层面是关系数据模型和物理数据模型;

而Domain 建模是属于对象建模、业务建模的范畴,Domain 聚合和MYSQL 数据表 二的区别是职责不同, ER建模关心数据如何存储,Domain 对象建模需要为对象建立职责(对象的行为)。

当然Domain 建模 和E-R Model的分析具有很大的相似性,

在一些极为简单的业务系统、业务场景中,二者可以做简单的映射:

  • Domain 模型里边 聚合根 可以映射到 E-R Model的 主表

  • Domain 模型里边 普通实体、值对象 可以映射到 E-R Model的 关联表

问题1:微服务一定要DDD,为什么?TDD和DDD 有何关系?

具体答案,请参见此文: https://mp.weixin.qq.com/s/80Gza3-9pO8bYlSJoEDVWg

问题2:DDD架构,如何落地?

具体答案,请参见此文: https://mp.weixin.qq.com/s/_NAHYDIvmT7EbffXkIpqYw

问题3:DDD 领域层,该如何设计?

具体答案,请参见此文:https://mp.weixin.qq.com/s/njBl791vFCd94UplPJEFKw

问题4:微服务如何拆分?原则是什么?

具体答案,请参见此文: https://mp.weixin.qq.com/s/bExjRkVbDLTV2Wf9G6dzrg

问题5:给一个需求,请用DDD设计出来

具体答案,请参见此文: https://mp.weixin.qq.com/s/izzUXIpVmURq6hTCEN0ARQ

参考文献

尼恩特别编著 《DDD学习圣经》

阿里DDD大佬:从0到1,带大家精通DDD

阿里大佬:DDD 落地两大步骤,以及Repository核心模式

阿里大佬:DDD 领域层,该如何设计?

极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?

阿里大佬:DDD中Interface层、Application层的设计规范

字节面试:请说一下DDD的流程,用电商系统为场景

DDD如何落地:去哪儿的DDD架构实操之路

DDD落地:从腾讯视频DDD重构之路,看DDD极大价值

DDD落地:从美团抽奖平台,看DDD在大厂如何落地?

美团面试:微服务如何拆分?原则是什么?

DDD神药:去哪儿结合DDD,实现架构大调优

DDD落地:从网易新闻APP重构,看DDD的巨大价值

DDD落地:从阿里单据系统,看DDD在大厂如何落地?

DDD落地:有赞的生产项目,DDD如何落地?

DDD落地:从携程订单系统重构,看DDD的巨大价值

DDD落地:京东的微服务生产项目,DDD如何落地?

DDD落地:从阿里商品域,看DDD在大厂如何落地?

240Wqps,美团用户中台, 如何使用DDD架构?

DDD落地:爱奇艺打赏服务,如何DDD架构?

大厂痴迷DDD:从高德portal重构,看DDD的巨大价值

高开面试:给一个需求,请用DDD设计出来

大厂痴迷DDD:从高德portal重构,看DDD的巨大价值

说在最后:有问题找老架构取经

DDD 相关的面试题,是非常常见的面试题。也是核心面试题。

以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典》V174,在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

另外,如果没有面试机会,可以找尼恩来帮扶、领路。

  • 大龄男的最佳出路是 架构+ 管理
  • 大龄女的最佳出路是 DPM,

图片

女程序员如何成为DPM,请参见:

DPM (双栖)陪跑,助力小白一步登天,升格 产品经理+研发经理

领跑模式,尼恩已经指导了大量的就业困难的小伙伴上岸。

前段时间,领跑一个40岁+就业困难小伙伴拿到了一个年薪100W的offer,小伙伴实现了 逆天改命

技术自由的实现路径:

实现你的 架构自由:

吃透8图1模板,人人可以做架构

10Wqps评论中台,如何架构?B站是这么做的!!!

阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

100亿级订单怎么调度,来一个大厂的极品方案

2个大厂 100亿级 超大流量 红包 架构方案

… 更多架构文章,正在添加中

实现你的 响应式 自由:

响应式圣经:10W字,实现Spring响应式编程自由

这是老版本 《Flux、Mono、Reactor 实战(史上最全)

实现你的 spring cloud 自由:

Spring cloud Alibaba 学习圣经》 PDF

分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)

实现你的 linux 自由:

Linux命令大全:2W多字,一次实现Linux自由

实现你的 网络 自由:

TCP协议详解 (史上最全)

网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!

实现你的 分布式锁 自由:

Redis分布式锁(图解 - 秒懂 - 史上最全)

Zookeeper 分布式锁 - 图解 - 秒懂

实现你的 王者组件 自由:

队列之王: Disruptor 原理、架构、源码 一文穿透

缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

缓存之王:Caffeine 的使用(史上最全)

Java Agent 探针、字节码增强 ByteBuddy(史上最全)

实现你的 面试题 自由:

4800页《尼恩Java面试宝典 》 40个专题

免费获取11个技术圣经PDF:

标签:面试题,聚合,实体,建模,和表,面试,尼恩,DDD
From: https://www.cnblogs.com/crazymakercircle/p/18184098

相关文章

  • Java面试题:@PostConstruct、init-method和afterPropertiesSet执行顺序?
    在Spring框架中,@PostConstruct注解、init-method属性、以及afterPropertiesSet()方法通常用于初始化Bean的逻辑。它们都提供了在Bean创建和初始化完成后执行的方法,但执行顺序有所不同。想要知道@PostConstruct、init-method、afterPropertiesSet()的执行顺序,只要搞明白它们各自在......
  • 蚂蚁面试:DDD外部接口调用,应该放在哪一层?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • mysql面试题
    索引失效1.模糊查询2.使用函数和计算:3.不匹配的数据类型:4.使用OR条件的不同索引列:5.复合索引的最左前缀原则:6.索引列在条件中使用负向查询:如NOTIN、NOTEXISTS、NOTLIKE等负向查询条件可能会导致索引失效。7.索引列在条件中使用NULL:当索引列中包含NULL值,并且在查询条件......
  • 拿去面试!一个基于 DDD 的高性能短链系统
    众所周知,商城、RPC、秒杀、论坛、外卖、点评等项目早早就烂大街了,翻开同学的简历一看10个里面有9个是这些,翻遍全网再很难找到一个既有含金量又能看得懂的项目,针对此,我研发了这样一个可以快速上手又具有较多技术点的短链项目:高性能短链系统EZLink!技术栈如下:DDD架构Reac......
  • 大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题
    大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题之后会不定期更新每日一题sql系列。SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。1.题目问题1:如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平......
  • Unity面试手册:2021最新Unity面试题汇总
    1、什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别?碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。......
  • java面试题汇总
    基础篇1、java中==和equals的区别?==是比较运算符,Equals是方法==在判断基本数据类型的时候,就是判断数值是否相等,比如int10和int20的时候就是判断10和20这两个数是否相等==在判断引用数据类型的时候,也就是对象是否相等的时候,判断的是内存地址是否相等,也就是这两......
  • ElasticJob-面试题-高频题
    ElasticJob1ElasticJob的失效转移-故障转移-机制是怎样的?答案:当任务执行失败或者节点宕机时,ElasticJob具备故障转移和重试的能力,能够自动进行故障恢复,确保任务的稳定运行。底层原理是怎么样的?底层实现原理就是:Elasticjob的故障恢复机制是通过分布式协调服务-zookeeper和任务节点......
  • 「软件测试面试题集解析课」限时优惠,助你高效备战,一举拿下心仪职位
    面试时常被难倒?不知道如何准备才能脱颖而出?别担心!我们为您整理了一份的软件测试经典面试题视频课,覆盖了操作系统、编程语言、测试用例设计、计算机网络、数据库、算法与数据结构等内容,助您轻松应对软件测试面试挑战。首先,从操作系统与常用命令面试题,让您牢固掌握基础知识;编程语言......
  • ddddocr 文字验证码识别库 pip install下载失败
    第三方开源库,验证码识别github地址:https://github.com/sml2h3/ddddocr安装pipinstallddddocr下载失败的话使用国内安装源pip3install-ihttps://pypi.tuna.tsinghua.edu.cn/simpleddddocr附带一个api快速部署github地址:https://github.com/sml2h3/ocr_api_server......