当前位置: 首页 > news >正文

领域驱动设计(DDD)【7】之数据库设计

文章目录

  • 一 物理数据模型概述
  • 二 参考词汇表
  • 三 租户管理的数据库设计
  • 四 组织管理的数据库设计
  • 五 项目管理数据库设计
  • 六 工时管理的数据库设计
  • 与"经验驱动设计"的差异
  • 与“ER 图法”的差异

  • 模型驱动设计可以分成两大部分:模型的建立和模型的实现。模型的建立要求模型和业务需求一致,模型的实现要求实现和模型一致。而数据库设计,则属于模型的实现。
  • 数据库设计需要和领域模型保持一致。
  • 按照领域建模的四个模块,依次进行数据库设计。
    在这里插入图片描述

一 物理数据模型概述

  • 数据库设计属于模型驱动设计中的“模型实现”阶段,核心目标是将领域模型转化为包含表结构、字段、主键/外键关系和约束条件的物理数据模型。具体包括:建立表结构、定义字段数据类型与约束、确定主键/外键关系。物理模型的建立需遵循”实现与模型一致”原则,通过领域模型推导数据库结构。
  • 物理数据模型支持两种等价表达方式:
  1. 使用绘图工具(如做点io)制作的符号化图示。
  2. SQL标准建表语句(CREATETABLE)两种方式可相互转换,图示法更直观便于沟通。

  • 表结构符号规范包含三部分:
  1. 首行:表名称(英文命名)
  2. 第二行:主键定义(字段名+数据类型+PK标记)
  3. 后续行:字段列表(属性映射与补充字段)

  • 命名规范要求:
  1. 表名使用词汇表规定的英文简称(如租户→tenant)
  2. 主键可采用极简命名(id)或表名组合(tenant_id)
  3. 每个表必须包含四个审计字段:
    1. created_at(创建时间)
    2. created_by(创建人ID)
    3. last_updated_at(最后修改时间)
    4. last_updated_by(最后修改人ID)

二 参考词汇表

分类中文英文英文简称
通用经理managermng
通用成员membern/a
通用负责人leadern/a
通用记录recordn/a
通用备注notesn/a
通用类别typen/a
通用添加addn/a
通用签订signn/a
通用使……生效enforcen/a
通用结束(项目、合同等)closen/a
通用创建/建立createn/a
通用启动startn/a
通用分配assignn/a
通用更换changen/a
租户管理租户tenantn/a
组织管理组织organizationorg
组织管理员工employeeemp
组织管理岗位postn/a
项目管理客户clientn/a
项目管理合同contractn/a
项目管理项目projectn/a
工时管理工时effortn/a

三 租户管理的数据库设计

  • 一个实体可以映射为一个数据库表。
    在这里插入图片描述
  • name 表示租户的名称。created_at,created_by,last_updated_at 和 last_updated_by 分别表示一条记录的创建时间、创建人、最后一次修改时间和最后一次修改人,创建人和最后修改人保存的是用户的 id。
    在这里插入图片描述

四 组织管理的数据库设计

在这里插入图片描述

  • 按照领域模型,租户和组织是一对多关联。一对多关联,在数据库设计时可以映射成一个外键。FK(foreign key)代表外键。FK=tenant_id 说明org表中指向tenant表的外键是tenant_id字段。在基于云的应用里,为减少数据库处理的瓶颈,不主张建立真正的外键,而是用程序来保证外键约束。但是在物理数据模型里,希望表达外键参照,方便理解数据表间的关系,把实线箭头换成虚线箭头,表示虚拟外键。
  • 关联上的多重性决定了外键字段的非空约束(NOT NULL)。租户和组织间的关联,在租户端实际是“1..1”,一个组织至少会关联一个租户,最多也只能关联一个租户。“1..1”前面的“1”就映射成了组织表里tenant_id字段后面的非空约束。
    在这里插入图片描述
  • 数据库中其他所有表都有一个指向tenant表的虚拟外键,以便区分是哪个租户的数据。如果每个虚拟外键都画出来,我们的图会变得很乱,所以后面就只在表中写出tenant_id
    在这里插入图片描述
  • 接下来,用类似的方法完成组织、组织类别和员工实体。
    在这里插入图片描述
  • 首先org(组织)表有一个指向自身的虚拟外键superior_id,表示组织之间的上级关系,对应于领域模型中的自关联。emp(员工)表和 org表之间有两个方向相反的虚拟外键,一个表示组织的负责人关系,另一个表示员工归属的组织。另外,emp表中的numid_numnamegenderdob分别表示员工号、身份证号、姓名、性别和出生日期(date of birth)。

  • 岗位和员工之间是多对多关联。必须增加一个关联表,来表达两者之间的关系。
    在这里插入图片描述
    在这里插入图片描述
  • emp_post表来表达多对多的关联。表中包含post (岗位) 和emp两个表的主键作为自己的虚拟外键。采用由emp_idpost_id两个字段组成的复合主键。
  • 一般来说,主张用单独的id主键,只有符合以下两个条件时,才应该使用上面这种联合主键:
    第一,两个外键字段,例如emp_idpost_id,唯一决定了一条记录;
    第二,这个表的主键没有被其他表作为外键引用。

