2008-08-23 24 views
24

Một số chiến lược mà mọi người đã thành công với việc duy trì lịch sử thay đổi cho dữ liệu trong một cơ sở dữ liệu khá phức tạp là gì. Một trong những ứng dụng mà tôi thường xuyên sử dụng và phát triển có thể thực sự được hưởng lợi từ một cách toàn diện hơn để theo dõi các hồ sơ đã thay đổi như thế nào theo thời gian. Ví dụ, ngay bây giờ các bản ghi có thể có một số dấu thời gian và các trường người dùng đã sửa đổi, nhưng chúng tôi hiện không có lược đồ ghi nhật ký nhiều thay đổi, ví dụ nếu một thao tác được khôi phục. Trong một thế giới hoàn hảo, nó sẽ có thể để tái tạo lại các bản ghi như nó đã được sau mỗi tiết kiệm vvChiến lược hiệu quả để thoát khỏi lịch sử kiểm tra/thay đổi lịch sử cho các ứng dụng DB?

Một số thông tin về các DB:

  • Nhu cầu có khả năng phát triển bởi hàng ngàn hồ sơ cho mỗi tuần
  • 50-60 bàn
  • chính revisioned bảng có thể có nhiều triệu bản mỗi
  • lượng hợp lý các phím nước ngoài và chỉ số thiết
  • Sử dụng PostgreSQL 8.x
+0

