以下是一份基于 Couchbase 的数仓建模方案,结合你的业务需求(订单、支付、退款业务)以及报表需求(营收报表、优惠报表、支付方式报表),为 ODS、DWD、DWS、ADS 层提供了存储方式、库名、表名的标准化设计。
1. Couchbase 数仓建模原则
-
Scopes 对应库(Schemas):
- 一个 Scope 代表一个逻辑数据库,主要根据层级划分:ODS、DWD、DWS、ADS。
- Scope 名称采用
数仓层级:业务域
格式(如ods:order
、dws:payment
)。
-
Collections 对应表(Tables):
- 每个 Collection 对应一张表,表名建议标准化为
业务域:主题
。 - 采用 JSON 文档存储数据,每个文档代表一条记录,支持嵌套字段。
- 每个 Collection 对应一张表,表名建议标准化为
-
分区策略:
- 按业务域(如订单、支付、退款)或时间分区(如按日期、月份)。
- 分区键建议选用访问频率高且查询条件常用的字段(如
order_id
、payment_id
、date
)。
-
索引策略:
- 每个 Collection 至少有一个主键索引(
PRIMARY INDEX
)。 - 根据查询需求添加二级索引,例如时间字段索引(
date
)、业务主键索引(order_id
、payment_id
)。
- 每个 Collection 至少有一个主键索引(
2. 数仓层级设计
ODS 层(原始数据层)
- 特点:存储从源系统直接采集的原始数据,贴近业务系统,按业务域划分。
- Scope 名称:
ods:业务域
- Collections(表名)标准化:
- 命名格式:
业务域:数据来源
- 数据尽量按照业务记录,字段多保持原样。
- 命名格式:
Scope | Collection 名称 | 说明 | 分区键 | 示例字段 |
---|---|---|---|---|
ods:order | order:raw | 订单业务原始数据 | order_id | order_id , customer_id |
ods:payment | payment:raw | 支付业务原始数据 | payment_id | payment_id , order_id |
ods:refund | refund:raw | 退款业务原始数据 | refund_id | refund_id , payment_id |
DWD 层(明细数据层)
- 特点:对 ODS 数据进行清洗和规范化,打平嵌套结构,按主题存储明细数据。
- Scope 名称:
dwd:业务域
- Collections(表名)标准化:
- 命名格式:
业务域:主题
- 数据以明细记录为主,具备较高查询效率。
- 命名格式:
Scope | Collection 名称 | 说明 | 分区键 | 示例字段 |
---|---|---|---|---|
dwd:order | order:detail | 清洗后的订单明细 | order_id | order_id , customer_id |
dwd:payment | payment:detail | 清洗后的支付明细 | payment_id | payment_id , payment_type |
dwd:refund | refund:detail | 清洗后的退款明细 | refund_id | refund_id , refund_reason |
DWS 层(汇总数据层)
- 特点:基于 DWD 数据进行轻量汇总,支持多维分析,通常按照主题域划分。
- Scope 名称:
dws:业务域
- Collections(表名)标准化:
- 命名格式:
主题域:汇总维度
- 数据按维度聚合存储,支持 OLAP 查询。
- 命名格式:
Scope | Collection 名称 | 说明 | 分区键 | 示例字段 |
---|---|---|---|---|
dws:order | order:daily_summary | 每日订单汇总 | date | date , total_orders , total_sales |
dws:payment | payment:method_summary | 每种支付方式的每日汇总 | date | date , payment_type , total_amt |
dws:refund | refund:reason_summary | 每种退款原因的每日汇总 | date | date , refund_reason , refund_amt |
ADS 层(应用数据层)
- 特点:为具体的报表和分析需求提供高性能的数据支持。数据通常是面向特定报表需求设计的,便于前端直接查询。
- Scope 名称:
ads:报表主题
- Collections(表名)标准化:
- 命名格式:
报表主题:具体报表
- 数据是高度聚合后的结果表。
- 命名格式:
Scope | Collection 名称 | 说明 | 分区键 | 示例字段 |
---|---|---|---|---|
ads:revenue | revenue:report | 营收报表 | date | date , total_revenue , discount |
ads:discount | discount:report | 优惠报表 | date | date , total_discount , count |
ads:payment | payment:report | 支付方式分布报表 | date | date , payment_type , total_amt |
3. 建模示例:营收报表
假设需要生成营收报表,查询条件包括 今日、昨日、本周、本月、上月、自定义日期范围,具体建模和数据流设计如下:
-
ODS 层:
- 收集订单业务、支付业务的原始数据。
- Scope:
ods:order
- Collection:
order:raw
-
DWD 层:
- 从 ODS 数据中提取订单明细和支付明细。
- Scope:
dwd:order
- Collection:
order:detail
,payment:detail
-
DWS 层:
- 按天汇总订单金额和支付方式金额。
- Scope:
dws:order
- Collection:
order:daily_summary
-
ADS 层:
- 生成营收报表,包括总营收、优惠金额、支付方式分布等。
- Scope:
ads:revenue
- Collection:
revenue:report
4. 标准化命名规则总结
-
Scopes(库):
- 格式:
数仓层级:业务域
或数仓层级:报表主题
。 - 示例:
ods:order
、dws:payment
、ads:revenue
。
- 格式:
-
Collections(表):
- 格式:
业务域:主题
或报表主题:具体报表
。 - 示例:
order:detail
、revenue:report
。
- 格式:
5. 索引策略
-
Primary Index:
- 每个 Collection 都需要创建主键索引。
-
Secondary Index:
- 按查询需求创建,如:
CREATE INDEX idx_date ON dws:order:daily_summary(date);
CREATE INDEX idx_payment_type ON dwd:payment:detail(payment_type);
- 按查询需求创建,如:
这套方案实现了 分层存储、命名规范化 和 高效查询支持,既适配你的 Couchbase 数据仓库,也能满足复杂的对账报表需求。