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

京东云开发者
• 阅读 372

本文通过实际业务需求场景建模案例,为读者提供一种业务模型向数据模型设计的方法论,用于指导实际开发中如何进行业务模型向数据模型转化抽象,并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章,读者可以收获到业务模型向数据模型抽象可参考的一种方法论,并针对后期业务需求变化,尽可能降低模型调整或者模型推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 领域模型调用关系图

五、结语

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

作者:京东物流 郑朋辉

来源:京东云开发者社区

点赞
收藏
评论区
推荐文章
【案例分享】如何利用京东云建设高可用业务架构
本文以2022年一个实际项目为基础,来演示在京东云上构建高可用业务的整个过程。公有云及私有云客户可通过使用京东云的弹性IAAS、PAAS服务,创建高可用、高弹性、高可扩展、高安全的云上业务环境,提升业务SLA,提升运维自动化水平,降低资源成本及运维成本。有业务迁移上云需求,希望构建云上高可用业务架构的客户或对云上高可用架构规划有兴趣的读者可以一看。
Tankard825 Tankard825
3年前
Vue入门系列之Vue实例详解与生命周期
Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理、数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成、编译、挂着、销毁等过程进行js控制。5.1.Vue实例初始
Stella981 Stella981
3年前
Kylin、Druid、ClickHouse 核心技术对比
文章作者:吴建超内容来源:jackywoo.cn导读:Kylin、Druid、ClickHouse是目前主流的OLAP引擎,本文尝试从数据模型和索引结构两个角度,分析这几个引擎的核心技术,并做简单对比。在阅读本文之前希望能对Kylin、Druid、ClickHouse有所理解。01Kylin数据模型
Stella981 Stella981
3年前
Mongoose
Mongoosemodifiedat是一款自动更新字段变化时间并记录到数据库中的Mongoose插件,类似Mongoose自带的timestamps功能。使用场景让我们考虑一个场景,我们有个文章发布与展示的需求,数据模型如下。constschemanewmongoose.Sche
可莉 可莉
3年前
08 django模型层_配置&单表操作
模型层orm简介  ORM是“对象关系映射”的简称。  MVC或者MTV框架中包括一个重要的部分ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。  比如,之前的数据库用的是ora
Wesley13 Wesley13
3年前
MongoDB数据模型设计的思考
Collection的单个doc有大小上限,现在是16MB,这就使得你不可能把所有东西都揉到一个collection里。而且如果collection结构过于复杂,既会影响查询、更新效率,也会造成维护困难和操作风险。你有尝试过手一抖就把一个doc不小心存成null的么,反正我做过,要是一个人所有信息都在这个collection里面,
京东云开发者 京东云开发者
2星期前
接单流程设计探索
作者:京东物流吕顺背景在物流系统中,接单是信息流的关键和重要的一环,每个业务场景都会对应一种标准接单流程,例如销售出、采购入等等。标准接单包括统一接口定义、统一数据模型、标准接单核心应用职责划分。而这个标准并不是在接口定义的初期就规划好的,通常会经历业务不
订单逆向履约系统的建模与PaaS化落地实践 | 京东云技术团队
本文重点介绍了京东零售电商业务在订单逆向履约上面的最佳技术实践,阅读本文,读者可以了解到整个快退平台新系统设计的底层逻辑,也可以参考本文并结合实际场景,将方案应用在遗留债务系统改造、业务和技术建模中。
京东云开发者 京东云开发者
11个月前
Pipeline模式应用 | 京东云技术团队
本文重点为管道模式的抽象与应用,上述示例仅为个人理解。实际应用中,此案例长于应对各种规则冗杂的业务场景,便于规则编排。
京东云开发者 京东云开发者
11个月前
治理要从数据建模抓起 | 京东云技术团队
数据治理是对数据管理权力的执行和落实。数据建模可以被认为是对数据定义权力的执行和实施。数据建模这门学问涉及到在"正确"的时间,由"正确"的人,为组织定义"正确"的数据,这就是数据治理的本质。创建数据模型的动因有很多。一般包括遵循数据标准、减少冗余、符合业务