2014-06-20 14 views
5

Trong SQL Server 2008+, chúng tôi muốn bật theo dõi các thay đổi lịch sử cho bảng "Khách hàng" trong cơ sở dữ liệu hoạt động.bảng kiểm tra so với Loại 2 Từ từ thay đổi Kích thước

Đó là một bảng mới và ứng dụng của chúng tôi kiểm soát tất cả các văn bản để cơ sở dữ liệu, vì vậy chúng tôi không cần hack ác như kích hoạt. Thay vào đó, chúng ta sẽ xây dựng theo dõi thay đổi vào lớp đối tượng nghiệp vụ của mình, nhưng chúng ta cần tìm ra lược đồ cơ sở dữ liệu thích hợp để sử dụng.

Số hàng sẽ dưới 100.000 và số thay đổi trên mỗi bản ghi sẽ trung bình 1,5 mỗi năm.

Có ít nhất hai cách chúng tôi đã nhìn vào mô hình này:

  1. Là một bảng Type 2 Slowly Changing Dimension gọi CustomersHistory, với các cột cho EffectiveStartDate, EffectiveEndDate (thiết lập để NULL cho phiên bản hiện tại của khách hàng) và các cột kiểm tra như ChangeReasonChangedByUsername. Sau đó, chúng tôi sẽ xây dựng chế độ xem Customers trên bảng đó được lọc thành EffectiveEndDate=NULL. Hầu hết các phần của ứng dụng của chúng tôi sẽ truy vấn bằng cách sử dụng chế độ xem đó và chỉ những phần cần biết lịch sử mới có thể truy vấn bảng bên dưới. Để thực hiện, chúng tôi có thể thực hiện chế độ xem và/hoặc thêm chỉ mục được lọc vào EffectiveEndDate = NULL.

  2. Với bảng kiểm tra riêng biệt. Mọi thay đổi đối với bản ghi Customer ghi một lần vào bảng Customer và một lần nữa đến bảng kiểm tra CustomerHistory.

Từ đánh giá nhanh về câu hỏi StackOverflow, # 2 dường như phổ biến hơn nhiều. Nhưng điều này là bởi vì hầu hết các ứng dụng DB phải đối phó với các nhà văn di sản và lừa đảo?

Giả sử chúng ta bắt đầu từ một phương tiện chặn trống, ưu và khuyết điểm của một trong hai cách tiếp cận là gì? Bạn sẽ giới thiệu cái nào?

+0

Đây là cơ sở dữ liệu OLTP không phải là kho dữ liệu riêng biệt, nhưng bảng được đề cập không thay đổi thường xuyên. –

+1

Tôi tưởng tượng rằng một hoạt động phổ biến trong ứng dụng sẽ hiển thị danh sách các giao dịch của khách hàng nhất định. SCD 2 sẽ thực hiện thêm một gia nhập cần thiết mỗi lần - 'CustomersCurrentView WHERE Customer = 'John Doe' THAM GIA Khách hàngHistory JOIN Transactions'. Đề nghị của tôi là - nếu dữ liệu lịch sử không được sử dụng thường xuyên, hãy giữ trong một bộ bảng kiểm toán riêng biệt; xem xét SCD 2 chỉ khi các thành phần nhận thức lịch sử cấu thành một phần quan trọng của ứng dụng. 1 cho một câu hỏi rất thú vị! –

Trả lời

2

Nói chung, vấn đề với SCD Type-II là, nếu số lượng thay đổi trung bình trong các giá trị của thuộc tính là rất cao, bạn kết thúc có một bảng kích thước rất chất béo. Bảng thứ nguyên đang gia tăng này được kết hợp với một bảng thực tế rất lớn làm chậm hiệu suất truy vấn dần dần. Nó giống như ngộ độc chậm .. Ban đầu bạn không thấy tác động. Khi bạn nhận ra nó, đã quá muộn!

Bây giờ tôi hiểu rằng bạn sẽ tạo một chế độ xem vật chất riêng biệt với EffectiveEndDate = NULL và điều đó sẽ được sử dụng trong hầu hết các lần tham gia của bạn. Ngoài ra cho bạn, khối lượng dữ liệu tương đối thấp (100.000). Với những thay đổi trung bình chỉ 1,5 mỗi năm, tôi không nghĩ rằng khối lượng dữ liệu/hiệu suất truy vấn, vv sẽ là vấn đề của bạn trong tương lai gần.

Nói cách khác, bảng của bạn thực sự là từ từ thứ nguyên thay đổi (trái ngược với rapidly changing dimension - nơi tùy chọn # 2 của bạn phù hợp hơn). Trong trường hợp của bạn, tôi sẽ thích tùy chọn # 1.

Các vấn đề liên quan