数据仓库系列 5:什么是事实表和维度表,它们有什么作用?

news2024/9/20 18:29:34

稿定设计-3.png

目录

    • 1. 引言:事实表与维度表的魔力
    • 2. 事实表:业务活动的数字足迹
      • 2.1 什么是事实表?
      • 2.2 事实表的特征
      • 2.3 事实表的类型
      • 2.4 事实表示例
      • 2.5 事实表的作用
      • 2.6 事实表的设计原则
      • 2.7 事实表的查询示例
    • 3. 维度表:为数据赋予意义
      • 3.1 什么是维度表?
      • 3.2 维度表的特征
      • 3.3 维度表的类型
      • 3.4 维度表示例
      • 3.5 维度表的作用
      • 3.6 维度表的设计原则
      • 3.7 维度表的查询示例
    • 4. 事实表和维度表的协## 4. 事实表和维度表的协同作用
      • 4.1 星型模式(Star Schema)
      • 4.2 雪花模式(Snowflake Schema)
      • 4.3 事实表和维度表的协同查询示例
    • 5. 事实表和维度表的设计最佳实践
      • 5.1 事实表设计最佳实践
      • 5.2 维度表设计最佳实践
      • 5.3 事实表和维度表协同设计最佳实践
    • 6. 实际应用案例:电子商务数据仓库
      • 6.1 需求分析
      • 6.2 模型设计
      • 6.3 表结构
      • 6.4 示例查询
    • 7. 结论

想象一下,你正在驾驶一架数据飞机,翱翔在浩瀚的数据仓库上空。你的左翼是事实表,记录着业务的每一次跳动;右翼是维度表,为你的数据赋予丰富的上下文。没有这对翅膀,你的数据分析之旅将无法起飞。今天,让我们一起深入探索这个数据仓库的核心概念,看看它如何彻底改变你的数据分析方式!
image.png

1. 引言:事实表与维度表的魔力

在大数据的世界里,事实表(Fact Table)和维度表(Dimension Table)就像是构建数据仓库的两大支柱。它们不仅是数据存储的基本单元,更是整个数据分析体系的基石。但是,你可能会问:“为什么我们需要区分事实表和维度表?它们到底有什么魔力?”

让我们打个比方:想象你正在经营一家在线书店。每天,你都会收到大量的订单信息。这些订单就像是流星雨,携带着大量的原始数据信息。如果我们把这些数据直接堆积在一起,就会形成一个难以理解和分析的数据黑洞。这时,事实表和维度表就派上用场了。

事实表就像是一本详细的日记,记录着每一笔交易的关键信息:谁(客户)在什么时候(时间)买了什么书(产品),花了多少钱(金额)。而维度表则像是一本百科全书,提供了对这些交易更深入的解释:客户的详细信息,书籍的分类和作者,时间的各个层面(年、月、日、季度)等。

通过这种方式,我们不仅可以回答"发生了什么"的问题(通过事实表),还能回答"为什么发生"和"如何发生"的问题(通过维度表)。这就是事实表和维度表的魔力所在!

接下来,让我们深入探讨这两种表的本质,看看它们如何协同工作,为我们的数据分析提供无与伦比的洞察力。
image.png

2. 事实表:业务活动的数字足迹

2.1 什么是事实表?

事实表是数据仓库中最核心的表,它记录了业务过程中的度量事件。简单来说,事实表就是用来存储业务过程中的"事实"的。这里的"事实"通常是可以计数、求和或平均的数值。

在我们的在线书店例子中,一个典型的事实表可能是"销售事实表",它记录了每一次图书销售的详细信息。
image.png

2.2 事实表的特征

  1. 粒度(Granularity): 事实表的每一行代表一个业务事件,粒度越细,数据越详细。例如,我们的销售事实表可能以"每次订单中的每本书"为粒度。

  2. 外键(Foreign Keys): 事实表通常包含多个外键,这些外键与维度表相关联。

  3. 度量值(Measures): 这些是可以聚合的数值型数据,如销售金额、数量等。

  4. 可加性(Additive): 大多数事实是可加的,即可以在所有维度上进行聚合。
    image.png

