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

news2024/11/26 15:23:47

尼恩说在前面:

在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,小伙伴实现了 逆天改命

另外,尼恩也给一线企业提供 《DDD 的架构落地》企业内部培训,目前给不少企业做过DDD 的内部咨询和培训,效果非常好。

在这里插入图片描述

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea护眼主题推荐

idea是一个非常好用的开发工具,程序员们天天都与它打交道,最近写代码眼睛的了干眼症,对屏幕特别敏感,所以关注了下主题相关的内容,jetbrains官方也有主题市场插件:https://plugins.jetbrains.com/search?t…

IDEA终端环境配置

Idea如何配置终端; 第一步:找到我的电脑,右击——属性——高级系统设置——环境变量 先配置path: 在后面加入:C:\Program Files (x86)\Java\jdk1.7.0_75\bin(每个人放置jdk的位置不同。) 新建classpath:…

【比邻智选】MR880A模组

🚀高性价比,5G/4G双模,稳定可靠 🌐功能丰富,5G特性一应俱全 🧩多封装兼容,适配性强,灵活升级智能设备

照片文件夹惊变白板?揭秘背后的原因及恢复秘籍

我们生活在一个数字化时代,照片已经成为记录生活的重要方式。然而,当你兴冲冲地打开保存珍贵记忆的文件夹时,却发现里面的照片全都变成了白板,这种心情无异于晴天霹雳。那么,这究竟是怎么回事呢? 照片文件夹…

基于springboot + vue 实现的简易博客系统

项目效果图 登陆页面 文章列表 发表文章 用户管理 栏目管理 数据统计 后端技术栈后端主要采用了: 1.SpringBoot 2.SpringSecurity 3.MyBatis 4.部分接口遵循Restful风格 5.MySQL 前端技术栈前端主要采用了: 1.Vue 2.axios 3.Elemen…

接口自动化框架篇:接口框架中的日志记录封装!

接口自动化框架中的日志记录是一个重要的环节,它能帮助我们追踪接口的执行情况、调试问题、分析测试结果等。通过规范的日志记录,我们可以更好地管理和维护接口自动化测试代码。 以下是一个从0到1的详细规范,来进行接口框架中的日志记录封装…

SalFAU-Net:显著性目标检测的显著性融合注意U-Net

SalFAU-Net:显著性目标检测的显著性融合注意U-Net 摘要IntroductionRelated Works SalFAU-Net: Saliency Fusion Attention U-Net for Salient Object Detection 摘要 显著目标检测(SOD)在计算机视觉中仍然是一个重要的任务,其应用范围从图像…

2024数维杯B题完整思路24页+配套代码1-4问+可视化结果图

后续参考论文也会进行一个更新 2024年数维杯数学建模B题主要关注生物质和煤共热解问题的研究 点击链接加入群聊【2024数维杯数学建模ABC题资料汇总】: 2024数维杯B题完整思路18页1-5问配套代码后续参考论文https://www.jdmm.cc/file/2710636 该段文字的第一个问题…

双层嵌线和线径的替代方案

电机只有三种嵌线方式 1.单层嵌线 2.双层嵌线 3.单双层嵌线 前面说的都是单层嵌线,下面介绍双层嵌线! 双层嵌线一般线径都比较粗! 线径只有几种规格的,大线径可用几根小线径替代! 满足的原则:大线径A的…

OpenHarmony 实战开发——编译4.0 bete2及master分支,添加参数--no-prebuilt-sdk跳过编译sdk

简介 用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,简称“应用”。一个应用所对应的软件包文件,称为“应用程序包”。 OpenHarmony 提供了应用程序包开发、安装、查询、更新、卸载的管理机制,方便开发者…

项目管理在软件工程中的实践方法

软件工程是一个复杂的过程,涉及到需求分析、设计、编码、测试和维护等多个阶段。有效的项目管理对于确保软件项目成功至关重要。以下是结合附件内容,关于项目管理在软件工程中实践的一些方法。 1. 明确项目愿景和目标 在项目启动之初,项目经…

做业务有时候确实是需要一些运气

无论是考试还是做业务,那些考得好或者是业绩做得突出的人,都喜欢谦虚地说一句:只是运气好,就是运气好而已,也没什么..... 有人说:发财也要靠好运气,一个人运气好真的如此重要吗?那么…

查看微信小程序主包大小

前言 略 查看微信小程序主包大小 在微信开发者工具右上角找到“详情->基本信息” 查看微信小程序主包构成 通过微信开发者工具中的“代码依赖分析”工具查看

农业智能小型气象站功能有哪些?

TH-NQ10农业智能小型气象站是一种结合了智能化技术的小型气象监测设备,主要用于农业生产环境中。它配备了各种传感器,用于实时监测和记录气象参数,如温度、湿度、风速、降雨量等,以及土壤参数,如土壤墒情、土壤温度等。…

【OceanBase诊断调优】—— SQL 执行报错而不能计入 SQL_AUDIT 的情况

通常,执行成果的 SQL 都会计入 SQL_AUDIT 中,而执行报错的 SQL 则需要依据其执行报错的阶段来决定是否计入 SQL_AUDIT 中。 在 OceanBase 数据库中,SQL 请求的执行流程如图所示。 如果 SQL 在进入 Executor 阶段前发生报错,则该 …

YOLOV5更换转置卷积,助力涨点!

由于转置卷积是nn库自带的,所以我们直接找到models文件夹中的yolo.py文件中的 parse_model函数,再在如下图的地方添加转置卷积模块 # YOLOv5 🚀 by Ultralytics, AGPL-3.0 license """ YOLO-specific modules.Usage:$ python models/yolo.py --cfg yolov5s.…

【Android Studio】开启真机调试

1 打开手机的开发者模式 各种款式的手机进入开发者模式的情况不同,但大致是在 【关于手机】中多次点击系统版本即可进入。这里以小米8为例,记录下流程。 1.1 进入手机开发者模式 【设置】->【我的设备】->【全部参数】->【MIUI版本】连续点击3…

科技查新中医学科研项目查新点如何确立与提炼?案例讲解

一、前言 医学科技查新包括立项查新和成果查新两个部分,其中医学立项查新,它是指在医学科研项目申报开题之前,通过在一定范围内进行该课题的相关文献检索 ( 可以根据项目委托人的具体要求,进行国内检索或者进行国外检索 ) &#x…

驾驶证OCR识别接口如何对接

驾驶证OCR识别接口也叫驾驶证文字识别OCR接口,指的是传入驾驶证照片,精准识别静态驾驶证图像上的文字信息。那么驾驶证OCR文字识别接口如何对接呢? 首先我们找到一家有驾驶证OCR识别接口的服务商,数脉API,然后注册账户&#xff0…

探索计算之美:HTML CSS 计算器案例

本次案例是通过HTML和CSS,我们可以为计算器赋予独特的外观和功能; 在这个计算器中,你将会发现: 简洁清晰的界面设计,使用户能够轻松输入和查看计算结果。利用HTML构建的结构,确保页面具有良好的可访问性和…