Các vấn đề trong thiết kế bảng Dim

·

·

,

Bài viết sẽ trình bày về những khó khăn, góc nhìn, vấn đề thường gặp khi thiết kế bảng Dimension (bảng Dim) trong Data Warehouse, cùng với cách giải quyết, và áp dụng vào ví dụ cụ thể trong ngành bán lẻ.


1. Khó khăn trong thiết kế bảng Dimension

1.1 Xử lý Slowly Changing Dimension (SCD) không phù hợp
  • Khó khăn: Dữ liệu trong bảng Dim thay đổi theo thời gian (ví dụ: địa chỉ khách hàng, giá sản phẩm), nhưng chọn sai loại SCD (Type 1, 2, 3) có thể dẫn đến mất lịch sử hoặc dư thừa dữ liệu không cần thiết.
  • Ví dụ trong ngành bán lẻ: Bảng Dim_Customer cần theo dõi lịch sử thay đổi địa chỉ khách hàng, nhưng nếu dùng SCD Type 1 (ghi đè), lịch sử bị mất.
  • Cách giải quyết:
    • Xác định yêu cầu: Nếu cần lịch sử, dùng SCD Type 2 (thêm dòng mới với cột StartDate, EndDate).
    • Ví dụ giải pháp:
1.2 Quá nhiều thuộc tính trong một bảng Dim
  • Khó khăn: Bảng Dim chứa quá nhiều cột (high-cardinality attributes), làm tăng kích thước và giảm hiệu suất truy vấn.
  • Ví dụ trong ngành bán lẻ: Bảng Dim_Product chứa cả thông tin cơ bản (tên, danh mục) lẫn thông tin thay đổi nhanh (giá, khuyến mãi, đánh giá), dẫn đến bảng phình to.
  • Cách giải quyết:
    • Tách thành Mini-Dimension: Tách các thuộc tính thay đổi nhanh ra bảng riêng.
    • Ví dụ giải pháp:
      • Bảng Dim_Product: ProductSK, ProductCode, ProductName, Category.
      • Bảng Dim_Product_Details: ProductDetailSK, ProductSK, Price, Discount, Rating.
1.3 Hiệu suất truy vấn kém
  • Khó khăn: Bảng Dim lớn (hàng triệu dòng) không được tối ưu hóa, làm chậm các phép join với bảng Fact.
  • Ví dụ trong ngành bán lẻ: Bảng Dim_Customer với 5 triệu khách hàng, không có index, khiến truy vấn doanh thu theo khu vực bị chậm.
  • Cách giải quyết:
    • Indexing: Tạo index trên CustomerSK và các cột lọc phổ biến (như Region).
    • Partitioning: Chia bảng theo thuộc tính (ví dụ: theo khu vực địa lý).
1.4 Dữ liệu không đồng bộ từ nhiều nguồn
  • Khó khăn: Dữ liệu từ các nguồn khác nhau (POS, online, CRM) có định dạng hoặc giá trị khác nhau, gây khó khăn khi tích hợp.
  • Ví dụ trong ngành bán lẻ: Hệ thống POS ghi CustomerName là “John Doe”, nhưng CRM ghi là “Doe, John”.
  • Cách giải quyết:
    • ETL làm sạch: Chuẩn hóa dữ liệu trong quá trình Extract, Transform, Load.
    • Surrogate Key: Dùng khóa thay thế để định danh duy nhất, bỏ qua sự khác biệt của khóa tự nhiên.
    • Ví dụ giải pháp: Gán CustomerSK cho mỗi khách hàng, ánh xạ CustomerID từ các nguồn.
1.5 Thiết kế không linh hoạt cho Role-Playing Dimension
  • Khó khăn: Một bảng Dim cần đóng nhiều vai trò (ví dụ: ngày đặt hàng, ngày giao hàng), nhưng thiết kế không hỗ trợ tái sử dụng hiệu quả.
  • Ví dụ trong ngành bán lẻ: Bảng Dim_Date cần dùng cho OrderDateShipDate, nhưng tạo nhiều bảng Dim riêng gây dư thừa.
  • Cách giải quyết:
    • Sử dụng alias hoặc view: Tái sử dụng bảng Dim_Date với các tên khác nhau trong truy vấn.

2. Ví dụ cụ thể: Thiết kế bảng Dim trong ngành bán lẻ

Bối cảnh

Chuỗi bán lẻ xây dựng Data Warehouse để phân tích doanh thu, khách hàng, và sản phẩm. Các bảng Dim cần thiết bao gồm Dim_Customer, Dim_Product, và Dim_Date.

Bảng Dim: Dim_Customer
  • Mục đích: Lưu thông tin khách hàng (tên, địa chỉ, khu vực).
  • Cấu trúc (SCD Type 2):
CustomerSKCustomerIDCustomerNameAddressRegionStartDateEndDateIsCurrent
1C001John Doe123 Old StNorth2023-01-012024-06-300
2C001John Doe456 New StNorth2024-07-01NULL1
  • Khó khăn 1: SCD không phù hợp
    • Vấn đề: Ban đầu dùng SCD Type 1, mất lịch sử địa chỉ khách hàng.
    • Giải pháp: Chuyển sang SCD Type 2, thêm StartDate, EndDate, IsCurrent.
  • Khó khăn 2: Hiệu suất kém
    • Vấn đề: 10 triệu khách hàng, join với Fact_Sales chậm.
    • Giải pháp: Tạo index trên CustomerSKRegion.
Bảng Dim: Dim_Product
  • Mục đích: Lưu thông tin sản phẩm (tên, danh mục, giá).
  • Cấu trúc:
ProductSKProductCodeProductNameCategoryPrice
1P001Laptop XElectronics1000.00
2P002Mouse YAccessories20.00
  • Khó khăn 3: Quá nhiều thuộc tính
    • Vấn đề: Thêm Discount, Rating vào bảng làm bảng phình to và giá thay đổi thường xuyên.
    • Giải pháp: Tách thành Dim_Product_Details: ProductDetailSK ProductSK Price Discount Rating 1 1 1000.00 100.00 4.5
Bảng Dim: Dim_Date
  • Mục đích: Lưu thông tin thời gian (ngày, tháng, năm).
  • Cấu trúc:
DateIDDateMonthYearQuarter
2025012025-01-0112025Q1
2025022025-01-0212025Q1
  • Khó khăn 4: Role-Playing Dimension
    • Vấn đề: Cần dùng cho OrderDateShipDate trong Fact_Sales.
    • Giải pháp: Join bảng Dim_Date hai lần với alias khác nhau.

3. Tóm tắt cách giải quyết

Khó khănGiải phápVí dụ áp dụng
SCD không phù hợpChọn SCD Type phù hợp (Type 2 cho lịch sử)SCD Type 2 cho Dim_Customer
Quá nhiều thuộc tínhTách thành Mini-DimensionTách Dim_Product_Details
Hiệu suất kémIndexing, PartitioningIndex trên CustomerSK, Region
Dữ liệu không đồng bộETL làm sạch, Surrogate KeyChuẩn hóa CustomerName, dùng CustomerSK
Role-Playing không linh hoạtAlias/View tái sử dụngDùng Dim_Date cho OrderDate, ShipDate

Hy vọng phần giải thích và ví dụ trong ngành bán lẻ này giúp bạn hiểu rõ hơn về thiết kế bảng Dim