关于维度信息维护和字典表的一些看法

简介:

在不同的公司的不同项目场景下,绝大多数情况下都需要维护一些基本的维度信息(也称为字典信息,下面全部使用维度信息代替描述),比如旅游相关的网站,可能会维护:

  • 货币类型:美元,人民币,港币等
  • 航程类型:单程,双程等
  • 产品线:机票、酒店、度假等

诸如此类的维度信息。而且往往这些维度信息可能不同的业务部门都需要使用全部或者其中的某些的某些。因此随着时间的推移,这些维度类型可能会新增,修改,删除某些项。导致不同部门维护的维度信息不同,但是往往公司中的部门不是独立存在的,往往都需要互相交互。因此会涉及到维度信息的转换。

我们都知道统一维度的重要性,这一点怎么强调都不为过。但是往往现实是存在太多的维度不统一的场景了,在维度已经不统一的情况下,我们应该如何去逐步改善这些场景。

因此本文主要着眼于我在实际工作中遇到过的问题,做一个总结,希望对大家有帮助。

维度信息的使用

一般我们是如何使用维度信息的呢?比较通用的解决办法往往是:

  • 数据库中创建字典表
  • 代码中创建对应的ENUM

我想绝大多数项目应该都是这样来解决维度信息的存储和使用问题的。但是有以下的一些注意点:

维度信息维护面临的数据一致性问题

这种使用方式往往会存在什么问题呢?假设有3中类型的维度信息:A、B、C:

第一个问题:系统1仅仅使用了维度A,而系统2使用了维度A和维度B,系统3使用了维度B和维度C。
而系统1、系统2、系统3都有自己的数据库。请问这个使用,这些维度信息的字典表建立在哪个系统的数据库中?还是说每个系统都建立一份字典表?

第二个问题:结合第一个问题,同样,往往每个系统都会有对应一个或者若干个工程项目,这些维度信息是哪些系统用到了就创建对应的枚举,还是统一维护一个工程,把所有的维度枚举都写在里面,统一维护?

上面的2个问题,其实是同一个问题,就是数据的一致性问题。当同一类信息存在的地方越多,一致性的问题越显著。也越需要迫切的解决。因为如果不及时有效的解决的话,系统中会存在各种各样的Adapter来进行维度信息的转换工作。

我们的解决办法:

  • 每个系统使用那些维度信息,就会有一张对应的维度字典表
  • 专门有一个工程或者说jar包,将部门内部所有的维度信息的枚举类收集在一起
  • 考虑到之前的一些历史项目的维度信息和现在的标准的维度信息不统一,因此在上面的jar中统一提高了维度转换适配器。
  • 同时会有一个专门的维度维护系统,对应一个数据库数据库:里面记录着所有的维度字典表。同时记录了哪些系统的数据库中有哪些维度表,同时这个系统提供了维护界面。
  • 然后后续新增的维度直接和平台的维度一一对应。接着逐步修正之前的维度数据。

这样当新增,或者修改维度信息的时候,我们会在「维度维护系统」的界面上进行维度信息的新增、修改操作。然后根据上面第四条描述的,根据维度系统的数据库中记录的“哪些系有哪些维度表”的对应关系,然后程序自动新增、修改这些周边系统的维度字典表数据。

当然当新增一种之前不存在的维度信息的时候,一开始只会在「维度维护系统」的数据库中创建,然后哪些系统需要使用,就同步哪些系统。

数据库维护以后,然后更新升级我们的jar包就可以了。

通过这种方式我们在很大的程度上解决了维度信息的不一致问题。

维度字典表的设计问题

为了方便开发人员统计每个系统有哪些字典表,我们在设计字典表的表名称的时候,统一采用了:_dict结尾。比如产品线字典表的表名为:product_line_dict

为了方便程序处理,我们也统一了表的格式:

use test;
set names utf8mb4;

