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

简介:

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

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

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

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

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

维度信息的使用

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

  • 数据库中创建字典表
  • 代码中创建对应的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更加清洗
目录
相关文章
|
存储 索引
维度表和事实表的区别
转载:转载:https://blog.csdn.net/qq_56870570/article/details/118938411
3417 0
|
3月前
|
人工智能 算法 测试技术
【简历优化平台-03】轻字段信息的合理性及单独算法
【简历优化平台-03】轻字段信息的合理性及单独算法
|
6月前
|
存储 程序员 C语言
c++ 如何做出实现一组数据的实际索引
c++ 如何做出实现一组数据的实际索引
|
10月前
|
存储 程序员 C语言
c++ 如何做出实现一组数据的实际索引
C++是一种计算机高级程序设计语言, 由​​C语言​​​扩展升级而产生 , 最早于1979年由​​本贾尼·斯特劳斯特卢普​​在AT&T贝尔工
|
SQL BI 索引
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
|
存储 SQL 机器学习/深度学习
数仓中指标-标签,维度-度量,自然键-代理键,数据集市等各名词解析及关系
这是在数据分析中常见的概念,下钻可以理解成增加维的层次,从而可以由粗粒度到细粒度来观察数据,比如对产品销售情况分析时,可以沿着时间维从年到月到日更细粒度的观察数据。从年的维度可以下钻到月的维度、日的维度等。
数仓中指标-标签,维度-度量,自然键-代理键,数据集市等各名词解析及关系
|
数据采集 存储 缓存
字典服务的设计与管理
在字典服务中提供的枚举值,根本目的是为了确保数据值的统一性,尽可能的避免同一个信息用两种方式描述。
554 0
字典服务的设计与管理
|
SQL 存储 缓存
索引不是越多越好,理解索引结构原理,才有助于我们建立合适的索引!
MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引。
589 0
|
存储 SQL 机器学习/深度学习
数仓中指标-标签,维度-度量,自然键-代理键等各名词解析及关系
作为一个数据人,是不是经常被各种名词围绕,是不是对其中很多概念认知模糊。有些词虽然只有一字之差,但是它们意思完全不同,今天我们就来了解下数仓建设及数据分析时常见的一些概念含义及它们之间的关系。
687 0
数仓中指标-标签,维度-度量,自然键-代理键等各名词解析及关系
数据蒋堂 | JOIN延伸 - 维度查询语法
有了维度定义后,我们就可以来梳理前面讲过的简化JOIN语法了。 先定义字段维度: 维度字段的维度为其本身; 外键字段的维度为相应外键表中关联字段的维度; 测度字段没有维度。 这是个递归定义。
2211 0