Xin chào mọi người, ở bài viết trước mình đã chia sẻ về ETL testing và trong quá trình test ETL mình có nhắc đến việc chúng ta sẽ đi kiểm tra, theo dõi cách ghi/thay đổi dữ liệu trong bảng đích đã đúng yêu cầu hay chưa? Vậy cách ghi/thay đổi dữ liệu đó là gì nhỉ? Hôm nay chúng ta sẽ đi tìm hiểu về Slowly Changing Dimension (SCD) nhé!
1. Slowly Changing Dimension (SCD) là gì?
SCD (Slowly Changing Dimension) có thể hiểu một cách đơn giản nhất đó là: so sánh dữ liệu nguồn với dữ liệu bảng đích hiện có bằng cách sử dụng Khóa nghiệp vụ – Business key (Khóa duy nhất – Unique Key).
Nếu không có bản ghi nào khớp thì sẽ coi là Bản ghi mới hoặc Nếu bản ghi khớp thì sẽ so sánh các thuộc tính với các thuộc tính đã thay đổi nếu dữ liệu có vẻ được cập nhật thì nó cập nhật bản ghi hoặc nếu không thì nó để nguyên như không thay đổi.
Slowly Changing Dimension sẽ kiểm tra các thuộc tính cho ba trường hợp: Bản ghi mới, đã thay đổi hoặc chưa thay đổi.
2. Tại sao cần Slowly Changing Dimension?
Trong thế giới Datawarehouse, đôi khi việc theo dõi sự thay đổi kích thước theo thời gian là rất quan trọng. Điều này giúp chúng ta theo dõi dữ liệu tốt hơn và cũng tạo ra các sản phẩm hiệu quả tùy thuộc vào các trường hợp sử dụng.
3. Tại sao lại gọi là Slowly Changing Dimension?
Slowly Chaning Dimension – gọi như trên có nghĩa là chúng ta sẽ phải sử dụng thành phần này chỉ cho các bảng không được cập nhật thường xuyên.
Lưu ý: Không áp dụng cho bảng thường xuyên thay đổi, chỉ áp dụng trên các bảng kích thước (Dimension table) thay đổi chậm.
4. Các loại SCD – Ví dụ về Slowly Changing Dimensions trong data warehouse (High-Level)
Các loại SCD (High-Level)
Sau đây là các loại SCD, mỗi loại đều có một số ưu điểm và nhược điểm riêng.
- Type – 0 Giữ lại dữ liệu gốc
- Type – 1 Ghi đè lên dữ liệu hiện có
- Type – 2 Thêm các bản ghi mới trên cùng một bảng
- Type – 3 Thêm cột mới trên cùng một bảng
- Type – 4 Sử dụng bảng lịch sử
- Type – 6 Phương pháp kết hợp (Loại 1 + Loại 2 + Loại 3)
SCD type 1 (Ghi đè)
Loại hành động SCD đầu tiên có thể thực hiện được là ghi đè. Ở đây, các giá trị kích thước được ghi đè bởi các giá trị mới.
Ví dụ: Khách hàng Nguyễn Văn A chuyển từ HCM đến Hà Nội, thì thành phố của anh ấy sẽ được cập nhật với giá trị mới nhất, tức là Hà Nội
Original Record – Dữ liệu gốc
Cust_ID | Name | City |
---|---|---|
1001 | Nguyễn Văn A | HCM |
1002 | Nguyễn Văn B | Nam Định |
Updated Record – Dữ liệu được thay đổi
Cust_ID | Name | City |
---|---|---|
1001 | Nguyễn Văn A | Hà Nội |
1002 | Nguyễn Văn B | Nam Định |
Trong ví dụ trên, khách hàng đã di chuyển từ nơi này sang nơi khác và địa chỉ gần đây đã được ghi đè lên các bản ghi hiện có.
Nhược điểm: chúng ta không thể truy xuất thông tin địa chỉ trước đây của anh ấy từ tình huống này.
SCD type 2
- Thêm bản ghi mới
- Chúng ta có thể nắm bắt thay đổi thuộc tính bằng cách thêm một cột mới làm khóa thay thế (VD: IsActive)
Khi giá trị của bản ghi hiện tại thay đổi, bản ghi hiện tại được đánh dấu là không hoạt động (inactive – 0) và bản ghi mới được insert vào.
Kết quả, sẽ có 2 bản ghi được liên kết với Nguyễn Văn A trong bảng được cập nhật, nhưng chỉ có phiên bản mới nhất được đánh dấu là hoạt động (active – 1).
Original Record – Dữ liệu gốc
Cust_ID | Name | City | IsActive |
---|---|---|---|
1001 | Nguyễn Văn A | HCM | 1 |
1002 | Nguyễn Văn B | Nam Định | 1 |
Updated Record – Dữ liệu được thay đổi
Cust_ID | Name | City | IsActive |
---|---|---|---|
1001 | Nguyễn Văn A | HCM | 0 |
1001 | Nguyễn Văn A | Hà Nội | 1 |
1002 | Nguyễn Văn B | Nam Định | 1 |
Ưu điểm: thỏa mãn điểm trừ trước đó theo dõi dữ liệu lịch sử bằng cách tạo mục nhập mới trên cùng một bảng.
Nhược điểm: mặc dù nó nắm bắt dữ liệu lịch sử, nhưng nó có thể dẫn đến hoạt động tốn kém ở phía cơ sở dữ liệu.
SCD Type 3 (Thêm cột giá trị trước đó)
Loại SCD phổ biến thứ ba là thêm một cột giá trị trước đó. Ở đây, các phiên bản trước và hiện tại được duy trì trong một hàng.
Hạn chế của phương pháp này là nó sẽ chỉ có hiện tại/trước đó chứ không phải toàn bộ lịch sử
Original Record – Dữ liệu gốc
Cust_ID | Name | City |
---|---|---|
1001 | Nguyễn Văn A | HCM |
1002 | Nguyễn Văn B | Nam Định |
Updated Record – Dữ liệu được thay đổi
Cust_ID | Name | Current City | Previous City |
---|---|---|---|
1001 | Nguyễn Văn A | Hà Nội | HCM |
1002 | Nguyễn Văn B | Nam Định |
SCD Type 4: Thêm bảng mới (Bảng lịch sử)
- Sử dụng bảng Lịch sử
- Trong cách tiếp cận này, bảng lịch sử riêng biệt được tạo ra để theo dõi các thay đổi.
- Bảng chính sẽ chỉ có dữ liệu mới nhất
- Ưu điểm: Phản hồi nhanh hơn đối với các truy vấn yêu cầu dữ liệu mới nhất. Dễ quản lý và viết mã, thuận lợi cho các thuộc tính có tính biến động cao hoặc được sử dụng thường xuyên ở kích thước rất lớn.
- Nhược điểm: Đôi khi tổng hợp/tham gia giữa dữ liệu hoạt động và lịch sử có thể mất thời gian và trở nên phức tạp
Customer Table
Cust_ID | Name | City |
---|---|---|
1001 | Nguyễn Văn A | Hà Nội |
1002 | Nguyễn Văn B | Nam Định |
Customer History Table
Cust_ID | Name | City | Last_updated_date |
---|---|---|---|
1001 | Nguyễn Văn A | HCM | 11-03-2023 |
1001 | Nguyễn Văn A | Hà Nam | 11-05-2023 |
1001 | Nguyễn Văn A | Bắc Ninh | 11-06-2023 |
SCD Type 6
Phương pháp kết hợp (Loại 1 + Loại 2 + Loại 3)
- Ưu điểm: Mọi bản chụp thay đổi dữ liệu đều có trong cùng một bảng
- Nhược điểm: Phức tạp, khó quản lý, bảng lớn.
Cust_ID | Name | City | EffectiveFrom | EffectiveTo | IsActive |
---|---|---|---|---|---|
1001 | Nguyễn Văn A | HCM | 11-03-2023 | 11-05-2023 | 0 |
1001 | Nguyễn Văn A | Hà Nam | 11-05-2023 | 11-06-2023 | 0 |
1001 | Nguyễn Văn A | Bắc Ninh | 11-06-2023 | 03-07-2023 | 0 |
1001 | Nguyễn Văn A | Hà Nội | 03-07-2023 | 1 | |
1002 | Nguyễn Văn B | Nam Định | 22-02-2023 | 1 |
Ở ví dụ trên, dữ liệu lịch sử được theo dõi trong hàng mới được xác định bởi các trường ngày bắt đầu và ngày kết thúc. Ngoài ra, chúng ta có thể có trường cờ isActive để xác định bản ghi hiện tại từ danh sách. Chúng ta có thể duy trì lịch sử của tất cả các thay đổi đồng thời cập nhật giá trị hiện tại trên các bản ghi hiện có.
Trên đây là những kiến thức về SCD (Slowly Changing Dimension), Các loại SCD và kịch bản kiểm thử, bài viết cũng khá dài rồi, nếu có cơ hội, bài viết tới mình sẽ chia sẻ chi tiết hơn về SCD type 2. Mong rằng bài viết này sẽ giúp ích được cho mọi người trong quá trình tìm hiểu về SCD. Nếu mọi người có thắc mắc hay câu hỏi gì đừng ngần ngại comment và cùng nhau giải đáp nhé!
Hẹn gặp lại mọi người trong bài viết tiếp theo.
Tài liệu tham khảo:
https://www.learnmsbitutorials.net/slowly-changing-dimensions-ssis.php
6 comments
Cảm ơn ad <3
<3 <3 <3
hi
Với loại 6 mình thấy nó chỉ là sự kết hợp của loại 2 + 3. Bởi ví dụ bây giờ khách hàng 1001 lại thay đổi trường dữ liệu City với giá trị là HCM thì đâu có ghi đè lại record đầu tiên được, nếu thế sẽ xử lý sao với 2 cột effective from và to ?
Admin có thể giải thích rõ chỗ này giúp mình ?
Trường hợp SCD6 sẽ phải thêm cột Pre_City do tính chất SCD3, thì khi đó cột Cur_City sẽ ghi đè giá trị HCM lên trên các giá trị cũ do tính chất SCD1
Dạ mình cảm ơn nhiều nhé