Sử dụng một "chỉ chèn" cơ sở dữ liệu, như mô tả của Shiraz bhaji, nhưng bạn có thể sử dụng một kỹ thuật đơn giản hơn. Đối với mỗi bảng mà bạn cần duy trì dữ liệu kiểm toán, chỉ cần có cột bổ sung cho Cập nhật thời gian, mặc định cho đến bây giờ. Khi bạn thực hiện thay đổi đối với bản ghi, thay vì cập nhật, chỉ cần thực hiện chèn bằng tất cả dữ liệu của bạn; cột Cập nhật thời gian sẽ nhận được thời gian hiện tại.
Lưu ý rằng phương pháp này có nghĩa là bạn phải phá vỡ hoặc xem xét lại các ràng buộc UNIQUE của bạn; bạn có thể giữ một khóa chính, nhưng tính duy nhất trở thành một hỗn hợp của khóa chính của bạn và UpdateTime của bạn.
Kỹ thuật này có lợi thế là cung cấp cho bạn phạm vi dữ liệu lịch sử đã biết cho mỗi bản ghi trên bảng (mỗi bản ghi có giá trị trong một thời gian nhất định nếu nó là TOP 1 của bản ghi WHERE TimeOfInterest> Cập nhật ORDER BY Cập nhật DESC) với chi phí thấp (chỉ một cột duy nhất trên bàn). Nó cũng khá thích hợp để chuyển đổi từ các bảng không sử dụng phương thức này, với một ALTER TABLE đơn giản để thêm một cột đơn (mà bạn có thể đặt tên một cách nhất quán). Sau đó, bạn chỉ cần thay đổi các ràng buộc UNIQUE của bạn để sử dụng một tổng hợp các ràng buộc hiện tại của chúng và cột Cập nhật thời gian, và một số truy vấn sẽ cần phải được thay đổi.
Lưu ý rằng bạn thực sự có thể tránh chuyển đổi tất cả các truy vấn của mình nếu bạn tạo chế độ xem bảng đơn giản trả về mục nhập gần đây nhất cho mỗi bản ghi; bạn kết thúc bằng một bảng duy trì dữ liệu lịch sử một cách rõ ràng và một chế độ xem giống như một bảng thông thường mà không có sự thay đổi.
Nguồn
2009-08-24 21:08:22
không phải đây chỉ là một sự lãng phí lớn không gian? – Kolten
Nếu bạn cần dữ liệu, bạn cần làm gì nếu bạn cần một đường mòn kiểm toán, nó không bị lãng phí. – nos
Tôi sẽ không đi với các cột thời gian ngày cho bất kỳ dữ liệu ID/Tìm kiếm hoặc bất kỳ dữ liệu chuỗi nào. Ngày hệ thống có thể thay đổi vì bất kỳ lý do hoặc nhiều hoạt động xảy ra trong cùng một độ phân giải thời gian của một giá trị ngày/giờ duy nhất đều có thể. Nếu bạn cần nắm bắt chuỗi thời gian sử dụng dấu thời gian (được bảo đảm duy nhất) hoặc sử dụng số nguyên dài hoặc sử dụng guids vì quá trình xây dựng chuỗi của bạn (nhưng bạn mất thời gian làm mục thông tin - cũng đọc câu trả lời bên dưới ...) –