2.3 事实表的类型

  1. 事务事实表(Transaction Fact Table): 记录特定事件的度量值,如每次销售。

  2. 周期快照事实表(Periodic Snapshot Fact Table): 定期记录状态,如每月库存。

  3. 累积快照事实表(Accumulating Snapshot Fact Table): 记录过程的多个阶段,如订单从下单到交付的全过程。

image.png

2.4 事实表示例

让我们来看一个具体的销售事实表例子:

CREATE TABLE sales_fact (
    sale_id INT PRIMARY KEY,
    date_key INT,
    product_key INT,
    customer_key INT,
    store_key INT,
    quantity INT,
    unit_price DECIMAL(10,2),
    total_price DECIMAL(10,2),
    FOREIGN KEY (date_key) REFERENCES date_dim(date_key),
    FOREIGN KEY (product_key) REFERENCES product_dim(product_key),
    FOREIGN KEY (customer_key) REFERENCES customer_dim(customer_key),
    FOREIGN KEY (store_key) REFERENCES store_dim(store_key)
);

在这个例子中:

  • sale_id 是主键,唯一标识每次销售。
  • date_key, product_key, customer_key, store_key 是外键,关联到相应的维度表。
  • quantity, unit_price, total_price 是度量值,记录了销售的具体数据。

2.5 事实表的作用

  1. 记录业务活动: 事实表捕获了业务过程中的关键事件,为分析提供了基础数据。

  2. 支持聚合分析: 通过事实表,我们可以轻松地进行各种聚合操作,如计算总销售额、平均订单金额等。

  3. 提供时间序列数据: 事实表通常包含时间维度,使得我们可以进行时间序列分析,观察业务趋势。

  4. 连接维度: 事实表通过外键与各个维度表相连,使得我们可以从多个角度分析数据。
    image.png

2.6 事实表的设计原则

  1. 选择合适的粒度: 粒度要足够细,以支持各种可能的分析需求,但也要考虑到存储和性能的平衡。

  2. 确定维度: 仔细选择与事实相关的维度,确保它们能够提供有意义的分析视角。

  3. 选择度量: 包含那些对业务分析有价值的可聚合度量。

  4. 使用代理键: 为了提高性能和灵活性,通常使用代理键而不是自然键作为主键。

  5. 考虑历史追踪: 如果业务需求包括历史数据分析,考虑使用缓慢变化维度(SCD)技术。
    image.png

2.7 事实表的查询示例

让我们通过一个查询示例来看看如何使用事实表进行分析:

SELECT 
    d.year,
    p.category,
    SUM(s.total_price) as total_sales,
    COUNT(DISTINCT s.customer_key) as unique_customers
FROM 
    sales_fact s
    JOIN date_dim d ON s.date_key = d.date_key
    JOIN product_dim p ON s.product_key = p.product_key
GROUP BY 
    d.year, p.category
ORDER BY 
    d.year, total_sales DESC;

这个查询:

  1. 连接了销售事实表与日期和产品维度表
  2. 按年份和产品类别分组
  3. 计算了每个组的总销售额和唯一客户数
  4. 结果按年份和总销售额排序

通过这个查询,我们可以得到每年每个产品类别的销售表现,以及吸引的客户数量,这对于分析产品类别的表现趋势非常有用。

3. 维度表:为数据赋予意义

3.1 什么是维度表?

image.png

维度表是数据仓库中用来描述业务对象特征的表。它们为事实表中的数字度量提供上下文,使得数据更容易理解和分析。维度表通常包含描述性的、文本型的字段,这些字段用于过滤、分组和标记。

在我们的在线书店例子中,典型的维度表可能包括:客户维度表、产品维度表、时间维度表等。

3.2 维度表的特征

  1. 描述性属性: 维度表包含大量的描述性文本字段,这些字段用于提供业务环境。

  2. 层次结构: 维度表often包含层次结构,如地理维度中的国家-省份-城市。

  3. 相对较少的行: 与事实表相比,维度表通常有较少的行,但每行可能包含很多列。

  4. 主键: 通常使用代理键作为主键,这个键会被用作事实表中的外键。
    image.png

