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

业务模型扩展字段存储

构建业务模型时,通常模型会设置扩展信息,存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性,但并没有结构化存储的类型和非空等约束,且强依赖代码中写入/读取时进行序列化/反序列化操作,
当扩展信息结构简单且不作为查询条件时使用JSON可以满足需求,但有些场景要求根据扩展字段进行查询,虽然有类似JSON_CONTAINS关键字匹配JSON内部字段,但不是所有db及其版本都支持JSON加内部索引的,且SQL语句复杂,难以维护。

本文介绍了一种业务模型扩展字段的存储方式以及使用方法。

设想一个物流发货场景,物流系统接收公司内部不同业务线的发货请求生成发货单,不同业务线的发货单数据有不同的扩展字段。
比如用户商城下单产生一个发货单,发货单需要关联订单号、支付金额;用户有赠品需要发货,发货单需要关联赠品订单号、赠品类型、赠品编号;
运营手动给某个用户发货,发货单需要关联发货审批编号,发货申请人;用户之前发的物流有问题,提起申诉,需要重新发货,问题件类型的发货单需要关联申诉编号、原发货单号、原发货类型。

直接在发货单主表使用非结构化的JSON字段存储以上数据,不优雅,物流域其实不关心上游扩展字段,其主表也不应参杂其余域的信息;作为物流域主要其查询写入肯定会很频繁,无脑加扩展字段后期会导致主表膨胀,查询写入效率降低。

因此,我们只在发货单主表logistcs_delivery_invoice存储物流域数据,扩展数据根据发货单类型“路由”到不同的扩展表,再根据发货单编号关联其中的数据。
在扩展表中,可以直接使用结构化的存储,方便后续查询。 其实体关系图如下:

在这里插入图片描述

由于涉及多个表,在每次生成发货单时,必须使用事务保证两者插入的原子性,而在分库分表的情况下扩展表还要冗余分片字段,且新接入类型需要新建扩展表。
同时,如果想查出带扩展字段的发货单数据,只依赖db就必须联表查询,或者引入异构数据源,如ElasticSearch:

将发货单表和扩展表按发货单号和类型关联,在ES中构建出一张“宽表”,后续的查询操作基于ES进行。
而ES是准实时的,数据插入到查询需要1s左右的时间,在物流场景下由于发货单生成本身是异步的,且实时性要求不高,1s的延迟是可以接受的。
而其他业务场景数据直接由B端运营人员或C端用户直接创建时,一种妥协是让前端在发完新建数据请求后页面转圈圈1s,对于用户来说体验不会太差,也能很大程度上保证后续查询不会查不到数据。
当然,异构数据的同步必定要有巡检任务来校验数据一致性,包括要完善产生不一致后的主动修复与监控告警机制,同时也要提供手动同步接口,在程序中
可以通过特性开关的方式来控制查询是走ES还是直接走db,在某些业务紧急但ES不可用时可以保证业务不受影响。

http://www.lryc.cn/news/388148.html

相关文章:

  • 50+k8s常用命令,助你成为k8s大牛!
  • 002-基于Sklearn的机器学习入门:回归分析(上)
  • python实现网页自动化(自动登录需要验证的网页)
  • ctfshow-web入门-命令执行(web71-web74)
  • 一体化导航的优点及应用领域
  • “吃饭大学”!中国大学食堂排行TOP10(含西电)
  • 使用 Mybatis 时,调用 DAO接口时是怎么调用到 SQL 的?
  • 微信小程序毕业设计-微信食堂线上订餐系统项目开发实战(附源码+论文)
  • 昂首资本实例使用价格行为策略,交易翻倍一点都不难
  • 20240701 每日AI必读资讯
  • GPT-5 一年半后发布,对此你有何期待?
  • Redis学习——Redisson 分布式锁集成及其简单使用
  • 08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数
  • Luminar Neo 1.20.0 (macOS Universal) - 创新 AI 图像编辑器
  • 谈谈Flink消费kafka的偏移量
  • MySQL 高级SQL高级语句(二)
  • MySQL之高可用性(四)
  • 招聘智能管理系统设计
  • 达梦数据库系列—15. 表的备份和还原
  • 无线领夹麦克风哪个品牌音质最好,直播用领夹麦克风还是声卡麦
  • 《Windows API每日一练》6.2 客户区鼠标消息
  • 体验升级:扫描全能王智能高清滤镜2.0全面测评
  • 【JVM系列】JVM调优
  • Linux基础 - Postfix 与 Dovecot 部署邮件系统
  • Qt的安装
  • ThreeJS-3D教学十二:ShaderMaterial
  • 计算机网络面试TCP篇之TCP三次握手与四次挥手
  • Python-数据分析组合可视化实例图【附完整源码】
  • 【JavaEE】Spring Web MVC详解
  • docker安装rocketMq5x以上的版本