领域建模之数据模型设计方法论 | 京东云技术团队

news2024/11/18 21:44:58

本文通过实际业务需求场景建模案例,为读者提供一种业务模型向数据模型设计的方法论,用于指导实际开发中如何进行业务模型向数据模型转化抽象,并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章,读者可以收获到业务模型向数据模型抽象可参考的一种方法论,并针对后期业务需求变化,尽可能降低模型调整或者模型推a倒重建的风险。本文可以重点关注建模实施流程,针对自己实际业务场景,不断抽象优化自己的数据模型。

一、背景

从研发人员的角度出发,技术更多的是为业务赋能,同时研发人员也可以通过业务模型设计来提升自己的技术,他们更多的是技术控,追求拥有更多的技术栈。不过今天不讨论具体的技术,准备换一种思维模式来分享下自己在业务开发中的一些经验,并结合实际案例来阐述针对业务场景进行数据建模的方法论。

开发人员在日常工作中,参与PRD评审、听产品经理讲述用户故事、提出各种需求。评审结束,一般会一股脑投入到设计开发,而数据库表设计就是其中不可或缺的一个过程。对于熟悉的业务模块,通过对需求分析,可以轻而易举的完成数据表设计,但对于非熟悉业务领域,可能会经过多轮PRD分析,整理一套数据表结构基础,然后对其追加字段,就完成了基础的数据模型设计。而在这个过程中,往往会感觉没有可以参考的理论,有时候甚至对设计的数据库表产生怀疑,不断考虑此设计是否符合业务、表结构设计后期是否具有通用性、表之间关系是否恰当可扩展等等。今天来谈些在实际业务开发中,针对数据建模的一些思考。

一个好的方法论一定是告诉你当你面对一个全新的业务场景或未知领域的时候,如何去独立分析和解决问题。

二、名词

领域:可以理解为传统软件需求分析中的业务场景对应的业务域,比如常见的电商、物流、运输等领域。

子域:领域的部分业务域,比如电商的部分订单、支付、库存等子域。

建模:业务域的映射和抽象。

三、思考

面向对象分析的设计思维模式:

图1. 用户角度到开发角度思考

四、方法论

4.1  实施步骤

  1. 识别对象;
  2. 组织对象;
  3. 定义对象模型间关系;
  4. 完善模型细节(属性、状态);
  5. 领域模型到数据模型映射;

4.2 CASE实践(社区团购–预排线调度建模案例)

(1)PRD需求描述

预排线系统从OFC系统获取团单数据:截单之前每天下午OFC推送一份当天需要预排线的数据出来,这些数据包括每个已经成团的团单(生产单)和截止到当前时间团单的商品数据,这里面包含当天已经取消的团单(即所有的商品数量都是0)。同时在截单之后,OFC会把截单后的团单数据再推送一次,里面包含当天已经取消的团单(所有的商品数量都是0);

团单数据创建、更新、删除:如果下发的生产单号在预排线系统不存在,则创建团单信息;如果下发的生产单号在预排线系统存在,则更新下面单商品的数量、团单的收件地址、经纬度、团长ID、姓名、电话等信息;如果有新增的商品则添加团单下的商品数据;如果更新的团单数量,其下面所有商品的个数都为0,代表这个团单已经被取消,则逻辑删除这个团单,同时取消这个团单和对应线路的绑定关系;更新的商品数量都是更新的商品的当前数量,不会更新调度时的数量和实际的数量。

(2)识别对象

Note:

  1. 复用或者修改已有模型(比如:运输需求、计划、询价单、对账单、财务账单等);
  2. 行业、公司内概念列表(比如:社区团购、分拣、调度、询价、计费等);
  3. 名词。

识别出的对象:

OFC 团单 单 预排线数据 生产单 商品 商品数量 预排线系统 团单收件地址 经纬度 团长ID 姓名 电话 线路 商品当前数量 调度时的数量 实际数量

(3)组织对象

Note:

  1. 一词多用、重复、歧义:归结为一个对象模型;
  2. 复数:students --> student 归结为一个对象模型;
  3. 属性:可以归结为对象模型的特征,不单独升级为一个对象,但特殊场景下,比如文章的分类可以为文章的一个属性,但是当分类又有子属性时,比如有子属性标签,这时可以把分类单独升级为对象模型。类似设计数据库表,是设计为字段还是新设计一张表一样。

分析对象:

  1. OFC :系统
  2. 团单:生产单 单 团单收件地址 经纬度 团长ID 姓名 电话
  3. 预排线:预排线系统,预排线模型 线路
  4. 商品:商品 商品数量 商品当前数量 调度时的数量 实际数量

(4)定义对象模型关系

Note:

  1. 外键
  2. 关系:一对一、一对多、多对多,关系传递