3.3 维度表的类型

  1. 一致性维度(Conformed Dimension): 在多个事实表间共享的维度,如时间维度。

  2. 退化维度(Degenerate Dimension): 存储在事实表中的维度属性,如订单号。

  3. 角色扮演维度(Role-Playing Dimension): 同一个维度表在事实表中扮演多个角色,如在订单事实表中的订单日期和发货日期。

  4. 渐变维度(Slowly Changing Dimension, SCD): 随时间变化的维度,通常分为SCD1(覆盖),SCD2(保存历史)和SCD3(保存部分历史)。
    image.png

3.4 维度表示例

让我们来看一个具体的产品维度表例子:

CREATE TABLE product_dim (
    product_key INT PRIMARY KEY,
    product_id VARCHAR(50),
    product_name VARCHAR(100),
    category VARCHAR(50),
    subcategory VARCHAR(50),
    brand VARCHAR(50),
    price DECIMAL(10,2),
    cost DECIMAL(10,2),
    description TEXT,
    launch_date DATE,
    is_active BOOLEAN
);

在这个例子中:

  • product_key 是代理键,作为主键。
  • product_id 是业务系统中的原始ID。
  • 其他字段提供了产品的各种属性,如名称、类别、品牌、价格等。

3.5 维度表的作用

  1. 提供分析上下文: 维度表为事实表中的数字提供了丰富的上下文信息,使数据更有意义。

  2. 支持多角度分析: 通过不同的维度,我们可以从多个角度来分析同一组事实数据。

  3. 优化查询性能: 维度表通常被预先聚合和索引,可以大大提高查询性能。

  4. 支持数据一致性: 一致性维度确保了跨多个事实表的分析结果是一致的。

  5. 便于理解和使用: 维度表的结构通常更接近业务用户的思维方式,使得数据更容易被理解和使用。

3.6 维度表的设计原则

  1. 选择合适的粒度: 维度的粒度应该与相关事实表的粒度相匹配。

  2. 使用代理键: 代理键可以提高性能,并使得处理历史变化更加容易。

  3. 包含丰富的属性: 尽可能包含多的描述性属性,这些属性可能在将来的分析中派上用场。

  4. 规范化vs反规范化: 在维度建模中,通常倾向于反规范化设计,以提高查询性能。

  5. 考虑SCD策略: 根据业务需求,为每个维度选择合适的SCD策略。

  6. 保持一致性: 确保维度在整个数据仓库中保持一致,特别是在多个事实表之间共享时。

3.7 维度表的查询示例

让我们通过一个查询示例来看看如何利用维度表进行分析:

SELECT 
    c.customer_segment,
    p.category,
    d.year,
    d.quarter,
    SUM(s.total_price) as total_sales,
    COUNT(DISTINCT s.sale_id) as number_of_orders,
    AVG(s.total_price) as average_order_value
FROM 
    sales_fact s
    JOIN customer_dim c ON s.customer_key = c.customer_key
    JOIN product_dim p ON s.product_key = p.product_key
    JOIN date_dim d ON s.date_key = d.date_key
WHERE 
    d.year = 2023
GROUP BY 
    c.customer_segment,
    p.category,
    d.year,
    d.quarter
ORDER BY 
    c.customer_segment,
    total_sales DESC;

这个查询:

  1. 连接了销售事实表与客户、产品和日期维度表
  2. 筛选出2023年的数据
  3. 按客户细分、产品类别、年份和季度分组
  4. 计算了每个组的总销售额、订单数和平均订单价值
  5. 结果按客户细分和总销售额排序

通过这个查询,我们可以得到2023年每个季度不同客户细分在各产品类别上的销售表现,这对于了解客户行为和产品表现非常有价值。

4. 事实表和维度表的协## 4. 事实表和维度表的协同作用

事实表和维度表并不是孤立存在的,它们之间的关系和协同作用是数据仓库设计的精髓所在。让我们深入探讨它们如何共同工作,为数据分析提供强大的支持。

4.1 星型模式(Star Schema)