五 项目管理数据库设计

在这里插入图片描述

  • 接着做项目管理模块,按照之前的前面,画出项目管理模块的物理数据模型图。
    在这里插入图片描述
  • 为避免整张图像蜘蛛网一样凌乱,每个模块画一张图。emp表在组织管理中出现过一次,在项目管理中又出现,所以使用emp: 2说明这是 emp 表的第 “2” 次出现。

六 工时管理的数据库设计

在这里插入图片描述
在这里插入图片描述

与"经验驱动设计"的差异

  • 相较于依赖直觉的经验驱动设计(即"拍脑袋法"),领域驱动设计(DDD)方法强调通过领域模型与业务专家对齐需求,再转化为数据库设计。这种方法的优势体现在:
  1. 领域知识传递有效性:技术化的数据模型和建表语句难以被业务专家理解,而DDD通过领域模型实现业务与技术的高效沟通,确保数据库设计准确反映业务需求。
  2. 设计规范性保障:经验驱动设计易违反数据库范式(如第三范式),导致数据冗余和一致性问题。DDD的领域模型转换过程天然符合范式要求,其设计结果通常满足第三范式标准。

与“ER 图法”的差异

  • 相较于传统ER图法(实体-联系模型),领域驱动设计(DDD)的领域建模方法具有以下核心区别:
  1. 表达能力差异:领域模型(UML类图)是ER图的超集,既能完整表达ER图的实体关系,还能补充业务规则、行为逻辑等ER图无法涵盖的要素,因此可完全替代ER图。

  2. 应用范围差异:ER图仅描述静态数据结构,服务于数据库设计;领域模型同时整合数据与行为,可同步指导程序设计与数据库设计,确保系统一致性。

  3. 方法论定位差异:ER图属于传统软件工程的设计阶段产物,而领域模型对应分析阶段的核心产出。DDD通过领域模型直接衔接分析与设计,消除了传统方法中概念设计→逻辑设计→物理设计的阶段割裂。

  • 领域模型补全属性后即等效于传统逻辑设计,其转换为物理数据模型的过程即为物理设计
http://www.lqws.cn/news/491905.html

相关文章:

  • 基于 Spark 实现 COS 海量数据处理
  • AntDesign栅格系统全解析:Row与Col实战指南
  • Java封装过程中的getter/setter究竟有什么用?
  • 爬虫003----requests库
  • ABP VNext + Apache Kafka Streams:构建高吞吐、生产级实时流处理服务
  • 自回归(AR)与掩码(MLM)的核心区别:续写还是补全?
  • 采集MFC软件的数据方法记录
  • 【Java面试】你是怎么控制缓存的更新?
  • Linux系统能ping通ip但无法ping通域名的解决方法
  • 【源码+文档+调试讲解】基于web的运动健康小程序的设计与实现y196
  • 【科研绘图系列】R语言绘制论文组合图(multiple plots)
  • 【Leetcode】有效的括号、用栈实现队列、用队列实现栈
  • 数据赋能(313)——合作共享——跨界融合
  • STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!
  • 马斯克YC技术核弹全拆解:Neuralink信号编译器架构·星舰着陆AI代码·AGI防御协议(附可复现算法核心/开源替代方案/中国技术对标路径)
  • CSS 中aspect - ratio属性的用途及应用
  • Mermaid学习第二部
  • Netty内存池核心:PoolChunkList解析
  • 【附源码】考试报名系统设计与实现+SpringBoot + Vue (前后端分离)
  • 【Linux网络编程】五种IO模型与非阻塞IO
  • 树莓派5+Ubuntu24.04 LTS ROS2 Jazzy安装 保姆级教程
  • transformer-kv缓存
  • Docker健康检查
  • 【AI News | 20250623】每日AI进展
  • 开发Qt程序时,为什么是CMake?
  • 前端截图并导出pdf
  • 基于Django和MySQL的智能图像分类与情感分析系统
  • Nginx-前端跨域解决方案!
  • AI+地图打车:如何用机器学习实现小程序订单智能匹配与路径优化?
  • 征服分布式系统:阿里云 Linux 多机互联与资源共享实战指南