分析关系:

  1. “同时取消这个团单和对应线路的绑定关系” -----> 预排线包括多个团单,预排线 VS 团单= one vs many
  2. “如果有新增的商品则添加团单下的商品数据” -----> 团单下有多个商品,团单 VS 商品 = one vs many

图2. 模型间关系

(5)完善模型信息(属性状态)

Note:

  1. 子域:模型对象的子对象信息,比如:店铺模型下的员工模型、地址库模型、员工薪资模型等。
  2. 属性:模型对象的特征表现
  3. 状态:状态机
  4. 边界:对象模型间交互部分,分清楚哪些属于A对象哪些是B对象

完善对象模型:

图3.对象模型(模拟字段信息)

(6)领域对象到数据模型

Note:

  1. 派生:数据模型之间的一种关联、继承、映射出的一种关系。比如“预排线模型”中“运输任务编码”属性,属于调度域的模型属性,后期会与调度域系统产生关联关系,所以把运输任务编码作为“预排线模型”的一个派生属性。
  2. 冗余:①低级冗余(显示)–模型依赖外部模型属性字段显示使用,这时不用再关联查询或者通过IO获取;②高级冗余(计算)–比如外部模型有单价、数量属性且稳定不变,则模型可以依赖其计算结果,省去二次计算逻辑;
  3. 扩展表:①数据模型的垂直拆分,减少大对象;②变更不是很频繁的字段可以放到扩展模型;

社区团购排线部分模型设计图:

图4 终版数据模型图

五、扩展

5.1 领域模型设计阶段思考

对象:领域模型对象,上述案例分析到的对象模型;

功能:哪些业务功能划分到领域(微服务)或者子域(模块)里面

接口:服务应该暴露的接口能力;

5.2  方法论

动词+宾语 <----> 方法接口+对象

  • 业务功能操作和实体对象分离,更容易进行微服务划分;
  • 某个微服务应该暴露哪些接口;
  • 领域上下文边界,接口应属于哪个领域提供。

图5 领域模型调用关系图

五、结语

一个好的方法论一定是告诉你当你面对一个全新的业务场景或未知领域的时候,如何去独立分析和解决问题。

作者:京东物流 郑朋辉

来源:京东云开发者社区

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

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

相关文章

linux 漏洞升级、初次安装 mysql

文章目录 适用安装遇到问题 适用 1、为解决Mysql漏洞而需要离线升级mysql版本&#xff1b; 2、初次安装Mysql也可以参考本文&#xff1b; 安装 提示&#xff1a;首次安装可跳过第二步、第三步 一、查看CentOS7系统自带mariadb # 查看系统自带的Mariadb [rootiZ2ze3hm3gyjy…

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念&#xff0c;体现了看待线程同步的不同角度&#xff0c;在Java和数据库中都有此概念对应的实际应用。 1.乐观锁 顾名思义&#xff0c;就是很乐观&#xff0c;每次去拿数据的时候都认为别人不会修改&#xff0c;所以不会上…

英语中-后置定语

一般说来&#xff0c;形容词放在所修饰名词的前面。单个的现在分词、过去分词以及动名词作定语&#xff0c;都是放在所修饰名词&#xff08;或代词&#xff09;的前面。这些称为前置定语。 例如&#xff1a; a red flower/ an interesting story&#xff0c;这里red, interes…

SaaS人力资源管理系统的Bug

SaaS人力资源管理系统的Bug Bug1【18】 这里我是直接把代码复制过来的&#xff0c;然后就有一个空白 这是因为它的代码有问题&#xff0c;原本的代码如下所示 <el-table-column fixed type"index" label"序号" width"50"></el-table-co…

ssm+java在线考试批改阅卷系统

本次学校在线考试系统的实现过程&#xff0c;它的开发使用B/S结构即浏览器和服务器结构框架&#xff0c;采用SSM框架技术&#xff0c;数据库使用了mysql数据库&#xff0c;页面设计采用了MVC框架&#xff0c;后端采用了SSM框架技术scrip等其他一些脚本语言&#xff0c;使用到在…

hash算法详解

散列算法&#xff08;Hash Algorithm&#xff09;&#xff0c;又称哈希算法&#xff0c;杂凑算法&#xff0c;是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样&#xff0c;散列算法就是一种以较短的信息来保证文件唯一性的标志&#xff0c;这种标志与文件的每一个字…

Java中的动态链接VS操作系统动态链接

在操作系统OS中为了优化内存的使用会采用一种动态链接方式&#xff0c;一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系 操纵系统为什么需要动态…

2023年欧洲科学院院士中的华人学者简介