星型模式是最常见的数据仓库模式之一,它由一个中心事实表和多个维度表组成,形状类似于星星。

       +--------------+
       |   客户维度   |
       +--------------+
              |
              |
+--------------+     +--------------+
|   时间维度   |-----|   销售事实   |-----| 产品维度    |
+--------------+     +--------------+     +--------------+
              |
              |
       +--------------+
       |   店铺维度   |
       +--------------+

优点:

  • 查询性能好,因为只需要一次 JOIN 就可以连接事实表和任何维度表
  • 易于理解和使用,特别是对业务用户来说
  • 维度表是非规范化的,减少了 JOIN 操作

缺点:

  • 可能导致数据冗余,特别是在维度表中

4.2 雪花模式(Snowflake Schema)

雪花模式是星型模式的变体,其中一些维度表被进一步规范化,形成了多层结构。

                 +--------------+
                 |     国家     |
                 +--------------+
                        |
                 +--------------+
                 |     城市     |
                 +--------------+
                        |
       +--------------+ |
       |   客户维度   |-+
       +--------------+
              |
              |
+--------------+     +--------------+
|   时间维度   |-----|   销售事实   |-----| 产品维度    |
+--------------+     +--------------+     +--------------+
              |                                  |
              |                           +--------------+
       +--------------+                   |   类别维度   |
       |   店铺维度   |                   +--------------+
       +--------------+

优点:

  • 减少了数据冗余
  • 维护某些类型的维度更容易

缺点:

  • 查询性能可能下降,因为需要更多的 JOIN 操作
  • 结构更复杂,可能更难理解和使用

4.3 事实表和维度表的协同查询示例

让我们通过一个复杂一点的查询示例来展示事实表和维度表如何协同工作:

WITH monthly_sales AS (
    SELECT 
        d.year,
        d.month,
        p.category,
        c.customer_segment,
        s.store_key,
        SUM(sf.total_price) as total_sales,
        COUNT(DISTINCT sf.customer_key) as unique_customers
    FROM 
        sales_fact sf
        JOIN date_dim d ON sf.date_key = d.date_key
        JOIN product_dim p ON sf.product_key = p.product_key
        JOIN customer_dim c ON sf.customer_key = c.customer_key
        JOIN store_dim s ON sf.store_key = s.store_key
    WHERE 
        d.year = 2023
    GROUP BY 
        d.year, d.month, p.category, c.customer_segment, s.store_key
),
store_rankings AS (
    SELECT 
        year,
        month,
        category,
        customer_segment,
        store_key,
        total_sales,
        unique_customers,
        ROW_NUMBER() OVER (PARTITION BY year, month, category, customer_segment 
                           ORDER BY total_sales DESC) as store_rank
    FROM 
        monthly_sales
)
SELECT 
    sr.year,
    sr.month,
    sr.category,
    sr.customer_segment,
    s.store_name,
    s.city,
    s.state,
    sr.total_sales,
    sr.unique_customers,
    sr.store_rank
FROM 
    store_rankings sr
    JOIN store_dim s ON sr.store_key = s.store_key
WHERE 
    sr.store_rank <= 3
ORDER BY 
    sr.year, sr.month, sr.category, sr.customer_segment, sr.store_rank;

这个查询做了以下事情:

  1. 计算了2023年每个月、每个产品类别、每个客户细分、每个商店的销售总额和唯一客户数。
  2. 对每个月、产品类别和客户细分的组合,根据销售总额对商店进行了排名。
  3. 选出了每个组合中销售额排名前三的商店。
  4. 最后,我们加入了商店维度表,获取了商店的详细信息。

这个查询展示了如何利用事实表和多个维度表进行复杂的分析。我们不仅可以看到销售表现,还能了解到最佳表现的商店及其位置,这对于了解不同地区、不同客户群的销售趋势非常有价值。

5. 事实表和维度表的设计最佳实践

设计高效的事实表和维度表是构建成功数据仓库的关键。以下是一些最佳实践:

