Tôi đang sử dụng phương pháp tiếp cận, trong đó mỗi đối tượng mà tôi đang xử lý có ít nhất 1 bảng gọi là dụ, nơi tôi giữ dữ liệu có xu hướng thay đổi theo thời gian. Thông thường các bảng như vậy theo khái niệm sau:
- chúng có
_HISTORY
hậu tố trong tên;
- họ có 2 trường bổ sung,
start_dt
và end_dt
, cho biết tuổi thọ của đối tượng;
start_dt
là NOT NULL
, end_dt
có thể là NULL
, cho biết trường hợp đó là hiện tại và không bị giới hạn trong thời gian đó;
- nó có thể chèn những thay đổi trong tương lai ngày, nói rằng bạn muốn có một tên công ty mới để được kích hoạt từ
1/Jan-2013
, sau đó bạn cần phải thiết lập end_dt
của instance hiện tại để 31/Dec-2012 23:59:59
và chèn một kỷ lục mới với start_dt
của 1/Jan-2013 00:00:00
;
- đôi khi tôi cũng thêm trường
revision
, nếu cần theo dõi các bản sửa đổi.
Để có một ràng buộc RI phù hợp với thiết kế như vậy, tôi luôn có 2 bảng cho phiên bản bị lỗi. Này, cho Customer
obejct tôi có các thiết lập sau đây của bảng:
customer (customer_id INTEGER, PRIMARY KEY (customer_id));
customer_history (customer_id INTEGER, start_dt TIMESTAMP, end_dt TIMESTAMP,
name VARCHAR(50), sex CHAR(1), ...,
PRIMARY KEY (customer_id, start_dt));
customer_bank_history (customer_id INTEGER, start_dt TIMESTAMP, end_dt TIMESTAMP,
bank_id INTEGER, iban VARCHAR(34));
Trong tất cả những nơi khác mà tôi sử dụng để xây dựng customer(customer_id)
phím nước ngoài.Truy vấn thông tin chi tiết khách hàng thực tế rất đơn giản:
SELECT c.customer_id, ch.name, ch.sex
FROM customer c
JOIN customer_history ch ON c.customer_id = ch.customer_id
AND now() BETWEEN ch.start_dt AND coalesce(end_dt, now());
Tại sao tôi thích thiết kế như:
- Tôi đã là phiên bản thể hiện đối tượng vào mức độ cơ sở dữ liệu theo thiết kế;
- Tôi phải duy trì ít bảng hơn;
- Không thể mất lịch sử trong trường hợp ai đó bỏ/vô hiệu hóa bất kỳ trình kích hoạt nào;
- Tôi có thể lập kế hoạch và duy trì các thay đổi trong tương lai dễ dàng.
Hy vọng điều này sẽ giúp bạn.
Vì vậy, các bảng chính có dữ liệu gần đây nhất. Sau đó, các bảng "lịch sử" có bản sao của mỗi bản sửa đổi? Điều này có phá vỡ bình thường không? – StackOverflowNewbie
Có, các sự bất thường hóa, đó là giá cho sự đơn giản (các trạng thái lịch sử được tạo tự động từ 'INSERT',' DELETE', 'UPDATE' đơn giản trên bảng chính) và hiệu suất của phiên bản mới nhất (ví dụ bảng chính có chỉ mục dựa trên dữ liệu trong khi lịch sử có chỉ mục ngày). Nếu sửa đổi mới nhất không phải là sửa đổi chính để làm việc với, phương pháp này có thể bị bình thường hóa bị hỏng. – vearutop