近日&#xff0c;2023年欧洲科学院新当选欧洲科学院院士名单出炉&#xff0c;由于入选学者接受邀请及注册的时间进度不同&#xff0c;入选名单陆续公布&#xff08;截止目前已更新135位&#xff09;。本文知识人网小编仅介绍入选名单中华人学者的情况。 欧洲科学院(Academia Eu…

优化--分类树,我从2s优化到0.1s

1.前言 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在电商系统中。 但就是这样一个简单的分类树查询功能&#xff0c;我们却优化了5次。 到底是怎么回事呢&#xff1f; 2.背景 我们的网站使用了SpringBoot推荐的模板引擎&#xff1a;Thym…

TiDB x Catalyst丨秒级洞悉数据价值,TiDB 帮助“客户成功 SaaS 厂商”提升用户体验

导读 Catalyst 是一家总部位于纽约的 SaaS 创业公司&#xff0c;它提供了一个直观且灵活的客户成功平台&#xff08;Custom Success Platform&#xff09;&#xff0c;可帮助客户成功团队汇聚客户数据&#xff0c;洞悉客户健康状况&#xff0c;推动客户留存和业务增长。目前 C…

「网络编程」第一讲:初识网络_网络基础1

「前言」文章是关于网络编程方面的&#xff0c;今天内容大致是网络基础&#xff0c;讲解下面开始&#xff01; 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 青山不改&#xff0c;绿水长流 ——白居易 目录 一、…

chatgpt赋能python:Python怎么建服务器?

Python怎么建服务器&#xff1f; 作为一名具有10年Python编程经验的工程师&#xff0c;我深入研究了Python的一些高级特性&#xff0c;其中包括Python如何建立服务器的方法。Python是一个高级的编程语言&#xff0c;可以轻松创建服务器应用程序&#xff0c;并为您的网站提供高…

redis中的intset集合源码阅读探究;基于7.0+版本

1丶什么是intset Redis 中的 intset&#xff08;整数集合&#xff09;是一种高效的数据结构选择。Intset 具有紧凑的内存布局和快速的插入、删除和查找操作&#xff0c;适用于存储大量整数&#xff0c;并且能够节省内存空间。 2丶先说优点 内存布局&#xff1a;Intset 的内存…

vue-element-admin项目-Host key verification failed.-已解决

在网上下载的element-admin项目&#xff0c;install的时候一直报错Host key verification failed&#xff0c; 实测好用&#xff01;&#xff01;&#xff01;已解决 报错问题&#xff1a;上面写到主机密钥验证失败&#xff0c;无法从远程仓库拉取。说明我们需要生成一个新的密…

基于JAVA SSM框架和jsp的学生宿舍管理系统

计算机信息技术和当前办公的信息化、自动化、网络化极大地改变了高校、企事业单位的信息管理方式&#xff0c;高效、快速、准确的信息管理已成为各行业现代管理的重要手段。目前宿舍管理人员普遍年龄偏大&#xff0c;使用笔录工作量大&#xff0c;管理难度大&#xff0c;利用学…

如何安装官网最新版Android Studio

1、进入android studio官网&#xff0c;点击下载。 2、下滑查看协议&#xff0c;勾选同意按钮&#xff0c;点击下载。 3、打开安装程序&#xff0c;点击Next。 4、选择虚拟机&#xff0c;点击Next。 5、选择安装路径&#xff0c;点击Next。 6、点击Install。 5、等待安装…

Kafka学习---2、kafka生产者、异步和同步发送API、分区、生产经验

1、kafka生产者 1.1 生产者消息发送流程 1.1.1 发送原理 在消息发生的过程中&#xff0c;设计到了两个线程——main线程和Sender线程。在main线程中创建了一个双端队列RecordAccumulator。main线程将消息发给RecordAccumulator&#xff0c;Sender线程不断从RecordAccumulato…

AST环境安装及使用

1.环境安装 AST在线解析网站&#xff1a;https://astexplorer.net/ 可以看出Parser用的是 babel/parser ,这是一个目前最流行的JS语法编译器Babel的Node.js包。 Babel是编译器。babel/parser是Babel中的解析器&#xff0c;用于解析JS语言&#xff0c;本质也是一个Node.js包 …

wenda+fess问答系统

1 安装conda 2 创建环境 conda activate --name wenda python3.8 3 安装依赖工具包 pip install -r requirements/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple pip install torch BeautifulSoup4 torchvision torchaudio pdfminer.six -i https://pypi.t…

降维和特征选择的对比

降维? 降低数据集中特征的维数,同时保持尽可能多的信息的技术被称为降维。它是机器学习和数据挖掘中常用的技术,可以最大限度地降低数据复杂性并提高模型性能。 降维可以通过多种方式实现,包括: 主成分分析 (PCA):PCA 是一种统计方法,可识别一组不相关的变量,将原始变…