数仓搭建:DWB层(基础数据层)

维度退化:  通过减少表的数量和提高数据的冗余来优化查询性能。

在维度退化中,相关的维度数据被合并到一个宽表中,减少了查询时需要进行的表连接操作。例如,在销售数据仓库中,客户信息、产品信息和时间信息等维度可能会被合并到一个单一的销售事实表中。这样,查询时只需访问一个表,而不必连接多个表,从而提高了查询效率。

做宽表的原因:

把多张表内容合并到一张表>>提升查询速度

弊端: 占更多的内存

数仓的本质>>用空间换时间

做主题宽表

1.业务人员告知需要的字段>>直接create table

2.业务人员没有告知

先确定需要用来做宽表的表>>事实表/与主题相关>>确认主表副表(left join)>>重复字段只保留主表的字段

很少选择第二种>>因为不能写注释; 只能建普通表,不能建分区表/分桶表

示例

步骤: 

1.建DWB数据库

create database dwb;

2.建相应的主题宽表:(比如创建订单明细宽表)

先从事实表里面确认所需要的表(参照数据字典表了解表的实际内容)

t_goods_evaluation 订单评价表(主题相关)

t_goods_evaluation_detail 商品评价表(无关主题)

数据字典表(中英对照)

把订单主表(t_shop_order)确定为表连接的主表,其余为副表

主表的确定

业务需求分析

  • 核心业务实体:明确业务需求,找出核心业务实体,如订单、客户、产品等。

  • 高频查询:分析高频查询,确定哪些表最常被访问。

 数据关系分析

  • 主外键关系:通过主外键关系确定主表,通常主表包含核心业务数据,其他表通过外键关联。

  • 数据粒度:选择粒度最细的表作为主表,确保宽表包含最详细的信息。

 数据量分析

  • 数据量大小:选择数据量较大的表作为主表,避免宽表数据量过大。

  • 更新频率:选择更新频率较低的表作为主表,减少宽表维护成本。

工具支持

  • 数据建模工具:使用数据建模工具分析表关系,辅助确定主表。

  • ETL工具:利用ETL工具自动化宽表构建,减少手动操作。

表字段的确定

主表字段全部保留

订单主表(t_shop_order)

副表字段

fact_shop_order_group (订单组表)

id是自增列,用来确保数据的唯一性(不保留)

order_id 用来和主表关联的字段,主表已存在(不保留)
其他字段,和主表重复(不保留)

t_shop_order_address_detail(订单副表)

id是和主表的关联字段(不保留)

其余字段,和主表重复(不保留)

t_order_pay(订单支付表)

 t_refund_order (退款订单表)

t_order_settle(订单结算表)

t_shop_order_goods_details(订单商品快照表)

id自增列主键(不保留)

order_id 主表关联字段, 主表已经存在(不保留)

shop_store_id  店铺id, buyer_id   买家id 在主表中已存在(不保留)

其他字段, 主表中已经存在(不保留)

t_goods_evaluation(订单评价表)

 user_id 评论人id=主表的buyer_id  买家id; 主表已经存在(不保留)

t_order_delievery_item(配送信息表 )

id 自增列(不保留)

shop_order_id 订单id, 和主表关联的字段, 主表已经存在(不保留)

refund_order_id 在副表t_shop_order_goods_details(订单商品快照表)已经存在(不保留)

shop_store_id 店铺id, buyer_id  买家id  在主表已经存在(不保留)

circle_master_user_id 在副表t_order_settle(订单结算表)已经存在(不保留)

dispatcher_user_id 在副表t_order_settle(订单结算表)已经存在(不保留)

sql

