KassieZ commented on code in PR #1670: URL: https://github.com/apache/doris-website/pull/1670#discussion_r1899373959
########## i18n/zh-CN/docusaurus-plugin-content-docs/current/table-design/data-model/unique.md: ########## @@ -25,103 +25,123 @@ under the License. --> -当用户有数据更新需求时,可以选择使用主键数据模型(Unique)。主键模型能够保证 Key(主键)的唯一性,当用户更新一条数据时,新写入的数据会覆盖具有相同 key(主键)的旧数据。 +在需要有数据更新时,可以选择使用主键模型(Unique Key Model)。主键模型可以保证 Key 列的唯一性,当用户插入或更新数据时,新写入的数据会覆盖具有相同 Key 列的旧数据,从而保持最新的数据记录。与其他数据模型相比,主键模型适用于数据的更新场景,可以在插入过程中进行主键级别的更新覆盖。 -**主键模型提供了两种实现方式:** +主键模型有以下特点: -- 写时合并 (merge-on-write)。在 1.2 版本中,我们引入了写时合并实现,该实现会在数据写入阶段完成所有数据去重的工作,因此能够提供非常好的查询性能。自 2.1 版本起,写时合并经过两个大版本的打磨,已经非常成熟稳定,由于其优秀的查询性能,写时合并成为 Unique 模型的默认实现。 +* 基于主键完成 UPSERT :在插入数据时,主键重复的数据会更新,主键不存在的记录会插入; -- 读时合并 (merge-on-read)。在读时合并实现中,用户在进行数据写入时不会触发任何数据去重相关的操作,所有数据去重的操作都在查询或者 compaction 时进行。因此,读时合并的写入性能较好,查询性能较差,同时内存消耗也较高。 +* 基于主键进行去重:主键模型中的 Key 列具有唯一性,会对根据主键列对数据进行去重操作; -**数据更新的语义** +* 可以进行高频数据更新:支持高频数据更新场景,同时平衡数据更新性能与查询性能。 -- Unique 模型默认的更新语义为**整行`UPSERT`**,即 UPDATE OR INSERT,该行数据的 key 如果存在,则进行更新,如果不存在,则进行新数据插入。在整行`UPSERT`语义下,即使用户使用 insert into 指定部分列进行写入,Doris 也会在 Planner 中将未提供的列使用 NULL 值或者默认值进行填充。 +# 使用场景 -- 部分列更新。如果用户希望更新部分字段,需要使用写时合并实现,并通过特定的参数来开启部分列更新的支持。请查阅文档[部分列更新](../../data-operate/update/update-of-unique-model)。 +* 高频数据更新:上游 OLTP 数据库维度表高频的进行谁更新,通过主键表可以实时同步上游更新记录,完成高效的 UPSERT 操作; -下面以一个典型的用户基础信息表,来看看如何建立读时合并和写时合并的主键模型表。这个表数据没有聚合需求,只需保证主键唯一性。(这里的主键为 user_id + username)。 +* 数据高效去重:如广告投放营销、客户关系管理系统中,需要针对用户做去重操作,使用主键模型,可以保证基于用户 ID 做高效去重操作; -| ColumnName | Type | IsKey | Comment | -| ------------- | ------------ | ----- | ------------ | -| user_id | BIGINT | Yes | 用户 id | -| username | VARCHAR(50) | Yes | 用户昵称 | -| city | VARCHAR(20) | No | 用户所在城市 | -| age | SMALLINT | No | 用户年龄 | -| sex | TINYINT | No | 用户性别 | -| phone | LARGEINT | No | 用户电话 | -| address | VARCHAR(500) | No | 用户住址 | -| register_time | DATETIME | No | 用户注册时间 | +* 需要部分记录更新:在部分业务场景中,只需要对某几列进行更新,如画像标签场景需要变更频繁改动的动态标签,消费订单场景需要改变交易的状态。通过主键模型部分列更新能力可以完成某几列的变更操作。 +# 实现方式 Review Comment: 一级标题渲染不出,从 ##二级开始 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org