5.1 事实表设计最佳实践

  1. 选择适当的粒度: 粒度应该足够细,以支持各种可能的分析需求,但也要考虑到存储和性能的平衡。

  2. 使用代理键: 使用整数类型的代理键作为主键,而不是使用业务键。这可以提高性能并简化维度变化的处理。

  3. 最小化 NULL 值: 尽量避免在事实表中使用 NULL 值,因为它们可能会导致聚合函数出现意外结果。

  4. 包含日期键: 几乎所有的事实表都应该包含一个日期键,以支持时间维度的分析。

  5. 考虑加入退化维度: 某些维度属性(如订单号)可以直接存储在事实表中,而不需要单独的维度表。

  6. 正确处理不同类型的事实:

    • 可加事实: 可以在所有维度上进行聚合(如销售额)
    • 半可加事实: 只能在某些维度上聚合(如库存水平)
    • 非可加事实: 不能直接聚合,通常是比率(如单价)
  7. 优化大表: 对于非常大的事实表,考虑使用分区和索引来提高查询性能。

5.2 维度表设计最佳实践

  1. 使用代理键: 同样,使用整数类型的代理键作为主键。

  2. 包含丰富的属性: 在维度表中包含尽可能多的描述性属性。这些属性可能在将来的分析中派上用场。

  3. 规范化 vs 反规范化: 在维度建模中,通常倾向于反规范化设计,以提高查询性能。但要权衡数据冗余和维护的复杂性。

  4. 处理层次结构: 对于具有层次结构的维度(如地理维度),可以将所有层次都包含在同一个维度表中,或者使用雪花模式。

  5. 实现缓慢变化维度(SCD): 根据业务需求,为每个维度选择合适的 SCD 策略:

    • SCD1: 直接覆盖旧值
    • SCD2: 保留历史记录,添加新行
    • SCD3: 保留部分历史,添加新列
  6. 使用一致的命名约定: 在所有维度表中使用一致的命名约定,这有助于提高可读性和可维护性。

  7. 考虑角色扮演维度: 同一个维度表可能在不同的上下文中扮演不同的角色(如日期维度可以是订单日期、发货日期等)。

5.3 事实表和维度表协同设计最佳实践

  1. 保持一致性: 确保维度在整个数据仓库中保持一致,特别是在多个事实表之间共享时。

  2. 平衡星型和雪花型模式: 根据具体需求选择合适的模式。星型模式通常更简单,性能更好;雪花模式可以减少数据冗余。

  3. 考虑查询模式: 在设计时考虑最常见的查询模式,确保这些查询能够高效执行。

  4. 定期重新评估: 随着业务的变化,定期重新评估你的设计,确保它仍然满足需求。

  5. 文档化: 详细记录你的设计决策、表结构、字段含义等。这对于维护和新团队成员的加入都非常重要。

6. 实际应用案例:电子商务数据仓库

让我们通过一个电子商务数据仓库的案例来看看如何应用事实表和维度表的概念。

6.1 需求分析

假设我们正在为一个在线书店设计数据仓库。主要的分析需求包括:

  • 销售趋势分析(按时间、产品类别、客户群等)
  • 客户行为分析
  • 库存管理
  • 营销活动效果分析

6.2 模型设计

基于这些需求,我们可以设计以下的星型模式:

  1. 事实表:

    • 销售事实表
    • 库存事实表
    • 营销活动事实表
  2. 维度表:

    • 时间维度
    • 产品维度
    • 客户维度
    • 店铺维度
    • 营销活动维度

6.3 表结构

让我们详细看看其中几个表的结构:

-- 销售事实表
CREATE TABLE sales_fact (
    sale_key INT PRIMARY KEY,
    date_key INT,
    product_key INT,
    customer_key INT,
    store_key INT,
    quantity INT,
    unit_price DECIMAL(10,2),
    total_price DECIMAL(10,2),
    discount_amount DECIMAL(10,2),
    FOREIGN KEY (date_key) REFERENCES date_dim(date_key),
    FOREIGN KEY (product_key) REFERENCES product_dim(product_key),
    FOREIGN KEY (customer_key) REFERENCES customer_dim(customer_key),
    FOREIGN KEY (store_key) REFERENCES store_dim(store_key)
);

