数据仓库系列7:什么是概念模型、逻辑模型和物理模型,它们有什么区别?

你是否曾经困惑于数据仓库中的各种模型?概念模型、逻辑模型、物理模型 - 它们听起来很相似,但实际上各有千秋。
稿定设计-5.png

目录

    • 引言:为什么模型如此重要?
    • 1. 概念模型:勾勒数据的蓝图
      • 什么是概念模型?
      • 概念模型的特点
      • 概念模型的例子
      • 概念模型的作用
      • 如何创建概念模型
    • 2. 逻辑模型:细化你的数据结构
      • 什么是逻辑模型?
      • 逻辑模型的特点
      • 逻辑模型的例子
      • 逻辑模型的作用
      • 如何创建逻辑模型
      • 逻辑模型中的常见挑战
    • 3. 物理模型:将设计落地为实际数据库
      • 什么是物理模型?
      • 物理模型的特点
      • 物理模型的例子
      • 物理模型的作用
      • 如何创建物理模型
      • 物理模型中的常见挑战
    • 三种模型的比较
    • 从概念到物理:模型转换的最佳实践
    • 实际应用:电子商务数据仓库案例研究
      • 阶段1:概念模型设计
      • 阶段2:逻辑模型设计
      • 阶段3:物理模型设计
    • 从模型到实践:数据仓库实施的关键考虑因素
      • 1. ETL流程设计
      • 2. 数据质量管理
      • 3. 性能优化
      • 4. 安全性和访问控制
      • 5. 元数据管理
    • 结论:从概念到现实的数据仓库之旅
    • 关键要点回顾
    • 实践建议
    • 结语

今天,让我们一起揭开这三大模型的神秘面纱,看看它们如何协同工作,为你的数据仓库搭建一个坚实的基础。
image.png

引言:为什么模型如此重要?

想象一下,你正在建造一座摩天大楼。你会直接开始浇筑混凝土吗?当然不会!你需要先有一个概念设计,然后是详细的蓝图,最后才是实际的建筑计划。数据仓库的建模过程也是如此 - 从抽象到具体,每一步都至关重要。
image.png

让我们深入了解这三种模型,看看它们如何帮助我们构建一个强大、灵活且高效的数据仓库。

1. 概念模型:勾勒数据的蓝图

什么是概念模型?

概念模型是数据建模过程中最高层次的抽象。它就像是你数据世界的"鸟瞰图"。这个模型主要关注的是业务概念以及它们之间的关系,而不涉及任何技术细节。
image.png

概念模型的特点

  1. 高度抽象: 只包含核心实体和它们之间的关系。
  2. 业务导向: 使用业务术语,易于非技术人员理解。
  3. 独立于技术: 不涉及任何特定的数据库技术。
  4. 稳定性: 相对于其他模型,变化较少。
    image.png

概念模型的例子

让我们以一个电子商务平台为例,来创建一个简单的概念模型:

[客户] --- 下单 ---> [订单]
[订单] --- 包含 ---> [商品]
[商品] --- 属于 ---> [类别]

这个简单的图表展示了核心实体(客户、订单、商品、类别)以及它们之间的关系。它不包含任何属性或技术细节,但清晰地表达了业务概念。

概念模型的作用

  1. 沟通工具: 帮助业务人员和技术人员达成共识。
  2. 需求分析: 确保我们捕获了所有重要的业务概念。
  3. 范围界定: 明确项目的边界和重点。

如何创建概念模型

  1. 识别核心业务实体
  2. 定义实体之间的关系
  3. 验证模型是否符合业务需求
  4. 迭代优化,直到所有相关方达成一致

概念模型虽然简单,但它的重要性不容忽视。它为整个数据仓库项目奠定了基础,确保我们从一开始就走在正确的道路上。

2. 逻辑模型:细化你的数据结构

什么是逻辑模型?

逻辑模型是概念模型的下一步细化。它保持了技术中立性,但比概念模型更加详细。逻辑模型定义了数据结构,包括实体、属性、关系和主键。
image.png

