Post

Slowly Change Dimension trong Data Warehouse - Phần 2/2

Slowly Change Dimension trong Data Warehouse - Phần 2/2

Giới thiệu

Ở bài viết trước (Slowly Change Dimension trong Data Warehouse - Phần 1/2) đã nói về các cách tổ chức SCD khác nhau. Trong thực tế sẽ có các trường hợp không sử dụng đơn lẻ từng loại mà là kết hợp nhiều loại với nhau. Ở bài viết này mình sẽ giới thiệu một số cách kết hợp của các cách đã giới thiệu ở phần 1

Loại 5: 1 + 4

Loại 5 đưa ra cách giải quyết rằng, các dữ liệu trong bảng Dimension vẫn sẽ được dùng để lưu các giá trị mới nhất, nhưng các giá trị lịch sử sẽ được lưu trong một bảng Dimension khác

Như vậy, với việc Store Name 1 đổi tên thành Store Name 4, theo như loại 4 sẽ có 2 bảng được update như sau:

Bảng Mini Store Dimension sẽ được thêm vào một dòng mới

IDStore NameAttribute 1Attrbute N
1Store Name 1
2Store Name 4

Sau khi có ID của các dữ liệu vừa được thêm vào, cập nhật lại ID ở cột Current Mini Store Dimension ID của bảng Store Dimension

IDStore CodeAddressCurrent Mini Store Dimension ID
1StoreCode1Address 12

Cứ như vậy, mỗi khi dữ liệu cửa hàng được thay đổi, thì bảng Mini Store Dimension sẽ thêm dòng mới (loại 4), sau đó cập nhật lại ID vào cột Current Mini Store Dimension ID của bảng Store Dimension (loại 1)

SCD type 5.png

Loại 6: 1+2+3

Với loại 6 này, mỗi khi có một thay đổi dữ liệu bảng Dimension thì sẽ có 2 thao tác được thực hiện

  • Tạo một dòng dữ liệu mới trong bảng Dimension và đánh dấu dòng đó là dữ liệu mới nhất
  • Tạo thêm thuộc tính để chứa giá trị hiện tại và câp nhật các giá trị cũ trong bảng Dimension thành giá trị hiện tại

Để đổi tên Store Name 1 thành Store Name 4 thì cấu trúc bảng Dimension sẽ như sau

Bảng Store Dimension ban đầu:

IDStore NameStore CodeAddress
1Store Name 1StoreCode1Address 1
2Store Name 2StoreCode2Address 2
3Store Name 3StoreCode3Address 3

Bảng Store Dimension sau khi đổi tên Store Name 1 thành Store Name 4 có dữ liệu được cập nhật

IDStore NameCurrent Store NameStore CodeAddressRow Effective DateRow Expiration DateIs Current
1Store Name 1Store Name 4StoreCode1Address 12020-01-012023-04-30False
2
3Store Name 4Store Name 4StoreCode1Address 12023-05-019999-12-31True

Sau một thời gian, nếu Store Name 4 muốn đổi tên thành Store Name 10 chẳng hạn, thì bảng Store Dimension sẽ là:

IDStore NameCurrent Store NameStore CodeAddressRow Effective DateRow Expiration DateIs Current
1Store Name 1Store Name 10StoreCode1Address 12020-01-012023-04-30False
2
3Store Name 4Store Name 10StoreCode2Address 12023-05-012024-05-31False
4Store Name 10Store Name 10StoreCode3Address 12024-06-019999-12-31True

Như vậy với cách kết hợp này, ta đã

  • Insert một dòng mới vào bảng Dimension để xác định dữ liệu mới nhất (SCD loại 2)
  • Thêm một cột mới để xác định giá trị hiện tại (SCD loại 3)
  • Update lại toàn bộ giá trị cũ bằng giá trị mới nếu có thay đổi thêm lần nữa (SCD loại 1)

Kỹ thuật này giúp cho việc ghi nhận dữ liệu hiện tại và dữ liệu lịch sử trở nên rất rõ ràng nhưng cách thiết kế lại khá phức tạp

Loại 7: 1 + 2

SCD loại 7 có ý tưởng thiết kế rằng khi một dữ liệu được thay đổi, dữ liệu lịch sử và hiện tại sẽ lưu lại ở 2 bảng Dimension riêng biệt:

  • Thêm dữ liệu mới vào bảng History Store Dimension, đánh dấu rằng dòng dữ liệu là mới nhất. Bảng này sẽ khởi tạo một ID mới là khóa chính, cộng thêm một Durable Supernatural Key
  • Cập nhật dữ liệu mới nhất vào bảng Current Store Dimension. Bảng này sẽ lưu Durable Supernatural Key làm khóa chính và chỉ lưu giá trị hiện tại. Hoặc cách khác có thể thay thế bằng việc tạo một View (xem khái niệm View, Materialized View trong database) chứa dữ liệu có đánh dấu Is Current = True trong bảng History Store Dimension
  • Bảng fact sẽ tham chiếu đến cả 2 bảng History Store DimensionCurrent Store Dimension, và lưu trữ cả khóa chính của 2 bảng

Kết quả SCD loại 7 sẽ như hình dưới đây

SCD type 7.png

Việc tách ra thành 2 bảng sẽ làm cho bảng Current Store Dimension sẽ có ít dòng hơn nhiều so với bảng History Store Dimension. Như vậy cách này sẽ thích hợp với nhu cầu thường xuyên báo cáo với các giá trị hiện tại hơn là các giá trị lịch sử

Tổng kết

Dưới đây là bảng tóm tắt về SCD các loại

Loại SCDKỹ thuật áp dụng
Loại 1Ghi dè lên giá trị cũ mỗi khi có giá trị mới cần được cập nhật
Loại 2Thêm một dòng dữ liệu mới vào và đánh dấu dữ liệu này là mới nhất
Loại 3Tạo thêm một cột mới bên trong bảng Dimension để lưu lại giá trị cũ trước khi cập nhật
Loại 4Tạo một bảng phụ Mini-Dimension để lưu các thuộc tính thường xuyên thay đổi
Loại 5Như Loại 4 nhưng có thêm bước cập nhật giá trị mới nhất vào bảng Dimension chính (loại 1)
Loại 6Thêm một dòng mới để lưu giá trị mới nhất (loại 2), thêm cột mới để ghi nhận giá trị hiện tại (loại 3), cập nhật cột mới bằng giá trị mới trên toàn bộ dữ liệu cũ có liên quan (loại 1)
Loại 7Tạo một bảng Current Dimension để lưu lại giá trị mới nhất, song song với bảng History Dmension để lưu các giá trị mới nhất + giá trị lịch sử

Theo kinh nghiệm thì khi mới bắt đầu thiết kế SCD thì sẽ bắt đầu bằng SCD loại 2 vì nó không quá khó setup, và lưu được lịch sử. Sau đó sẽ tùy từng nhu cầu mà chọn cách thiết kế SCD khác. Việc chọn lựa bất kỳ một loại SCD sẽ có sự đánh đổi giữa các yếu tố sau đây:

  • Dễ thiết kế
  • Câu query đơn giản
  • Performance tốt
  • Lưu được các dữ liệu lịch sử

Được cái này thì sẽ mất cái kia.

Hy vọng bài viết có ích với mọi người.

This post is licensed under CC BY 4.0 by the author.