-- 产品维度表
CREATE TABLE product_dim (
    product_key INT PRIMARY KEY,
    product_id VARCHAR(50),
    product_name VARCHAR(100),
    author VARCHAR(100),
    publisher VARCHAR(100),
    category VARCHAR(50),
    subcategory VARCHAR(50),
    price DECIMAL(10,2),
    cost DECIMAL(10,2),
    publication_date DATE,
    is_active BOOLEAN
);

-- 客户维度表
CREATE TABLE customer_dim (
    customer_key INT PRIMARY KEY,
    customer_id VARCHAR(50),
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100),
    phone VARCHAR(20),
    address VARCHAR(200),
    city VARCHAR(50),
    state VARCHAR(50),
    country VARCHAR(50),
    postal_code VARCHAR(20),
    registration_date DATE,
    customer_segment VARCHAR(50)
);

-- 时间维度表
CREATE TABLE date_dim (
    date_key INT PRIMARY KEY,
    date DATE,
    day_of_week VARCHAR(10),
    day_of_month INT,
    month INT,
    quarter INT,
    year INT,
    is_weekend BOOLEAN,
    is_holiday BOOLEAN
);

6.4 示例查询

下面是一些使用这个数据仓库模型的示例查询:

  1. 按月、产品类别的销售趋势:
SELECT 
    d.year,
    d.month,
    p.category,
    SUM(s.total_price) as total_sales,
    COUNT(DISTINCT s.customer_key) as unique_customers
FROM 
    sales_fact s
    JOIN date_dim d ON s.date_key = d.date_key
    JOIN product_dim p ON s.product_key = p.product_key
GROUP BY 
    d.year, d.month, p.category
ORDER BY 
    d.year, d.month, total_sales DESC;
  1. 客户细分分析:
SELECT 
    c.customer_segment,
    COUNT(DISTINCT s.customer_key) as customer_count,
    SUM(s.total_price) as total_sales,
    AVG(s.total_price) as avg_order_value
FROM 
    sales_fact s
    JOIN customer_dim c ON s.customer_key = c.customer_key
    JOIN date_dim d ON s.date_key = d.date_key
WHERE 
    d.year = 2023
GROUP BY 
    c.customer_segment
ORDER BY 
    total_sales DESC;
  1. 热门作者分析:
SELECT 
    p.author,
    COUNT(DISTINCT s.sale_key) as number_of_sales,
    SUM(s.quantity) as total_books_sold,
    SUM(s.total_price) as total_revenue
FROM 
    sales_fact s
    JOIN product_dim p ON s.product_key = p.product_key
    JOIN date_dim d ON s.date_key = d.date_key
WHERE 
    d.year = 2023
GROUP BY 
    p.author
ORDER BY 
    total_revenue DESC
LIMIT 10;

这些查询展示了如何利用事实表和维度表的组合来回答各种业务问题。通过调整维度和度量,我们可以灵活地进行各种分析。

7. 结论

事实表和维度表是数据仓库设计的核心概念,它们共同构成了强大而灵活的数据分析基础。通过本文的深入探讨,我们可以得出以下几点重要结论:

  1. 互补作用: 事实表和维度表并不是孤立存在的,而是相互补充、密切协作的。事实表记录了业务过程中的可量化事实,而维度表则为这些事实提供了丰富的上下文信息。这种结构使得我们能够进行多维度、多角度的数据分析。

  2. 灵活性与性能的平衡: 在设计事实表和维度表时,我们需要在分析的灵活性和查询性能之间寻找平衡。星型模式通常提供了很好的查询性能,而雪花模式则可以减少数据冗余。选择哪种模式应该基于具体的业务需求和技术环境。

  3. 粒度的重要性: 选择合适的粒度是设计事实表的关键。粒度太粗可能会限制分析的深度,而粒度太细则可能导致数据量过大,影响性能。理想的粒度应该能够支持大多数分析需求,同时保持可接受的性能水平。

  4. 维度建模的艺术: 设计好的维度表需要深入理解业务领域。包含丰富的属性、正确处理层次结构、实现适当的缓慢变化维度策略,这些都是维度建模的艺术所在。

  5. 持续优化的过程: 数据仓库的设计不是一蹴而就的。随着业务的发展和需求的变化,我们需要不断评估和优化我们的事实表和维度表设计。这可能包括添加新的维度、调整粒度、优化查询性能等。

  6. 支持决策制定: 最终,事实表和维度表的设计目标是支持更好的决策制定。通过提供全面、准确、易于分析的数据,数据仓库能够为企业提供宝贵的洞察,帮助管理者做出更明智的决策。

  7. 技术与业务的桥梁: 事实表和维度表的概念不仅是技术概念,更是连接技术和业务的桥梁。它们以一种业务用户能够理解的方式组织数据,使得技术团队和业务团队能够更好地协作。

  8. 未来的发展: 随着大数据技术的发展,事实表和维度表的概念也在不断演化。例如,在一些现代数据仓库解决方案中,我们看到了列式存储、实时数据处理等新技术的应用。但无论技术如何变化,理解业务、合理组织数据的核心理念始终不变。

