表结构

参考链接:数据模型 - Apache Doris

在Doris中,数据模型主要分为三种类型,分别是:

  1. Aggregate(聚合)模型

    • 这种模型适用于需要对数据进行预聚合的场景,例如报表类查询。在这种模型中,表中的列被分为Key列(维度列)和Value列(指标列)。Key列相同的行会根据指定的聚合方式聚合成一行,而Value列会按照设置的聚合函数(如SUM、REPLACE、MAX、MIN等)进行聚合。

    • 建表语句

     CREATE TABLE example_db.aggregate_table (
     `dt` DATE NOT NULL,
     `user_id` INT NOT NULL,
     `pv` BIGINT SUM DEFAULT 0
     ) ENGINE=OLAP
     DUPLICATE KEY(`dt`, `user_id`)
     PARTITION BY RANGE(`dt`) (
     PARTITION p2023 VALUES LESS THAN ('2024-01-01'),
     PARTITION p2024 VALUES LESS THAN ('2025-01-01')
     )
     DISTRIBUTED BY HASH(`dt`) BUCKETS 16
     PROPERTIES (
     "replication_num" = "1"
     );
    

    在这个例子中,dt 和 user_id 是Key列,pv 是Value列,并且使用了SUM聚合函数。表按照dt进行范围分区,并且通过dt进行哈希分桶。

    • 官网例子
      Aggregate 模型例子.png

  2. Unique(唯一)模型

    • 这种模型适用于需要唯一主键约束的场景,可以保证主键的唯一性。在这种模型中,每一行都由键列中的值组合唯一标识,确保给定的键值集不存在重复行。这种模型无法利用物化等预聚合带来的查询优势,但对于需要保证数据唯一性的场景非常适用。

    • 建表语句

     CREATE TABLE example_db.unique_table (
     `id` INT NOT NULL,
     `name` VARCHAR(64) NOT NULL,
     `create_time` DATETIME DEFAULT '1970-01-01 00:00:00'
     ) ENGINE=OLAP
     UNIQUE KEY(`id`)
     PARTITION BY RANGE(`create_time`) (
     PARTITION p2023 VALUES LESS THAN ('2024-01-01'),
     PARTITION p2024 VALUES LESS THAN ('2025-01-01')
     )
     DISTRIBUTED BY HASH(`id`) BUCKETS 16
     PROPERTIES (
     "replication_num" = "1"
     );
    

    在这个例子中,id 是唯一的主键,表按照create_time进行范围分区,并且通过id进行哈希分桶。

    • 官网例子
      Unique 模型例子.png

  3. Duplicate(重复)模型

    • 这种模型允许基于指定的键列存储重复行,适用于必须保留所有原始数据记录的场景。在这种模型中,只指定排序列,相同的Key行不会合并,适用于数据无需提前聚合的分析业务,如原始数据分析或仅追加新数据的日志或时序数据分析。

    • 建表语句

     CREATE TABLE example_db.duplicate_table (
     `user_id` INT NOT NULL,
     `event_time` DATETIME DEFAULT '1970-01-01 00:00:00',
     `event_type` VARCHAR(64) DEFAULT ''
     ) ENGINE=OLAP
     DUPLICATE KEY(`user_id`)
     PARTITION BY RANGE(`event_time`) (
     PARTITION p2023 VALUES LESS THAN ('2024-01-01'),
     PARTITION p2024 VALUES LESS THAN ('2025-01-01')
     )
     DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
     PROPERTIES (
     "replication_num" = "1"
     );
    

    在这个例子中,user_id 是排序列,表允许有重复行,按照event_time进行范围分区,并且通过user_id进行哈希分桶。

    • 官网例子
      Duplicate 模型例子-fqes.png

在 MySQL 中类似的表结构