create table dwb.dwb_order_detail
as 
selecto.id,o.order_num,o.buyer_id,o.store_id,o.order_from,o.order_state,o.create_date,o.finnshed_time,o.is_settlement,o.is_delete,o.evaluation_state,o.way,o.is_stock_up,o.create_user,o.create_time,o.update_user,o.update_time,o.is_valid,og.group_id,og.is_pay,od.order_amount,od.discount_amount,od.goods_amount,od.is_delivery,od.buyer_notes,od.pay_time,od.receive_time,od.delivery_begin_time,od.arrive_store_time,od.arrive_time,op.order_pay_amount,ro.apply_date,ro.modify_date,ro.refund_reason,ro.refund_amount,ro.refund_state,ro.refuse_refund_reason,ro.refund_goods_type,ro.refund_shipping_fee,os.settlement_create_date,os.settlement_amount,os.dispatcher_user_id,os.dispatcher_money,os.circle_master_user_id,os.circle_master_money,os.plat_fee,os.store_money,os.status,os.note,os.settle_time,os.first_commission_user_id,os.first_commission_money,os.second_commission_user_id,os.second_commission_money,ogd.goods_id,ogd.buy_num,ogd.goods_price,ogd.total_price,ogd.goods_name,ogd.goods_image,ogd.goods_specification,ogd.goods_weight,ogd.goods_unit,ogd.goods_type,ogd.refund_order_id,ogd.goods_brokerage,ogd.is_refund,e.geval_scores,e.geval_scores_speed,e.geval_scores_service,e.geval_isanony,odi.dispatcher_order_type,odi.dispatcher_order_state,odi.order_goods_num,odi.delivery_fee,odi.distance,odi.dispatcher_code,odi.receiver_name,odi.receiver_phone,odi.sender_name,odi.sender_phone
from dwd.fact_shop_order o
left join dwd.fact_shop_order_group ogon o.id = og.order_id
left join dwd.fact_shop_order_address_detail odon o.id = od.id
left join dwd.fact_order_pay opon og.group_id = op.group_id
left join dwd.fact_refund_order roon o.id = ro.order_id
left join dwd.fact_order_settle oson os.order_id = o.id
left join  dwd.fact_shop_order_goods_details ogdon ogd.order_id = o.id
left join dwd.fact_goods_evaluation eon e.order_id = o.id
left join  dwd.fact_order_delievery_item odion odi.shop_order_id = o.id;

宽表查询

select * from  dwb.dwb_order_detail; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程间通信——进程池

文章目录 进程池什么进程池进程池的作用 用代码模拟进程池管道信息任务类InitProcesspool()DisPatchTasks()任务的执行逻辑(Work)CleanProcessPool() 封装main.ccChannel.hppProcessPool.hppTask.hppMakefile 总结总结 进程池 什么进程池 进程池&#…

13-跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

Qt的QToolBox的使用

QToolBox 是 Qt 框架中的一个控件&#xff0c;用于创建一个可折叠的“工具箱”界面&#xff08;类似 Windows 资源管理器的侧边栏&#xff09;。每个子项可以展开或折叠&#xff0c;适合用于分组显示多个功能模块。以下是其基本用法和示例&#xff1a; 1. 基本用法 创建并添加…

《DeepSeek 一站式工作生活 AI 助手》

最近国产AI工具DeepSeek在全球火出圈&#xff0c;登顶多个国家应用商店&#xff0c;下载量一路飙升。这匹AI “黑马” 到底凭什么征服全球用户&#xff1f;让我们全方位解锁DeepSeek——从基础入门到高阶玩法&#xff0c;从实用技巧到隐藏功能。 DeepSeek是一款功能强大的国产A…

Java中CompletableFuture异步工具类

参考&#xff1a;CompletableFuture 详解 | JavaGuide 实际项目中&#xff0c;一个接口可能需要同时获取多种不同的数据&#xff0c;然后再汇总返回&#xff0c;举个例子&#xff1a;用户请求获取订单信息&#xff0c;可能需要同时获取用户信息、商品详情、物流信息、等数据。…

Oracle Rac 多路径链路不稳定引发IO降速-光弱

一、背景 今天突然被异地的同事拉来开远程会议&#xff0c;会议内容是开发反馈每天9点左右有个sqlldr 命令的脚本调用突然执行很慢&#xff0c;以前几秒的导入操作现在需要30-60s左右&#xff0c;而且数据量基本相同。 二、分析 1&#xff09;、查看ASH报告 从报告上确认是数…

