2012-07-02 33 views
5

Chiến lược chung trong thiết kế DB để duy trì lịch sử sửa đổi là gì? Nếu nó chỉ là một cái bàn mà tôi đang xử lý, tôi nghĩ nó sẽ không quá khó. Chỉ cần lưu từng bản cập nhật dưới dạng bản ghi mới trong bảng. Kỷ lục cuối cùng sẽ luôn là bản sửa đổi mới nhất.Thiết kế cơ sở dữ liệu: cách theo dõi lịch sử?

Nhưng khi dữ liệu được lưu trữ trên nhiều bảng, cách tốt nhất để thiết kế để có thể theo dõi các bản sửa đổi là gì?

Trả lời

2

Tôi muốn có thêm bảng lịch sử cho mỗi bảng được phiên bản. Cấu trúc giống như bảng chính với các trường bổ sung time_fromtime_to. Làm đầy bằng các trình kích hoạt trong suốt. time_to bản sửa đổi mới nhất được đặt cho tương lai xa.

Nhà nước cho thời điểm quy định có thể được lấy ra với truy vấn như thế này:

SELECT * FROM user_history 
WHERE time_from >= '2012-02-01' AND time_to <= '2012-02-01' 

Đối với tôi, lưu trữ lịch sử trong bảng chính không phải là nói chung là một ý tưởng tốt, vì nó đòi hỏi những điều kiện phức tạp khi lấy hoặc tham gia dữ liệu hiện tại .

+0

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

+0

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

0

Bật MySQL binary logging và chỉ sử dụng.

+0

Tôi nghĩ câu hỏi này là về lịch sử có thể truy vấn. – MaxSem

0

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_dtend_dt, cho biết tuổi thọ của đối tượng;
  • start_dtNOT 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ư:

  1. 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ế;
  2. Tôi phải duy trì ít bảng hơn;
  3. 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;
  4. 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.

0

Phần cứng không phải là phiên bản của bảng "cơ sở" - bạn chỉ cần phiên bản riêng lẻ như bạn sẽ làm một bảng riêng lẻ.

Phần cứng đang theo dõi kết nối giữa chúng.

Làm thế nào chính xác là bạn sẽ làm điều đó phụ thuộc vào các yêu cầu của dự án cụ thể. Dưới đây là ví dụ về cách sales orders could be "historized", nhưng có nhiều biến thể khác có thể.

0

Datadiff. Theo dõi sửa đổi DB được hỗ trợ API.

Họ và tiết lộ:

tôi đã xây dựng Datadiff. Tôi cần một giải pháp cung cấp lịch sử trực quan của một mô hình dữ liệu trong MongoDB để được trợ giúp hỗ trợ một sản phẩm SASS. Nó cũng sẽ làm việc với cơ sở dữ liệu SQL.

Bạn có thể sử dụng truy vấn cơ bản với ký hiệu key:val. tức là id:123

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