Bỏ qua để đến nội dung

Cấu trúc dữ liệu (ClickHouse · lớp marts)

Sau khi Airbyte/dlt đưa dữ liệu thô từ Odoo vào ClickHouse và dbt làm sạch + mô hình hoá, ta có một kho phân tích gồm các bảng fact và dimension trong database marts. Trang này mô tả kiến trúc tổng thể; mỗi bảng có một trang chi tiết riêng.

Dữ liệu chảy một chiều qua ba lớp (mô hình medallion):

  • raw — ảnh chụp y hệt Odoo (bảng raw___*), do Airbyte/dlt nạp.
  • staging (stg_*) — làm sạch 1-1 với nguồn: ép kiểu, tách JSON, đổi tên. Materialize = view.
  • marts (fct_* / dim_*) — mô hình sao sẵn cho BI/AI. Materialize = table (MergeTree).
graph LR
  subgraph Dimensions
    P[dim_product<br/>Ngành → Nhóm → SP]
    G[dim_vn_geo<br/>Tỉnh → Miền]
    S[dim_salesman<br/>NV bán]
    C[dim_customer<br/>Nhóm KH]
  end
  F[(fct_sales<br/><b>FACT bán hàng</b>)]
  P --> F
  G --> F
  S --> F
  C --> F
  F --> CUBE{{Cube · sales}}

fct_sales là fact trung tâm; các fact khác (mua/tồn/nợ/kế hoạch) đứng song song trên cùng bộ chiều.

BảngGrain (một dòng =)Số dòngCube
fct_salesmột dòng đơn bán~12.600sales
fct_purchasemột dòng đơn mua (PO)~1.400purchases
fct_inventorytồn của một sản phẩm~70inventory
fct_receivablemột hoá đơn khách~920receivables
fct_plankế hoạch một tổ hợp × tháng~12.000(qua fct_plan_actual)
fct_plan_actualkế hoạch và thực tế một tổ hợp × tháng~12.000planning
BảngGrainSố dòngVai trò
dim_productmột sản phẩm37Ngành → Nhóm → SP
dim_vn_geomột tỉnh36Tỉnh → Miền
dim_salesmanmột nhân viên bán10NV bán → Team
dim_customermột khách hàng~1.790Khách → Nhóm KH
  • Tiền tệ: kiểu Float64 (VND). Số lượng: Decimal(38,9) hoặc Float64.
  • Khoá sắp xếp (ORDER BY của MergeTree) không được chứa cột Nullable → các cột khoá đều ép non-null ở staging (coalesce, assumeNotNull).
  • Đặt tên: fct_ = bảng sự kiện (fact), dim_ = bảng chiều, stg_ = staging.
  • Doanh thu mặc định là thuần (chưa thuế, price_subtotal); có cột riêng cho gồm thuế và thuế.
Chia sẻ: