Thứ Hai, 11 tháng 10, 2010

Lưu trữ dữ liệu trong data warehouse

Giả sử bạn đã có một DW database được thiết kế theo nguyên tắc hình sao (star schema). Cơ sở dữ liệu này (target) được cập nhật định kỳ hàng ngày từ các cơ sở dữ liệu nguồn (source). Giả sử bạn có một dimesion Person như sau:

DW_ID Business_ID First_Name Last_Name
1001 10001 Hoang Le
1002 10002 Lan Nguyen

Nguyên tắc cập nhật thường thấy của một DW là chỉ những record đã thay đổi từ source database mới được đưa sang target database, tức là DW database. Một record được coi là "thay đổi" khi thỏa mãn 1 trong 3 điều kiện sau:
1. Record hoàn toàn mới (insert).
2. Một số columns thay đổi giá trị (update).
3. Record bị xóa (delete).

Hai trường hợp hay gặp nhất là insert và update. Việc xử lý deleted record thường khó hơn hoặc thậm chí đôi khi không thể làm được hoặc là người ta đơn giản bỏ qua. Giả sử sau một ngày làm việc, source database có những records sau:

Business_ID First_Name Last_Name
10001 Hoang Tran
10002 Lan Nguyen
10003 Vinh Ly

Như vậy, bản ghi 10001 có Last_Name đã thay đổi. Do đó nó sẽ được ETL process đưa sang target database. Bản ghi 10002 vẫn giữ nguyên giá trị do đó nó sẽ không được đưa sang data warehouse. Bản ghi 10003 thì mới keng, chắc chắn sẽ được đưa sang data warehouse.

Okay, bây giờ mới đến phần thú vị. Bản ghi 10003 do mới tinh nên có thể dễ dàng chèn nó vào dw như sau:

DW_ID Business_ID First_Name Last_Name
1001 10001 Hoang Le
1002 10002 Lan Nguyen
1003 10003 Vinh Ly

Vấn đề nằm ở bản ghi có Business_ID 10001. Có một số cách xử lý như sau:
1. Viết đè giá trị của bản ghi hiện thời trong dw. Tức là:

DW_ID Business_ID First_Name Last_Name

1001 10001 Hoang Tran
1002 10002 Lan Nguyen
1003 10003 Vinh Ly

Làm như Last_Name cũ biến mất hoàn toàn cả trong source database và dw. Người ta gọi là Slowly Changing Dimensions Type 1.

2. Tạo một record mới với giá trị mới.
DW_ID Business_ID First_Name Last_Name Record_Active
1001 10001 Hoang Le N
1002 10002 Lan Nguyen Y
1003 10003 Vinh Ly Y
1004 10001 Hoang Tran Y

Như vậy, một record mới với giá trị mới của cùng Business_ID 10001 được chèn vào dw. Record cũ được đánh dấu là non-active. Column mới Record_active được gọi là metadata column bởi vì nó không chứa bất cứ giá trị nào liên quan đến business. Nó được tạo ra với mục đích để miêu tả cấu trúc của dữ liệu. Thay vì một column như vậy, ta có thể tạo ra 2 column Active_start_date, Active_end_date để miêu tả rõ hơn nữa trong khoảng thời gian nào thì record được coi là active. Người ta gọi là Slowly Changing Dimensions Type 2.

3. Tạo một column để lưu giữ giá trị cũ.
DW_ID Business_ID First_Name Last_Name Prior_Last_Name
1001 10001 Hoang Tran Le
1002 10002 Lan Nguyen
1003 10003 Vinh Ly

Người ta gọi là Slowly Changing Dimensions Type 3.

Có thể thấy rằng cách làm thứ 2 và 3 lưu giữ được dữ liệu cũ. Do vậy mà người ta nói dw chứa dữ liệu có tính lịch sử. Điều này nhiều lúc rất quan trọng nếu như người ta muốn biết tại một thời điểm nào đó, dữ liệu "đã" chứa giá trị nào. Hiển nhiên là source database không thể làm được điều này bởi vì cùng một bản ghi đó, nhưng giá trị ban đầu của một số trường đã bị mất đi viễn vĩnh. Trong khi đó, dw lại có chứa những thông tin này. Thậm chí có khi bản ghi đã bị xóa đi trong source database, nhưng vẫn được giữ lại trong dw.
Với cách xây dựng như trên có thể thấy dữ liệu không bao giờ mất đi trong dw. Nói cách khác, dữ liệu chỉ có một đường đi vào. Đặc biệt nếu dùng Type 2, 3 thì dữ liệu không bao giờ thay đổi. Một đặc điểm nữa của dw là dữ liệu thường đến từ nhiều nguồn, nhưng một khi đã vào data warehouse nó bắt buộc phải được "chuẩn hóa" (conformed).
copy from: fotech.org tác giả Huy Nguyen

Không có nhận xét nào:

Đăng nhận xét