总的来说,掌握事实表和维度表的概念及其设计原则,对于构建高效、灵活的数据仓库至关重要。它不仅是数据工程师的必备技能,也是数据分析师、业务分析师乃至管理者理解和利用数据的基础。在当今数据驱动的商业环境中,这些知识将帮助你更好地挖掘数据的价值,为企业创造竞争优势。
数据仓库.png

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

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

相关文章

Mysql语句性能优化

SQL查询过程 查询缓存&#xff1a; 执行查询语句的时候&#xff0c;会先查询缓存&#xff08;MySQL 8.0 版本后移除&#xff0c;因为这个功能不太实用&#xff09;。分析器&#xff1a; 没有命中缓存的话&#xff0c;SQL 语句就会经过分析器&#xff0c;分析器说白了就是要先看…

logistic方程求解和模拟

logistic规律可以用以下式子表示 N(t1)​k*N(t)*​(N-N(t)) 其中N(t)为t时刻种群的数量&#xff0c;N为环境最大容纳的的种群数 k的取值通常与N有关&#xff0c;大约在1/N和4/N之间 题目如下 假设一些参数后的代码如下 T100; T11:T; N11000; a13/N1; Q800; N2700; a2-0.2/…

洛谷 P10119 『STA - R4』踱步

题目来源于&#xff1a;洛谷 题目本质&#xff1a;动态规划及优化&#xff0c;单调队列 题目思路&#xff1a; 设 fi,k,op​ 表示对于前 i 个位置&#xff0c;强制在 i1 分钟初踱步&#xff0c;总共踱步 k 次&#xff0c;且第 i 分钟在屋内&#xff08;op0&#xff09;或屋外…

leetcode73. 矩阵置零,简单模拟

leetcode73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示…

Stable Diffusion之提示词指南(二)

在上一篇的文章中&#xff0c;我们讲解了Stable Diffusion提示词的基本用法&#xff0c;不了解的到可以去学习一下———Stable Diffusion之提示词指南(一)。这章我们再详细讲解一下其他高级用法和负提示词。 注意&#xff1a;部分语法只是适用于AUTOMATIC1111 Web UI(以下简称…

SpringBoot集成kafka-指定topic(主题)-partition(分区)-offset(偏移量)消费信息

SpringBoot集成kafka-指定topic-partition-offset消费信息 1、消费者2、生产者3、配置类4、配置文件5、实体类6、工具类7、测试类8、第一次测试&#xff08;读取到19条信息&#xff09;9、第二次测试&#xff08;读取到3条信息&#xff09; 1、消费者 指定消费者读取配置文件中…

[pytorch] --- pytorch环境配置

本教程环境搭建基于windows 1 安装miniconda 1.1 miniconda与anaconda的区别 包含的包: Anaconda: 是一个较大的发行版&#xff0c;预装了大量的科学计算和数据分析相关的 Python 包。Miniconda: 更轻量级&#xff0c;只包含 Conda、Python 和它们的依赖&#xff0c;以及少…

微信小程序获取用户openId并通过服务端向用户发送模板消息