create table product_line_dict(
    id int(10) unsigned not null auto_increment comment '维度序号',
    code varchar(32) not null comment '维度编号',
    name varchar(32) not null comment '维度名称',
    primary key(id),
    unique key uniq_idx_code(code)
)engine=innodb default charset=utf8mb4 comment '产品线维度表';

比如对于上面提到的product_line_dict表:

id   code    name
1    flight  机票

其中id为表的主键,code列加唯一索引。另外系统说明的是表级别的comment注释都是必须要写清楚的。这样方便新人阅读数据库表。

比起字典表只有:id、name这两列来说,这样的好处是:

  • 将枚举中的code和数据库中的code统一起来
  • 和部门外系统交互的时候,接口中只给code就好了,比只给id更加清洗
目录
相关文章
|
数据挖掘 调度 Python
【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 Baseline
第十届“泰迪杯”数据挖掘挑战赛B题的基线解决方案,涉及电力系统负荷预测分析,包括数据读取、特征处理、模型训练和评估,以及使用了LightGBM进行回归预测。
668 3
|
easyexcel
你要的不固定列excel导入导出,它来啦!(三)
在上篇文章中,我们简单的介绍了 excel 导入导出技术实践方案,就目前而已,使用最多的开源框架主要有以下三类,分别是:
1623 0
你要的不固定列excel导入导出,它来啦!(三)
|
存储 缓存 关系型数据库
深入解析MySQL中的表类型及其应用场景
【8月更文挑战第31天】
1377 0
|
机器学习/深度学习 数据采集 数据挖掘
【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 ARIMA、AutoARIMA、LSTM、Prophet、多元Prophet 实现
详细介绍了在第十届“泰迪杯”数据挖掘挑战赛B题中对电力系统负荷进行预测分析的方法,包括数据预处理、特征工程、平稳性检验、数据转换以及使用ARIMA、AutoARIMA、LSTM、Prophet和多元Prophet模型进行建模和预测,并提供了完整代码的下载链接。
1102 0
|
机器学习/深度学习 数据挖掘 Python
【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题二 时间突变分析 Python实现
第十届“泰迪杯”数据挖掘挑战赛B题中对电力系统负荷预测分析进行时间突变分析的Python实现方法,包括定义绘图函数、应用阈值查找异常值、手动设置阈值、使用分位数和3Sigma原则(IQR)设定阈值,以及根据分位数找到时间突变的步骤,并提供了完整代码的下载链接。
558 0
|
编解码 Java 流计算
38款 流媒体服务器开源软件
http://www.oschina.net/project/tag/111/streaming?lang=0&os=0&sort=view&p=1 Flash流媒体服务器 Red5 Red5是一个采用Java开发开源的Flash流媒体服务器。
9888 0
|
安全 Java 数据安全/隐私保护
SpringBoot+Email发送邮件
邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送,以构建一个可靠的通知体系。
984 1
SpringBoot+Email发送邮件
|
应用服务中间件 开发者 Dubbo
开发部署提速8倍!这款IDE插件了解一下?
对于开发者而言,提高工作效率大概有 2 种主要方式,第一种方式就是加快自己的工作速度,争取在同一段时间内多码一些代码、多干一些活来实现多产;而聪明的开发者会选择第二种方式,就是通过插件,让一些重复性的、繁琐性的工作被自动化,从而节省出时间来做一些实质性的业务,达到轻松又高效的工作步调。
3266 102
|
前端开发 JavaScript Java
通过学习mayfly,我学会了前端如何优雅设计字典值
`shigen`是一位擅长多种编程语言的博主,他在探索[mayfly-go](https://juejin.cn/post/7319365035552309248)项目后,发现了对枚举值管理的优雅设计。他分享了如何将字典和枚举值结构化,使用Vue+typescript实现更易维护的代码。通过创建`TagType`和`EnumValue`类,以及提供静态方法,实现了模块化和简洁的字典处理。示例展示了如何在页面中高效引用和显示字典数据,提高了代码的可读性和可维护性。
441 3
通过学习mayfly,我学会了前端如何优雅设计字典值

热门文章

最新文章