Cân nhắc sử dụng [cơ sở dữ liệu thời gian] (http://en.wikipedia.org/wiki/Temporal_database "mục nhập Wikipedia"). –

Trả lời

9

Trong quá khứ, tôi đã sử dụng trình kích hoạt để tạo bản ghi nhật ký db/chèn/xóa.

Bạn có thể chèn bản ghi mỗi khi thực hiện một trong các hành động trên trên bảng cụ thể vào bảng ghi nhật ký theo dõi hành động, người dùng db đã làm gì, dấu thời gian, bảng được định dạng trước và giá trị trước đó .

Có lẽ có một câu trả lời tốt hơn mặc dù vì điều này sẽ yêu cầu bạn lưu vào bộ nhớ cache giá trị trước khi xóa hoặc cập nhật thực tế được định dạng trước tôi nghĩ. Nhưng bạn có thể sử dụng điều này để làm rollbacks.

+8

Vấn đề với giải pháp cấp cơ sở dữ liệu là không có ngữ cảnh kinh doanh cho hành động, tức là bạn không biết người dùng đã làm gì hoặc họ đang làm gì. Hầu hết các ứng dụng web kết nối với cơ sở dữ liệu của chúng bằng cách sử dụng một tên người dùng duy nhất, do đó tên người dùng web đã đăng nhập không phải là tên người dùng được kích hoạt bởi trình kích hoạt. –

+8

Andrew, bất kỳ giải pháp cấp cơ sở dữ liệu không phải là đường mòn kiểm toán ở tất cả vì nó sẽ không bắt các bản ghi không được thêm vào trong GUI. Của chúng tôi bắt người dùng cụ thể bởi vì tất cả các bảng của chúng tôi có một cột last_updated và chèn, cập nhật, vv tất cả gửi person_id của người thực hiện cập nhật không phải là tên người dùng web. – HLGEM

22

Một chiến lược bạn có thể sử dụng là MVCC, Kiểm soát đồng thời nhiều giá trị. Trong lược đồ này, bạn không bao giờ cập nhật bất kỳ bảng nào của bạn, bạn chỉ cần chèn, duy trì số phiên bản cho mỗi bản ghi. Điều này có lợi thế là cung cấp một bản chụp chính xác từ bất kỳ thời điểm nào, và nó cũng hoàn toàn tránh được các vấn đề về khóa cập nhật gây ra nhiều cơ sở dữ liệu.

Nhưng nó làm cho một cơ sở dữ liệu khổng lồ và chọn tất cả yêu cầu một mệnh đề bổ sung để chọn phiên bản hiện tại của bản ghi.

+2

Làm cách nào để bạn biết phiên bản nào là phiên bản hiện tại? Với một đơn hàng đầu tiên theo mệnh đề desc? @Eric Z Beard –

+0

@ismailyavuz có tùy chọn này, tôi đoán: thêm một cột boolean bổ sung, 'is_current'. Và giữ cho nó nhất quán bằng cách sử dụng các trigger - và có thể là một ràng buộc duy nhất cho '(natural_id, is_current = 1)'. –

+0

@ismailyavuz cũng thấy điều này: https://stackoverflow.com/a/1051494/1475331 (sử dụng trường 'từ' và' đến'). Mệnh đề "where" chọn phiên bản hiện tại của hàng sẽ là 'WHERE" thành "IS NULL'. –

10

Nếu bạn đang sử dụng Hibernate, hãy xem JBoss Envers. Từ trang chủ của dự án:

Dự án Envers nhằm cho phép dễ dàng phiên bản các lớp JPA liên tục. Tất cả những gì bạn phải làm là chú thích lớp liên tục của bạn hoặc một số thuộc tính của nó, mà bạn muốn phiên bản, với @Versioned. Đối với mỗi thực thể được phiên bản, một bảng sẽ được tạo, sẽ chứa lịch sử các thay đổi được thực hiện cho thực thể. Sau đó, bạn có thể truy xuất và truy vấn dữ liệu lịch sử mà không cần nỗ lực nhiều.

Điều này có phần tương tự như Eric's approach, nhưng có lẽ ít nỗ lực hơn nhiều. Tuy nhiên, không biết, bạn sử dụng ngôn ngữ/công nghệ nào để truy cập cơ sở dữ liệu.

+0

Có ai đã sử dụng JBoss Envers trong một trang giao dịch cao eCom không? – boyd4715

4

Vấn đề duy nhất với việc sử dụng Trình kích hoạt là nó thêm vào chi phí hoạt động của bất kỳ chèn/cập nhật/xóa nào. Để có khả năng mở rộng và hiệu suất cao hơn, bạn muốn giữ giao dịch cơ sở dữ liệu ở mức tối thiểu. Kiểm tra qua trình kích hoạt tăng thời gian cần thiết để thực hiện giao dịch và tùy thuộc vào khối lượng có thể gây ra các vấn đề về hiệu suất.

một cách khác là khám phá xem cơ sở dữ liệu có cung cấp cách khai thác các nhật ký "Làm lại" như trường hợp trong Oracle hay không. Làm lại các bản ghi là những gì cơ sở dữ liệu sử dụng để tạo lại dữ liệu trong trường hợp nó không thành công và phải phục hồi.

3

Tương tự như trình kích hoạt (hoặc thậm chí với) bạn có thể có mọi giao dịch kích hoạt sự kiện ghi nhật ký một cách không đồng bộ và có một quy trình khác (hoặc chỉ là chuỗi) thực sự xử lý việc ghi nhật ký. Sẽ có nhiều cách để thực hiện điều này tùy thuộc vào ứng dụng của bạn. Tôi khuyên bạn nên ứng dụng kích hoạt sự kiện để không gây tải không cần thiết cho giao dịch đầu tiên của bạn (đôi khi dẫn đến khóa từ các nhật ký kiểm tra xếp tầng).

Ngoài ra, bạn có thể cải thiện hiệu suất cho cơ sở dữ liệu chính bằng cách giữ cơ sở dữ liệu kiểm tra ở một vị trí riêng biệt.

1

tôi sử dụng SQL Server, PostgreSQL không, vì vậy tôi không chắc chắn nếu điều này sẽ làm việc cho bạn hay không, nhưng Pop Rivett đã có một bài viết tuyệt vời về việc tạo ra một đường mòn kiểm toán ở đây: Pop rivett's SQL Server FAQ No.5: Pop on the Audit Trail

Xây dựng một kiểm toán , sau đó tạo trình kích hoạt cho mỗi bảng bạn muốn kiểm tra.

Gợi ý: sử dụng Codesmith để tạo trình kích hoạt của bạn.

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