基本数仓建设(含最详细步骤)

最简单数仓建设,原理:将所有源数据抽取到同一个地方,建模,加工处理。

需求:将不同mysql库数据,抽取到同一个pg库,对抽取数据进行加工,生成报表。如:在B机器上抽取A机器上数据到C机器上。

使用工具:DataX

步骤:

  1. B机器上安装java,python,安装DataX
    详细步骤参考:DataX使用
  2. 获取源数据相关参数
    生成固定格式文件:schema|table|target_table|pk_column|columns|add_column
    参考mysql参数获取:查询Mysql表名、主键、列名
    参考postgresql参数获取:查看Postgresql表名、主键、列名
  3. 批量生成json文件
    写一个简单的java文件,读取步骤2生成的文件,并按DataX要求生成对应格式的json文件。
    详细参考:DataX批量生成json文件(简单java代码)
  4. 通用执行sh脚本
    参考:
  5. 批量生成目标库建表语句
    结合excel用起来比较方便,这事本该dba去做的,因为涉及表太多,dba不肯搞,只能自己搞个工具生成建表语句了。
    参考详细步骤:Mysql表结构迁移到Postgresql
  6. 调度系统部署
    B机器上安装airflow,并装上对应的调度资料库
  7. 配置调度任务
    参考网上
  8. 数据加工处理
    参考:阿里OneData体系
  9. 生成报表目标表
  10. 接入报表系统

 

 
### 数据仓库的三范式设计原则与应用 数据仓库的设计可以基于不同的范式进行优化,其中三范式的应用在某些情况下仍然具有重要意义。尽管数据仓库更多倾向于反范式设计以提升查询性能,但在特定场景下遵循三范式的原则也有助于减少冗余和维护数据一致性。 --- #### 1. **三范式的基本概念** 三范式是数据库规范化过程中的一种重要标准,用于消除重复数据并确保数据的一致性和完整性。以下是三范式的逐级定义: - **第一范式 (1NF)**:要求表中的每一列都不可再分割,即原子性。每个字段只包单一值,不允许数组或多值字段的存在[^3]。 - **第二范式 (2NF)**:在满足1NF的基础上,要求非主键字段完全依赖于主键而非部分依赖。这通常意味着需要将多对多的关系分解为两个一对多的关系[^4]。 - **第三范式 (3NF)**:在满足2NF的前提下,进一步去除传递依赖,即非主键字段不应间接依赖于主键[^4]。 通过逐步规范化至3NF,可以显著降低数据冗余的风险,并使更新操作更加安全可靠[^1]。 --- #### 2. **三范式在数据仓库中的意义** 虽然传统的OLTP系统广泛采用三范式设计来保证事务一致性和高效写入,但对于数据仓库而言,其核心目标通常是支持复杂的分析查询而不是频繁的小规模交易处理。因此,在构建数据仓库时是否严格遵守三范式取决于具体需求[^2]。 然而,在一些特殊场合下坚持使用三范式仍具优势: - 提高存储效率:减少了不必要的重复记录; - 易于扩展:当新增实体类型时不需大幅修改现有结构; - 更好的可维护性:清晰分离各个维度信息便于长期管理和调试[^3]。 例如,在创建商品分类体系时,按照三范式思路会先建立一张单独的商品类别表,仅保留唯一标识符作为外键链接到订单明细或其他相关表格中[^4]。 --- #### 3. **实际案例分析——商品销售数据建模** 假设有这样一个业务场景:一家零售公司希望保存每笔交易详情包括顾客个人信息、购买物品名称规格价格等要素。如果我们严格按照三范式来进行规划,则大致可分为如下几个步骤: ##### (1)原始未规化版本 | TransactionID | CustomerName | ItemDescription | Quantity | |--------------|-------------|-----------------------|----------| | T001 | John Smith | Large Blue Widget | 5 | 上述布局显然违背了多个范式约束条件,因为存在大量嵌套描述以及潜在的数据复制隐患。 ##### (2)经过第一次调整后(符合1NF) | TransactionID | CustomerName | ItemCode | Quantity | |--------------|-------------|----------|----------| | T001 | John Smith | WIDGET_LB| 5 | 此时我们已经实现了基本单元格级别的独立表达形式,但仍存在问题如客户姓名依旧散落在各条目间造成浪费空间等问题待解决。 ##### (3)继续深入改造直至达成3NF状态 终得到的是由若干张相互关联但彼此专注不同主题领域的小型子表构成的整体构架图谱如下所示: ###### 表A - Transactions(交易) | TransactionID(PK) | Date | TotalAmount | |--------------------|-----------|-------------| | T001 | 2023-08-01| $250 | ###### 表B - Customers(客户) | CustomerID(PK) | Name | Email | |-----------------|---------------|-------------------| | CUST_001 | John Smith | john@example.com | ###### 表C - Items(项目/产品) | ItemCode(PK) | Description | UnitPrice | |--------------|----------------------|-----------| | WIDGET_LB | Large Blue Widget | $50 | ###### 表D - OrderDetails(订单细节) | DetailID(PK)| TransactionID(FK) | ItemCode(FK) | Quantity | |-------------|---------------------|--------------|----------| | DETAIL_001 | T001 | WIDGET_LB | 5 | 这样做的好处在于不仅解决了之前提到的各种弊端而且还为进一步高级别的统计运算提供了坚实的基础支撑环境[^4]。 --- ```sql -- SQL 创建语句示例 CREATE TABLE Transactions ( TransactionID INT PRIMARY KEY, Date DATE NOT NULL, TotalAmount DECIMAL(10, 2) NOT NULL ); CREATE TABLE Customers ( CustomerID VARCHAR(50) PRIMARY KEY, Name VARCHAR(100), Email VARCHAR(100) ); CREATE TABLE Items ( ItemCode VARCHAR(50) PRIMARY KEY, Description TEXT, UnitPrice DECIMAL(10, 2) ); CREATE TABLE OrderDetails ( DetailID INT PRIMARY KEY, TransactionID INT REFERENCES Transactions(TransactionID), ItemCode VARCHAR(50) REFERENCES Items(ItemCode), Quantity INT CHECK (Quantity >= 0) ); ``` --- ### 总结 尽管现代数据仓库建设往往偏向于反范式设计以迎合高性能读取的要求,但是理解并适当运用三范式仍然是非常有价值的技能之一。特别是在初期阶段或是针对那些特别注重精确度而不急于追求速度的应用程序来说更是如此[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值