逻辑模型的特点

  1. 更多细节: 包含实体的属性和关系的细节。
  2. 规范化: 通常遵循数据库规范化原则。
  3. 独立于特定数据库: 不涉及特定的数据库管理系统(DBMS)。
  4. 业务规则: 包含业务规则和约束。

image.png

逻辑模型的例子

继续我们的电子商务平台例子,让我们看看逻辑模型可能是什么样子:

客户 (客户ID, 姓名, 邮箱, 电话)主键: 客户ID订单 (订单ID, 客户ID, 订单日期, 总金额, 状态)主键: 订单ID外键: 客户ID 引用 客户(客户ID)订单项目 (订单ID, 商品ID, 数量, 单价)主键: (订单ID, 商品ID)外键: 订单ID 引用 订单(订单ID)外键: 商品ID 引用 商品(商品ID)商品 (商品ID, 名称, 描述, 当前价格, 类别ID)主键: 商品ID外键: 类别ID 引用 类别(类别ID)类别 (类别ID, 名称, 父类别ID)主键: 类别ID外键: 父类别ID 引用 类别(类别ID)

这个逻辑模型详细定义了每个实体的属性,以及实体之间的关系。注意我们如何使用主键和外键来表示关系。

逻辑模型的作用

image.png

  1. 详细设计: 为物理实现提供蓝图。
  2. 数据完整性: 通过定义关系和约束确保数据的一致性。
  3. 性能考虑: 可以在这一阶段进行初步的性能优化设计。
  4. 灵活性: 可以相对容易地适应不同的物理实现。

如何创建逻辑模型

  1. 从概念模型开始,详细化每个实体
  2. 定义属性,确定主键
  3. 建立实体之间的关系,定义外键
  4. 应用规范化原则
  5. 添加业务规则和约束
  6. 审查并优化模型
    image.png

逻辑模型中的常见挑战

  1. 粒度选择: 决定数据的详细程度。
  2. 历史数据处理: 如何处理随时间变化的数据。
  3. 性能与规范化的平衡: 有时需要适度反规范化以提高查询性能。

逻辑模型是连接业务需求和技术实现的桥梁。它足够详细以指导实现,又足够抽象以适应不同的技术选择。
image.png

3. 物理模型:将设计落地为实际数据库

什么是物理模型?

物理模型是数据模型的最后一个阶段,它描述了数据在特定数据库管理系统中的实际存储方式。物理模型考虑了性能、存储和可访问性等实际因素。
image.png

物理模型的特点

  1. 特定于DBMS: 使用特定数据库系统的语法和特性。
  2. 性能优化: 包含索引、分区等性能优化策略。
  3. 存储考虑: 定义数据类型、存储参数等。
  4. 安全性: 包含访问控制和安全策略。

物理模型的例子

让我们将之前的逻辑模型转化为PostgreSQL的物理模型:

