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

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

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

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

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

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

维度信息的使用

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

  • 数据库中创建字典表
  • 代码中创建对应的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更加清洗

Original: https://www.cnblogs.com/rollenholt/p/5328074.html
Author: Rollen Holt
Title: 关于维度信息维护和字典表的一些看法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553364/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 剑指offer计划28(搜索与回溯算法困难)—java

    1.1、题目1 剑指 Offer 37. 序列化二叉树 1.2、解法 这题给我笑死了,我看到题解有个解法,我愿称之为神。 public class Codec { private …

    技术杂谈 2023年7月25日
    057
  • iShowU Studio for Mac(高清录屏工具)

    Original: https://www.cnblogs.com/aurora-123/p/16857799.htmlAuthor: 佛系女孩Title: iShowU Stud…

    技术杂谈 2023年7月11日
    070
  • Maven进行clean时报错,解决方法

    Q1:由于网络原因,maven仓库中产生了后缀LastUpdated文件,再次clean直接报错 参考方法:https://www.cnblogs.com/DDgougou/p/1…

    技术杂谈 2023年6月21日
    0101
  • Java中流水编号的生成

    在开发中,遇到这样一个需求,在介质资料新增时,需要生成一个介质编号,格式为”JZ+yyyyMMdd+4位递增数字”先是使用百度找寻解决方法。解决方法 里面的…

    技术杂谈 2023年7月24日
    086
  • 亿级消息中心架构方案概述【原创】

    目标 技术目标: 上行到消息队列api吞吐量10000条/秒,下发第三方平台1000条/秒(仅平台自身处理能力,第三方看第三方处理能力极限指标为准);保证消息中心100%高可用。 …

    技术杂谈 2023年7月23日
    066
  • CentOS7.6安装MySQL-5.7.31(RPM方式安装)

    准备工作: 注:5.7.31版本安装步骤及初始化和之前版本有较大区别 CentOS 7.6 系统: 带GUI的服务器 默认安装 MySQL 5.7.31 安装包: 1.RPM安装包…

    技术杂谈 2023年7月24日
    063
  • Redis命令操作_常用命令和Redis持久化

    通用命令 keys * 查询所有的键 type key:获取键对应的value的类型 del key:删除指定的key clear:清除窗口所有内容 127.0.0.1:6379&…

    技术杂谈 2023年6月21日
    0115
  • crash命令 —— sym

    参考:https://crash-utility.github.io/help_pages/sym.html 用法: 查看系统中所有的全局符号及其地址 sym -l 对于percp…

    技术杂谈 2023年5月30日
    097
  • Django Model 如何返回空的 QuerySet

    >>> from django.contrib.auth.models import User >>> User.objects.none() …

    技术杂谈 2023年6月21日
    0112
  • Azure Service Fabric 踩坑日志

    近期项目上面用到了Azure Service Fabric这个服务,它是用来做微服务架构的,由于这套代码和架构都是以前同学留下来的,缺少文档,项目组在折腾时也曾遇到几个问题,这里整…

    技术杂谈 2023年5月31日
    0105
  • 国运之争 功在当下

    国运之争 中华复兴 郭继承讲的好 国运之争 系于当代,下一代 树报国志 成栋梁材 十年累积 三年中考 三年高考 四年大学 道德在内修心思价值观念 仁爱在外制态度情绪言行 业果在平时…

    技术杂谈 2023年5月31日
    087
  • Oracle扩展表空间

    Oracle扩展表空间 前言: Oracle表空间扩展最大为32G,目前我还未找到可以打破限制的办法。 一、查看表空间信息和使用情况 查看表空间的名字及文件所在位置 — &amp…

    技术杂谈 2023年6月21日
    0150
  • 面向对象ooDay5

    默认的:什么也不写,本类、同包类 说明: java不建议默认访问权限 类的访问权限只能是public或默认的,类中成员的访问权限如上4种都可以 访问权限由小到大依次为:privat…

    技术杂谈 2023年7月11日
    078
  • 嵌入式编程中使用qemu能够做什么?

    学习QEMU以后,为了拓展视野,才发现QEMU可以做这么多的事情。 仿真裸机或RTOS编程 qemu的是指令翻译进行的,所以可以根据实际的需求进行相应的裸机开发和学习,比如语言学习…

    技术杂谈 2023年6月1日
    087
  • Codeforces1573B

    问题描述 给你两个数组,a数组里面是1 – 2n中的奇数任意顺序排列组成,b数组里面是1 – 2n中的奇数任意顺序排列组成。 问你最少需要多少次操作能让a的…

    技术杂谈 2023年7月24日
    065
  • 深入理解Apollo核心机制之配置读取——轮询

    前两篇内容《深入理解Apollo核心机制之配置读取——前言》《深入理解Apollo核心机制之配置读取——ConfigService定时扫描》 概述 读取配置除了默认5分钟间隔去轮询…

    技术杂谈 2023年7月25日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球