Doris 的三种数据模型与 MySQL 中的数据类型有一定的相似性,但也有其特定的使用场景和优化。以下是 Doris 的数据模型与 MySQL 中相似类型的对比:

  1. Aggregate(聚合)模型

    • 类似于 MySQL 中的汇总表(Summary Table)或物化视图(Materialized View)。在 MySQL 中,物化视图可以用来存储查询结果,特别是那些包含聚合函数(如 SUM、MAX、MIN)的结果。Doris 的 Aggregate 模型也是为了存储预聚合的结果,以优化读性能,这与物化视图的目的相似。

  2. Unique(唯一)模型

    • 类似于 MySQL 中的具有唯一主键(PRIMARY KEY)或唯一索引(UNIQUE INDEX)的表。在 MySQL 中,唯一主键或唯一索引确保了表中不会有重复的行。Doris 的 Unique 模型也是为了保证数据的唯一性,不允许有重复的 Key 列组合。

  3. Duplicate(重复)模型

    • 类似于 MySQL 中的普通表,没有唯一主键或唯一索引约束。在 MySQL 中,如果没有设置主键或唯一索引,表可以包含重复行。Doris 的 Duplicate 模型也是这样,它允许数据中有重复的 Key 列组合,主要用于存储原始数据,不做任何聚合。

需要注意的是,虽然 Doris 的这些模型在概念上与 MySQL 中的某些特性相似,但它们在实现和优化上是为了适应 Doris 作为一个 MPP(大规模并行处理)数据库的特点,特别是在处理大规模数据和高并发查询时的性能。Doris 的设计更侧重于 OLAP(在线分析处理)场景,而 MySQL 通常用于 OLTP(在线事务处理)场景。

OLTP 和 OLAP

OLAP(在线分析处理)和OLTP(在线事务处理)是数据库应用领域的两个重要概念,它们代表了数据库系统的两种不同应用场景和优化方向:

OLTP(在线事务处理)

  • 定义:OLTP 是指数据库系统处理日常业务操作的能力,如转账、查询余额、下订单等。这些操作通常涉及对数据库的增删改查(CRUD)操作。

  • 特点

    • 高并发:需要支持大量用户同时进行事务处理。

    • 高可靠性和一致性:事务必须保持ACID属性(原子性、一致性、隔离性、持久性)。

    • 响应时间快:对单个事务的响应时间要求高,通常在几毫秒到几秒内。

    • 数据更新频繁:涉及大量的插入、更新和删除操作。

OLAP(在线分析处理)

  • 定义:OLAP 是指数据库系统处理复杂查询和报告的能力,如数据挖掘、趋势分析、财务报告等。这些操作通常涉及对大量数据的聚合和分析。

  • 特点

    • 数据量大:需要处理的数据量通常比OLTP大得多。

    • 查询复杂:查询通常涉及多个表的连接、复杂的聚合函数和多维分析。

    • 响应时间可接受较长:OLAP查询的响应时间可以较长,因为它们通常不涉及实时性要求。

    • 数据更新不频繁:OLAP系统的数据通常以批量方式更新,而不是频繁的单个事务。

OLAP和OLTP的关系

  • 互补性:OLTP 和 OLAP 通常在不同的系统中实现,以满足各自的性能要求。OLTP 系统优化了事务处理,而 OLAP 系统优化了数据分析。

  • 数据流动:OLTP 系统中的数据最终会流向 OLAP 系统,以便进行分析和报告。这通常通过数据仓库(Data Warehouse)实现,数据从 OLTP 系统抽取、转换后加载到 OLAP 系统中。

  • 技术差异:OLTP 数据库(如 MySQL、PostgreSQL)和 OLAP 数据库(如 Apache Doris、ClickHouse)在设计和技术上有很大差异,以适应不同的使用场景。

  • 融合趋势:随着技术的发展,一些数据库系统开始尝试融合 OLTP 和 OLAP 的特性,提供混合负载(Hybrid Transactional/Analytical Processing, HTAP)的能力,即在同一数据库上同时处理事务和分析查询。