CREATE TABLE customers (customer_id SERIAL PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE NOT NULL,phone VARCHAR(20)
);CREATE TABLE orders (order_id BIGSERIAL PRIMARY KEY,customer_id INTEGER NOT NULL REFERENCES customers(customer_id),order_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,total_amount DECIMAL(10, 2) NOT NULL,status VARCHAR(20) NOT NULL,CONSTRAINT chk_status CHECK (status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled'))
);CREATE TABLE products (product_id BIGSERIAL PRIMARY KEY,name VARCHAR(200) NOT NULL,description TEXT,current_price DECIMAL(10, 2) NOT NULL,category_id INTEGER NOT NULL
);CREATE TABLE order_items (order_id BIGINT NOT NULL REFERENCES orders(order_id),product_id BIGINT NOT NULL REFERENCES products(product_id),quantity INTEGER NOT NULL,unit_price DECIMAL(10, 2) NOT NULL,PRIMARY KEY (order_id, product_id)
);CREATE TABLE categories (category_id SERIAL PRIMARY KEY,name VARCHAR(100) NOT NULL,parent_category_id INTEGER REFERENCES categories(category_id)
);-- 创建索引以提高查询性能
CREATE INDEX idx_orders_customer ON orders(customer_id);
CREATE INDEX idx_order_items_product ON order_items(product_id);
CREATE INDEX idx_products_category ON products(category_id);-- 假设订单表会非常大,我们可以按年份分区
CREATE TABLE orders_2024 PARTITION OF ordersFOR VALUES FROM ('2024-01-01') TO ('2025-01-01');-- 创建一个物化视图来加速常用的聚合查询
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT DATE_TRUNC('month', order_date) AS month,SUM(total_amount) AS total_sales
FROM orders
GROUP BY DATE_TRUNC('month', order_date);-- 创建一个存储过程来处理新订单
CREATE OR REPLACE PROCEDURE create_order(p_customer_id INTEGER,p_total_amount DECIMAL(10, 2)
)
LANGUAGE plpgsql
AS $$
BEGININSERT INTO orders (customer_id, total_amount, status)VALUES (p_customer_id, p_total_amount, 'pending');
END;
$$;

这个物理模型包含了具体的表结构、数据类型、约束、索引、分区和存储过程。它是针对PostgreSQL数据库的具体实现。

物理模型的作用

  1. 性能优化: 通过索引、分区等策略提高查询和写入性能。
  2. 存储效率: 选择合适的数据类型和存储参数,提高存储效率。
  3. 可维护性: 通过视图、存储过程等简化复杂操作。
  4. 安全性: 实现访问控制和数据保护策略。

如何创建物理模型

  1. 选择目标数据库系统
  2. 将逻辑模型转换为数据库特定的DDL语句
  3. 选择适当的数据类型和约束
  4. 设计索引策略
  5. 考虑分区和聚集
  6. 实现存储过程和触发器
  7. 设置访问控制和安全策略
  8. 进行性能测试和优化

物理模型中的常见挑战

  1. 性能调优: 需要不断监控和优化以适应变化的数据量和查询模式。
  2. 扩展性: 设计需要考虑未来数据增长。
  3. 维护复杂性: 随着时间推移,可能需要管理大量的对象(索引、视图等)。
  4. 版本管理: 需要谨慎管理数据库结构的变更。

物理模型是数据仓库设计的最后一步,也是最具技术性的一步。它直接影响着数据仓库的性能和可用性。

三种模型的比较

让我们通过一个表格来直观地比较这三种模型:

特征概念模型逻辑模型物理模型
抽象级别最高中等最低
目标受众业务人员数据架构师数据库管理员
包含的细节核心实体和关系实体、属性、关系、键表、列、索引、分区等
技术相关性与技术无关与技术无关特定于DBMS
主要用途业务需求分析数据结构设计数据库实现
变更频率
工具ER图、UMLER图、数据字典DDL、数据库设计工具

从概念到物理:模型转换的最佳实践

将概念模型转换为逻辑模型,再转换为物理模型是一个渐进的过程。以下是一些最佳实践:

  1. 保持一致性: 确保每个阶段的模型都与前一阶段保持一致。

  2. 文档化: 记录每个阶段的决策和变更理由。

  3. 迭代优化: 不要期望一次性得到完美的模型,要准备进行多次迭代。

  4. 验证: 在每个阶段都与相关stakeholder验证模型。

  5. 考虑未来: 设计时要考虑到未来的扩展性和灵活性。

  6. 性能与规范化平衡: 在逻辑模型阶段就开始考虑性能问题,必要时进行适度的反规范化。7. 技术选型: 在进行物理模型设计时,充分考虑目标数据库系统的特性和最佳实践。

  7. 数据质量: 在模型设计的每个阶段都要考虑数据质量问题,如何通过模型设计来确保数据的准确性、完整性和一致性。

  8. 安全性: 从逻辑模型阶段就开始考虑数据安全和访问控制问题,在物理模型中具体实现。

  9. 可追溯性: 确保可以从物理模型追溯到逻辑模型和概念模型,这对于后期的维护和变更管理非常重要。

实际应用:电子商务数据仓库案例研究

让我们通过一个电子商务数据仓库的案例,来看看如何在实际项目中应用这三种模型。

阶段1:概念模型设计

在项目启动阶段,我们与业务团队进行了深入的需求分析,识别了以下核心业务概念:

  • 客户
  • 订单
  • 商品
  • 类别
  • 供应商
  • 促销活动

我们使用简单的实体关系图来表示这些概念及其关系:

[客户] --- 下单 ---> [订单]
[订单] --- 包含 ---> [商品]
[商品] --- 属于 ---> [类别]
[供应商] --- 提供 ---> [商品]
[促销活动] --- 应用于 ---> [商品]
[促销活动] --- 针对 ---> [客户]

这个概念模型帮助我们确定了数据仓库的范围,并为后续的详细设计提供了框架。

阶段2:逻辑模型设计

在逻辑模型阶段,我们进一步细化了每个实体的属性,并定义了它们之间的具体关系。以下是部分逻辑模型设计:

客户维度 (客户ID, 姓名, 邮箱, 电话, 注册日期, 客户等级)主键: 客户ID订单事实 (订单ID, 客户ID, 订单日期, 总金额, 折扣金额, 支付方式, 订单状态)主键: 订单ID外键: 客户ID 引用 客户维度(客户ID)商品维度 (商品ID, 商品名称, 描述, 当前价格, 类别ID, 供应商ID)主键: 商品ID外键: 类别ID 引用 类别维度(类别ID)外键: 供应商ID 引用 供应商维度(供应商ID)订单明细事实 (订单ID, 商品ID, 数量, 单价, 折扣)主键: (订单ID, 商品ID)外键: 订单ID 引用 订单事实(订单ID)外键: 商品ID 引用 商品维度(商品ID)类别维度 (类别ID, 类别名称, 父类别ID)主键: 类别ID外键: 父类别ID 引用 类别维度(类别ID)供应商维度 (供应商ID, 供应商名称, 联系人, 地址, 评级)主键: 供应商ID促销活动维度 (促销ID, 促销名称, 开始日期, 结束日期, 折扣类型, 折扣值)主键: 促销ID促销应用事实 (促销ID, 商品ID, 客户ID, 应用日期, 折扣金额)主键: (促销ID, 商品ID, 客户ID, 应用日期)外键: 促销ID 引用 促销活动维度(促销ID)外键: 商品ID 引用 商品维度(商品ID)外键: 客户ID 引用 客户维度(客户ID)

在这个逻辑模型中,我们采用了星型架构,将订单和订单明细作为事实表,其他实体作为维度表。这种设计有利于快速的多维分析和报表生成。

阶段3:物理模型设计

在物理模型阶段,我们需要考虑具体的数据库系统(假设我们使用PostgreSQL)和性能优化策略。以下是部分物理模型设计:

-- 客户维度表
CREATE TABLE dim_customer (customer_id SERIAL PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE NOT NULL,phone VARCHAR(20),registration_date DATE NOT NULL,customer_level VARCHAR(20) NOT NULL,create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);-- 订单事实表
CREATE TABLE fact_order (order_id BIGSERIAL PRIMARY KEY,customer_id INTEGER NOT NULL REFERENCES dim_customer(customer_id),order_date DATE NOT NULL,total_amount DECIMAL(10, 2) NOT NULL,discount_amount DECIMAL(10, 2) NOT NULL DEFAULT 0,payment_method VARCHAR(50) NOT NULL,order_status VARCHAR(20) NOT NULL,create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);-- 创建分区表以提高查询性能
CREATE TABLE fact_order_2024 PARTITION OF fact_orderFOR VALUES FROM ('2024-01-01') TO ('2025-01-01');-- 创建索引以加速常见查询
CREATE INDEX idx_fact_order_customer ON fact_order(customer_id);
CREATE INDEX idx_fact_order_date ON fact_order(order_date);-- 创建物化视图以加速常用的聚合查询
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT order_date,COUNT(*) AS order_count,SUM(total_amount) AS total_sales,AVG(total_amount) AS avg_order_value
FROM fact_order
GROUP BY order_date;-- 创建存储过程以简化复杂的数据操作
CREATE OR REPLACE PROCEDURE update_customer_level()
LANGUAGE plpgsql
AS $$
BEGINUPDATE dim_customer cSET customer_level = CASE WHEN total_spent >= 10000 THEN 'Platinum'WHEN total_spent >= 5000 THEN 'Gold'WHEN total_spent >= 1000 THEN 'Silver'ELSE 'Bronze'END,update_date = CURRENT_TIMESTAMPFROM (SELECT customer_id, SUM(total_amount) AS total_spentFROM fact_orderGROUP BY customer_id) oWHERE c.customer_id = o.customer_id;
END;
$$;

在这个物理模型中,我们实现了以下优化策略:

  1. 使用适当的数据类型和约束
  2. 创建分区表以提高大表的查询性能
  3. 添加索引以加速常见查询
  4. 创建物化视图以提高聚合查询的性能
  5. 使用存储过程封装复杂的业务逻辑

从模型到实践:数据仓库实施的关键考虑因素

在完成三个层次的模型设计后,实施数据仓库还需要考虑以下几个关键因素:

1. ETL流程设计

抽取(Extract)、转换(Transform)和加载(Load)是数据仓库的核心流程。基于我们的模型,需要设计:

  • 如何从源系统抽取数据
  • 如何清洗和转换数据以符合我们的模型
  • 如何高效地加载数据到仓库中

例如,对于订单数据,我们可能需要:

import pandas as pd
from sqlalchemy import create_enginedef etl_orders():# 从源系统抽取数据source_engine = create_engine('postgresql://user:pass@source_host/db')orders_df = pd.read_sql('SELECT * FROM orders WHERE date > last_etl_date', source_engine)# 数据转换orders_df['total_amount'] = orders_df['subtotal'] + orders_df['tax'] - orders_df['discount']orders_df['order_status'] = orders_df['status'].map({'P': 'Pending', 'S': 'Shipped', 'D': 'Delivered'})# 加载到数据仓库target_engine = create_engine('postgresql://user:pass@dw_host/db')orders_df.to_sql('fact_order', target_engine, if_exists='append', index=False)# 定期运行ETL作业
schedule.every().day.at("02:00").do(etl_orders)

2. 数据质量管理

确保数据质量是数据仓库成功的关键。我们需要在ETL过程中实施数据质量检查:

def check_data_quality(df):# 检查空值null_counts = df.isnull().sum()if null_counts.any():raise ValueError(f"发现空值: {null_counts[null_counts > 0]}")# 检查数据范围if df['total_amount'].min() < 0:raise ValueError("发现负数订单金额")# 检查唯一性约束if df['order_id'].duplicated().any():raise ValueError("发现重复的订单ID")# 在ETL过程中调用
check_data_quality(orders_df)

3. 性能优化

随着数据量的增长,性能优化变得越来越重要。除了前面提到的分区和索引策略,我们还可以:

  • 使用并行处理来加速ETL
  • 实施数据压缩
  • 定期进行统计信息更新
  • 使用查询优化器提示
-- 使用并行查询
SET max_parallel_workers_per_gather = 4;-- 压缩大表
ALTER TABLE fact_order SET (autovacuum_enabled = false);
ALTER TABLE fact_order SET (parallel_workers = 4);
VACUUM (VERBOSE, ANALYZE, FULL) fact_order;-- 更新统计信息
ANALYZE fact_order;-- 使用查询优化器提示
EXPLAIN (ANALYZE, BUFFERS)
SELECT /*+ BitmapScan(fact_order) */customer_id, SUM(total_amount)
FROM fact_order
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY customer_id;

4. 安全性和访问控制

数据安全是另一个关键考虑因素。我们需要实施:

  • 行级安全性
  • 列级加密
  • 角色基础的访问控制
-- 创建角色
CREATE ROLE sales_analyst;
CREATE ROLE marketing_analyst;-- 授予权限
GRANT SELECT ON fact_order TO sales_analyst;
GRANT SELECT ON dim_customer TO marketing_analyst;-- 实施行级安全性
ALTER TABLE fact_order ENABLE ROW LEVEL SECURITY;CREATE POLICY order_access_policy ON fact_orderUSING (current_user = 'sales_analyst' OR order_status = 'Completed');-- 列级加密
ALTER TABLE dim_customerALTER COLUMN email SET DATA TYPE bytea USING pgp_sym_encrypt(email::text, 'secret_key')::bytea;

5. 元数据管理

好的元数据管理可以提高数据仓库的可用性和可维护性。我们可以创建一个元数据仓库来存储:

  • 数据字典
  • 数据血缘关系
  • ETL作业信息
  • 数据质量检查结果
CREATE TABLE metadata_dictionary (table_name VARCHAR(100),column_name VARCHAR(100),data_type VARCHAR(50),description TEXT,source_system VARCHAR(100),last_updated TIMESTAMP
);INSERT INTO metadata_dictionary VALUES
('fact_order', 'order_id', 'BIGINT', '订单唯一标识符', 'ERP系统', CURRENT_TIMESTAMP),
('fact_order', 'customer_id', 'INTEGER', '客户ID', 'CRM系统', CURRENT_TIMESTAMP),
-- ... 其他元数据

结论:从概念到现实的数据仓库之旅

通过本文,我们详细探讨了数据仓库建模的三个关键阶段:概念模型、逻辑模型和物理模型。每个阶段都有其独特的作用和挑战:

  1. 概念模型帮助我们捕获核心业务概念,为整个项目定下基调。
  2. 逻辑模型将抽象概念转化为具体的数据结构,为实施提供蓝图。
  3. 物理模型考虑实际的技术约束和性能需求,将设计落地为可执行的数据库结构。

在实际项目中,这三个阶段并非孤立的步骤,而是一个迭代和反馈的过程。随着对业务的深入理解和技术的不断演进,我们可能需要多次调整和优化我们的模型。

记住,一个成功的数据仓库不仅仅是良好的模型设计,还需要考虑ETL流程、数据质量、性能优化、安全性和元数据管理等多个方面。只有将这些因素综合考虑,我们才能构建一个真正满足业务需求、高效可靠的数据仓库系统。

最最后,让我们回顾一下数据仓库建模的关键点,并为数据工程师和架构师提供一些实践建议:

关键要点回顾

  1. 概念模型是最抽象的层次,focus on 业务概念和关系,不涉及技术细节。
  2. 逻辑模型进一步细化数据结构,定义实体、属性和关系,但仍保持技术中立。
  3. 物理模型考虑具体的数据库系统,实现实际的表结构、索引和优化策略。
  4. 三种模型形成了一个从抽象到具体的连续体,每一步都对最终的数据仓库实现至关重要。
  5. 除了模型设计,成功的数据仓库还需要考虑ETL、数据质量、性能优化、安全性和元数据管理等方面。

实践建议

  1. 保持模型的一致性: 确保概念模型、逻辑模型和物理模型之间保持一致。任何一个层面的变更都应该考虑对其他层面的影响。

  2. 迭代优化: 数据仓库建模是一个迭代的过程。随着对业务的深入理解和需求的变化,不断优化和调整你的模型。

  3. 关注数据质量: 在模型设计的每个阶段都要考虑数据质量。定义清晰的数据规则和约束,并在ETL过程中实施严格的数据质量检查。

  4. 性能与可用性平衡: 在追求查询性能的同时,也要考虑模型的可理解性和可维护性。过度的性能优化可能会导致模型变得复杂难懂。

  5. 文档化: 详细记录你的设计决策、数据定义和业务规则。好的文档可以大大提高数据仓库的可用性和可维护性。

  6. 考虑未来扩展: 在设计时要考虑到未来可能的需求变化和数据增长。预留一些灵活性,以便未来能够更容易地进行扩展和调整。

  7. 重视安全性: 从一开始就将数据安全纳入考虑范围。实施适当的访问控制,保护敏感数据。

  8. 持续监控和优化: 数据仓库不是"一次性"工程。持续监控其性能和使用情况,并根据实际情况进行优化。

结语

数据仓库建模是一门艺术,也是一门科学。它需要我们既能够从高层次理解业务需求,又能深入技术细节解决实际问题。通过掌握概念模型、逻辑模型和物理模型这三个层次的设计,我们就拥有了构建强大、灵活、高效数据仓库的基础工具。

记住,最好的模型是那些能够有效支持业务决策,同时又易于理解和维护的模型。它应该是业务需求和技术可能性的完美平衡。作为数据工程师或架构师,我们的目标就是创造这样的平衡,为组织提供真正的数据价值。

希望这篇文章能够帮助你更好地理解数据仓库建模的过程,并在实践中创建出优秀的数据仓库解决方案。数据的世界永远充满挑战和机遇,让我们继续学习,不断探索,用数据为世界创造更多价值!
数据仓库.png

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

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

相关文章

十大护眼落地灯品牌哪个牌子好?落地灯品牌排行前十名

十大护眼落地灯品牌哪个牌子好&#xff1f;随着快经济时代的到来&#xff0c;人们在学业以及事业上的压力也日益增加&#xff0c;不少朋友反应在日常工作、学习是经常出现眼部疲劳的状况&#xff0c;甚至会时不时出现眼睛干涩、流泪&#xff0c;对学习、工作状态造成了极大的困…

【Python学习手册(第四版)】学习笔记20.2-迭代和解析(二)-迭代解析、迭代方法的计时比较、函数陷阱

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单&#xff0c;主要是概括了解析语法&#xff08;列表解析、生成器、集合、字典解析&#xff09;&#xff0c;以及对前面的各种迭代进行计时比较&#xf…

漂亮的业绩,重挫的股价,快手“遭遇”了什么?

现象与本质往往背道而驰&#xff0c;如同威廉莎士比亚形容的那般&#xff0c;“表面的平静可能掩盖了深深的波澜。”这一真理不仅充斥在生活中的各个片段&#xff0c;也散布在市场的每一个瞬间。 近日发布二季度财报的快手就迎来了“两级反转”。多项核心业绩指标录得增幅的同…

云计算产业链图谱_产业链全景图_云计算行业市场分析

在产业数字化转型的背景下&#xff0c;云计算作为信息技术的重要组成部分&#xff0c;正逐渐成为各行业数字化、智能化转型的关键支撑。受益于5G、大数据、物联网、人工智能等技术的快速发展&#xff0c;云计算产业规模持续扩大&#xff0c;市场需求不断增长。云计算作为一种新…

网络安全教程初级简介

随着技术的发展和信息池的增加&#xff0c;信息系统迫切需要建立网络安全措施&#xff0c;以保护输入这些系统的信息。网络安全是任何组织&#xff08;从小型初创公司到大型跨国组织&#xff09;的必备条件。 网络安全包括一系列技术、流程和实践&#xff0c;用于保护网络、设…

【Kotlin设计模式】Kotlin实现工厂模式

前言 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;提供一个创建对象的接口&#xff0c;不暴露对象的创建过程。它将实例化对象的任务交给子类或具体实现&#xff0c;从而使得客户端代码与具体类解耦。 工厂模式主要分为以下三类&#xf…

音乐剪辑软件哪个好用?免费音乐编辑软件大推荐

在音符跳跃的创意海洋里&#xff0c;每一段旋律都藏着一个故事等待被精心雕琢。 但何以让这份灵感自由翱翔&#xff0c;又无需负担昂贵的工具枷锁&#xff1f;哪款音乐剪辑软件免费版能够成为你音乐创作旅程中的最佳拍档&#xff1f; 在这五彩斑斓的数字音频世界中&#xff0…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用&#xff1f; 在 Vi 输入电压接近于零时&#xff0c;D1、D2 给三极管 T1、T2 提供偏置电压&#xff0c;使 T1、T2 维持导通&#xff0c;以消除交越失真。 陈氏解释 这道题参见&#xff1a;硬件面试经典 100 题&#xff08;51~70 题…

Nginx 反向代理实现 Tomcat 高可用性负载均衡详解

Tomcat 简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务…

【OpenCV】 中使用 Lucas-Kanade 光流进行对象跟踪和路径映射

文章目录 一、说明二、什么是Lucas-Kanade 方法三、Lucas-Kanade 原理四、代码实现4.1 第 1 步&#xff1a;用户在第一帧绘制一个矩形4.2 第 2 步&#xff1a;从图像中提取关键点4.3 第 3 步&#xff1a;跟踪每一帧的关键点 一、说明 本文针对基于光流法的目标追踪进行叙述&am…

影响我国地理信息产业发展最大的阻碍是?

我国地理信息产业发展迅速&#xff0c;大家可以从业内协会领导或院士报告中了解相关数据&#xff0c;每年地理信息产业规模多少多少亿&#xff0c;增长多少多少百分比&#xff0c;在成绩喜人的同时&#xff0c;当然专家或院士从更高层面分析了当前地理信息产业所遇到的困难与阻…

如何使用ssm实现基于ssm的“游侠”旅游信息管理系统

TOC ssm190基于ssm的“游侠”旅游信息管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#x…

如何用Java SpringBoot和Vue搭建高效的OA办公管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Leetcode 46.全排列

注意的点&#xff1a; 1、回溯本质就是搜索树的树枝&#xff0c;维护三个核心变量&#xff1a;path&#xff08;需要恢复现场&#xff09;&#xff0c;visited&#xff08;需要恢复现场&#xff09;&#xff0c;以及res 解法&#xff1a;回溯算法 class Solution:def permut…

linux死锁问题和cpu使用率过高问题排查

1、问题共同点 死锁问题和cpu使用率过高都是需要我们找出对应的问题线程。 死锁问题需要我们找出哪两个线程出现了死锁情况。 cpu使用率过高需要我们找出哪个或哪些线程占用了大量的cpu。 2、命令排查 2.1、查看机器上的Java进程 jcmd或 jps2.2、查看对应Java进程的线程级别…

简单的jar包重打包Failed to get nested archive for entry 报错处理

简单的jar包重打包Failed to get nested archive for entry 报错处理 1. 需求 公司有一个后端项目&#xff0c;项目已经打好了jar包&#xff0c;现在我们发现jar包依赖的子包有问题&#xff0c;其中的一个mybatis xml文件查询数据不正确&#xff0c;我们需要替换项目&#xf…

Java语言程序设计基础篇_编程练习题*17.4 (将文本文件转換为UTF格式)

目录 题目&#xff1a;*17.4 (将文本文件转換为UTF格式) 习题思路 代码示例 输出结果 题目&#xff1a;*17.4 (将文本文件转換为UTF格式) 编写一个程序&#xff0c;每次从文本文件中读取多行字符&#xff0c;并将这些行字符以UTF-8字符串格式写入一个二进制文件中…

Jenkins 2.346.1完整搭建及项目部署安装

java version "1.8.0_202" 1.安装 官网下载war包直接启动&#xff0c;比较简单&#xff0c; linux命令 &#xff1a; wget https://mirrors.jenkins.io/war-stable/2.346.1/jenkins.war 2.启动命令 nohup java -jar jenkins.war --httpPort8777 --prefix/jenkin…

整套厨帽检测算法样本、模型、源码和厨帽算法识别应用方案介绍

厨帽检测算法的应用方案主要涉及技术选型、硬件配置、软件集成、部署与监控以及应对实际挑战等多个方面。以下是一个详细的应用方案概述&#xff1a; 一、技术选型 深度学习技术&#xff1a;厨帽检测算法主要基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&…

“解锁进程间高效沟通,Linux IPC是你的关键钥匙!“#Linux系统编程之进程间通信【下】

"解锁进程间高效沟通&#xff0c;Linux IPC是你的关键钥匙&#xff01;"#Linux系统编程之进程间通信【下】 前言预备知识一、 共享内存概述1.1 共享内存概述简图 二、 共享内存编程实战2.1 共享内存介绍2.1.1 共享内存的特点 2.2 共享内存几个重要API介绍2.2.1 shmge…