2009-06-26 8 views

Trả lời

19

Sử dụng "Chèn chỉ cơ sở dữ liệu"

Ý tưởng cơ bản là bạn không bao giờ cập nhật hoặc xóa dữ liệu.

Mỗi bảng có 2 cột datetime từđến.

Họ bắt đầu với giá trị null trong mỗi (đầu đến lúc chấm dứt thời gian)

Khi bạn cần phải "thay đổi" hàng bạn thêm một hàng mới, đồng thời bạn cập nhật để trong hàng trước tới Hiện tại và từ trong hàng bạn đang thêm vào Hiện hành.

Bạn đọc dữ liệu ra khỏi bảng thông qua chế độ xem có vị trí để = null trong đó.

Phương pháp này cũng cung cấp cho bạn hình ảnh trạng thái cơ sở dữ liệu của bạn tại bất kỳ thời điểm nào.

EDIT

Chỉ cần làm rõ để đáp ứng với những nhận xét: Trình tự sẽ được đưa ra bởi các khóa chính của bảng, đó sẽ là một số autoincrement.

+2

không phải đây chỉ là một sự lãng phí lớn không gian? – Kolten

+15

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

+4

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 ...) –

10

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.

4

Cách tiếp cận hoàn toàn khác là chỉ có nhật ký kiểm tra. Sau đó, bạn sử dụng tính năng này để tạo phiên bản dữ liệu mới nhất. Bạn tạo "checkpoints" định kỳ hoặc sử dụng bộ nhớ đệm để tăng tốc độ này.

Có bản trình bày về ai đó sử dụng kỹ thuật này: http://www.infoq.com/presentations/greg-young-unshackle-qcon08. Lợi thế lớn ở đây là vì bạn chỉ có nhật ký kiểm tra, bạn sẽ khá tự tin rằng đường mòn kiểm toán của bạn là chính xác.

Tôi chưa bao giờ thử điều này và có vẻ khá phức tạp ... nhưng có điều cần suy nghĩ.

15

[Cuối bài nhưng nó bổ sung thêm hai kỹ thuật chưa được đề cập ở đây]

Đọc nhật ký giao dịch - nếu cơ sở dữ liệu của bạn đang ở chế độ hồi phục hoàn toàn sau đó cửa hàng nhật ký giao dịch rất nhiều thông tin hữu ích mà có thể được sử dụng để xem lịch sử của mỗi hàng. Nhược điểm là điều này không được hỗ trợ theo mặc định. Bạn có thể thử sử dụng các chức năng không có giấy tờ DBCC LOG hoặc công cụ của bên fn_dblog hoặc thứ ba như ApexSQL Log

Sử dụng Change Data Capture - Change data capture về cơ bản làm điều tương tự như trình bày ở trên nhưng nó hợp lý hơn và một chút dễ dàng hơn để sử dụng. Thật không may, điều này chỉ có sẵn trong phiên bản doanh nghiệp.

Cả hai cách này đều có thể giải quyết vấn đề cho phép cập nhật và xóa vì bạn không thể thay đổi nội dung được ghi trong nhật ký giao dịch.