1.引言 注意&#xff1a; 1.标题中的服务端是自己研发的服务端&#xff0c;不是腾讯公司的服务端。 2.小程序的模板消息分为一次性订阅消息与长期订阅&#xff0c;一次性订阅就是每次在给用户发送消息之前都需要获得用户的同意&#xff08;即用户订阅&#xff09;&#xff0…

数据结构(树、平衡树、红黑树)

目录 树 树的遍历方式 平衡二叉树 旋转机制 左旋 右旋 旋转实例 左左 左右 右右 右左 总结 红黑树 树 相关概念 节点的内部结构如下 二叉树与二叉搜索树的定义 树的遍历方式 前序遍历&#xff1a;当前节点&#xff0c;左子节点&#xff0c;右子结点 中序遍历&a…

React学习day01-React-开发环境配置、JSX基础-本质、JSX中js表达式的用法、JSX的条件渲染

1、React &#xff08;1&#xff09;概念&#xff1a;由Meta公司研发&#xff0c;是一个用于构建Web和原生交互页面的库 &#xff08;2&#xff09;优点&#xff1a; 1&#xff09;相较于传统基于DOM开发的优势&#xff1a;组件化的开发方式、不错的性能 2&#xff09;相较于…

软件设计原则之单一职责原则

目录 单一职责原则单一职责原则的主要特点应用范围Demo用户信息日志记录 单一职责原则 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;简称SRP&#xff09;是面向对象设计中的一个重要原则&#xff0c;其核心思想是&#xff1a;一个类应该仅有一个引起…

ollma 本地部署大模型

因为我本地是 windows 的系统&#xff0c;所以这里直接写的是通过 docker 来实现本地大模型的部署。 windows 下 WSl 的安装这里就不做重复&#xff0c;详见 windows 部署 mindspore GPU 开发环境&#xff08;WSL&#xff09; 一、Docker 部署 ollma 1. 拉取镜像&#xff08;…

Ubuntu系统设置Java项目开机自启

1、创建自启动脚 sudo vi /etc/systemd/system/java-service.service 2、编辑自启脚本 [Unit]部分包含了service的描述和依赖关系。在这个示例中&#xff0c;我们将其设置为在系统启动后执行。 [Service]部分定义了service的执行方式。在这个示例中&#xff0c;我们指定了Java…

shell工具箱集合!!

shell工具箱集合 1.shell工具箱集合 2.Chrony 时间同步 3.Get_host_Info 设备信息收集 4.Init_host 系统初始化 5.Iperf 带宽测试套件 6.Lagscope_test 时延测试套件 7.Mtr_test 双向路由探测套件 下载地址&#xff1a; https://pan.quark.cn/s/6936cc13bc04

学习笔记——Redis基础

文章目录 Redis五种常用数据类型Redis常用命令Spring Data Redis使用方式操作步骤 Redis五种常用数据类型 Redis存储的是key-values结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有五种常用的数据类型&#xff1a; 字符串&#xff08;string&#xff09;&…

C++入门基础知识32——【关于C++ 存储类之auto存储类】

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

Flex的基本使用+综合案例

组成 弹性盒子没有设置高&#xff0c;就会自动拉伸 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&q…

高并发下阻塞队列的选择

高并发下阻塞队列的选择 一、队列 队列&#xff1a;queue。简称队&#xff0c;它和堆栈一样&#xff0c;也是一种运算受限的线性表&#xff0c;其限制是仅允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。 简单的说&#xff0c;采用该结构的集合&#xff0c;对元素…

洛谷 P2569 [SCOI2010] 股票交易

题目来源于&#xff1a;洛谷 题目本质&#xff1a;动态规划&#xff0c;单调队列 解题思路&#xff1a; 方程f[i][j]表示第 i 天结束后&#xff0c;手里剩下 j 股的最大利润&#xff0c;则不买不卖&#xff1a;f[i][j]f[i-1][j]。 买入&#xff1a;f[i][j]max{f[i-w-1][k]k*…

Spring DI 数据类型——构造注入

首先新建项目&#xff0c;可参考 初识 IDEA 、模拟三层--控制层、业务层和数据访问层 一、spring 环境搭建 &#xff08;一&#xff09;pom.xml 导相关坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.…