哈希表-两个数的交集

代码随想录-刷题笔记 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 内容: 集合的使用 , 重复的数剔除掉&#xff0c;剩下的即为交集&#xff0c;最后加入数组即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…

[JVM篇]分代垃圾回收

分代垃圾回收 分代收集法是目前大部分 JVM 所采用的方法&#xff0c;其核心思想是根据对象存活的不同生命周期将内存划分为不同的域&#xff0c;一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特点是每次垃圾回收时只有少量对象…

汉诺塔问题详解:递归与分治的经典案例

嘿&#xff0c;小伙伴们&#xff01;今天我可算撞见了个超有意思的东西&#xff0c;就是那大名鼎鼎的汉诺塔问题&#xff01;我这好奇心一下子就被勾起来了&#xff0c;迫不及待地想深挖一下&#xff0c;然后把那些好玩的、烧脑的、让人拍案叫绝的解题思路和奇妙故事都分享给大…

vue中如何动态的增减组件的类名(class)

在 Vue.js 2 中&#xff0c;你可以通过计算属性或直接在模板中使用 v-bind:class 来动态地改变组件的类名。下面是一个简单的示例&#xff0c;说明如何在某个条件被复核后为组件添加一个 selected 类&#xff08;此处为组件添加一个默认的类&#xff08;例如 radio&#xff09;…

Vue3 基础概念与环境搭建

一、Vue3 简介 Vue3 是 Vue.js 的最新主要版本&#xff0c;于 2020 年 9 月正式发布。它在性能、可维护性和开发体验方面都有了显著的改进。相比 Vue2&#xff0c;Vue3 的主要特点包括&#xff1a; 更高效的响应式系统&#xff1a;使用 Proxy替代了 Object.defineProperty&…

华为昇腾920b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…

Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅

摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…

Word中接入大模型教程

前言 为什么要在word中接入大模型呢&#xff1f; 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事&#xff0c;拆分一下就是&#xff1a; 获取用户…

open3d绘制平面

在Open3D中绘制平面通常涉及到创建一个平面模型并将其可视化。Open3D是一个开源库,主要用于3D数据的处理和可视化,但它主要用于3D数据的处理,并不直接支持绘制2D平面。如果你想在Open3D中“绘制”一个平面,你可以通过以下几种方法来实现类似的效果: 方法1:使用o3d.geome…

DeepSeek R1 与 OpenAI O1:机器学习模型的巅峰对决

我的个人主页 我的专栏&#xff1a;人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞&#x1f44d;收藏❤ 一、引言 在机器学习的广袤天地中&#xff0c;大型语言模型&#xff08;LLM&#xff09;无疑是最…

WebGPU顶点插槽进阶优化指南:释放GPU渲染性能

本文基于WebGPU官方规范与实践经验&#xff0c;深入探讨顶点缓冲区的性能优化策略&#xff0c;涵盖数据布局、资源管理、渲染流程等多个维度&#xff0c;并附详细代码注释与性能对比分析。 一、数据布局优化&#xff1a;降低内存与带宽压力 1. 内存对齐策略 GPU对内存访问有严…

数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除

头文件&#xff1a;head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…

基于Spring Boot+Vue的宠物服务管理系统(源码+文档)

项目简介 宠物服务管理系统实现了以下功能&#xff1a; 基于Spring BootVue的宠物服务管理系统的主要使用者分为用户管理模块&#xff0c;由于系统运行在互联网络中&#xff0c;一些游客或者病毒恶意进行注册&#xff0c;产生大量的垃圾用户信息&#xff0c;管理员可以对这些…

2. grafana插件安装并接入zabbix

一、在线安装 如果不指定安装位置&#xff0c;则默认安装位置为/var/lib/grafana/plugins 插件安装完成之后需要重启grafana 命令在上一篇讲到过 //查看相关帮助 [rootlocalhost ~]# grafana-cli plugins --help //从列举中的插件过滤zabbix插件 [rootlocalhost ~]# grafana…