乐趣区

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

本文通过理论业务需要场景建模案例,为读者提供一种业务模型向数据模型设计的方法论,用于领导理论开发中如何进行业务模型向数据模型转化形象,并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章,读者能够播种到业务模型向数据模型形象可参考的一种方法论,并针对前期业务需要变动,尽可能升高模型调整或者模型推 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 畛域模型调用关系图

五、结语

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

作者:京东物流 郑朋辉

起源:京东云开发者社区

退出移动版