Bảng lịch sử cơ sở dữ liệu / Bảng theo dõi


13

Hiện tại tôi muốn cấu trúc bảng theo dõi / lịch sử như thế này:

  • Khóa chính - ID
  • OtherTableId - fk
  • fieldName - tên của trường theo dõi
  • OldValue
  • Giá trị mới
  • Tên tài khoản
  • Tạo thời gian

Vì vậy, về cơ bản tôi muốn có một bảng sẽ theo dõi lịch sử bảng khác, lưu trữ tên cột của trường đã thay đổi với giá trị mới và cũ. Câu hỏi của tôi là bất cứ ai có thể chọc lỗ trong này? Ngoài ra, cách dễ nhất để đảm bảo rằng chỉ một tên cột từ các bảng theo dõi của nó được nhập vào cột fieldName là gì? Hiện tại các tùy chọn của tôi là có một enum trong dịch vụ tôi đang xây dựng hoặc tạo một bảng trạng thái khác và biến trườngName thành một fk. Còn ý tưởng nào hay hơn không?

Chỉnh sửa mục tiêu: Hiện tại chỉ có 2 lĩnh vực mà chúng tôi quan tâm để theo dõi. Một trường sẽ được hiển thị trên một trang web để hiển thị lịch sử, trường khác sẽ chỉ được truy cập bởi một bộ phận và họ có quyền truy cập vào chế độ xem cơ sở dữ liệu mà họ có thể truy vấn. Họ sẽ truy vấn chỉ một trường này để biết thông tin về người đã thay đổi trường và làm gì. Đây là lý do chúng tôi muốn đặt nó ở nơi trường cơ sở dữ liệu xác định cột bảng thay vì có một bản sao chính xác của lịch sử bản ghi bảng. Chúng tôi chỉ muốn hai trường được theo dõi với khả năng thêm hoặc xóa các trường trong tương lai.

Cảm ơn!


Bạn có biết trước bạn sẽ theo dõi bao nhiêu bảng không?
Kofi Sarfo

Bảng này sẽ chỉ theo dõi một bảng khác, cho đến nay chúng tôi chỉ theo dõi một bảng này.
dùng76982

Vì vậy, cách tiếp cận này có thể là quá mức cần thiết. Thậm chí tệ hơn là sẽ không dễ dàng truy vấn bảng này với bảng được theo dõi cùng nhau để tạo lại dữ liệu trực tiếp tại một thời điểm, nên tạo lại một ảnh chụp nhanh có giá trị bất kỳ.
Kofi Sarfo

1
Mặt trái của truy vấn để xem cột nào thay đổi thường xuyên nhất sẽ dễ dàng hơn bằng cách sử dụng phương pháp bạn đã đề xuất.
Kofi Sarfo

Bạn có thể muốn tìm kiếm trên dba.stackexchange.com ; câu hỏi tương tự đã được hỏi ở đó và một số có thể có câu trả lời bạn có thể sử dụng.
Thất vọngWithFormsDesigner

Câu trả lời:


8

Chọc lỗ: nếu lược đồ cơ sở dữ liệu bị thay đổi tại cùng một thời điểm sau đó và tên cột thay đổi hoặc cột bị xóa hoàn toàn thì sao? Rất nhiều hệ thống cơ sở dữ liệu cho phép điều này. Điều gì sẽ xảy ra với "tên trường" của bạn sau đó?

Đối với tính toàn vẹn dữ liệu: bạn phải đảm bảo rằng mọi thao tác cập nhật hoặc xóa sẽ chắc chắn cập nhật bảng theo dõi của bạn. Điều đó được thực hiện tốt nhất bằng cách kích hoạt gọi một thủ tục được lưu trữ. Bạn nên đảm bảo chỉ những quy trình được lưu trữ mới có quyền truy cập bằng văn bản vào bảng theo dõi của bạn, để không ai khác có thể viết các giá trị sai.

Nếu bạn có thể sống với một giải pháp cụ thể của nhà cung cấp db: hầu hết các hệ thống db đều có các bảng hệ thống trong đó thông tin lược đồ (tên bảng, id bảng, tên cột, v.v.) được lưu trữ. Bạn có thể kiểm tra xem có thể đặt tham chiếu khóa ngoài vào bảng hệ thống như vậy không. Điều đó sẽ cho phép thay thế tên trường bằng ID trường nếu cơ sở dữ liệu hỗ trợ một cái gì đó như thế này.

Trên thực tế, nếu bạn cần theo dõi toàn bộ các hàng của bảng cụ thể bao gồm tất cả các cột (và không chỉ là một tập hợp con nhỏ của các cột), bạn nên xem xét đề xuất của @ sarfeast. Đọc bài viết này về những hạn chế của mô hình cặp tên-giá trị.


8

Việc triển khai kiểm toán thay đổi (theo dõi lịch sử) thành công nhất mà tôi thấy là ít chung chung và đơn giản hơn nhiều. Nó liên quan đến việc tạo bảng nhật ký thay đổi cho mỗi bảng bạn muốn theo dõi, giữ tên cột và loại dữ liệu giống hệt nhau (với một cột bổ sung cho dấu thời gian).

Mục tiêu cuối cùng, đó là, những gì bạn muốn làm với dữ liệu được kiểm toán sẽ giúp đánh giá mức độ phù hợp của từng phương pháp.


Xin chào Sarfeast, tôi đã thêm mục tiêu cuối cùng mà tôi muốn đạt được. Xin lỗi vì không bao gồm điều này để bắt đầu.
dùng76982

Cách tiếp cận này có nhược điểm của nó. Đọc tại đây: cơ sở dữ liệu
trình.blogspot.co.uk / 2008/07 / history

7

Tóm lại: Bạn cần đặt cơ chế Audit Trail cho các bảng mà bạn muốn theo dõi thay đổi giá trị.

Bảng theo dõi kiểm toán duy nhất :

Tạo một bảng để ghi lại tên bảng, tên trường abd phiên bản cũ và mới của dữ liệu. Đối với phương pháp này, thông thường ghi nhật ký cả phiên bản cũ và mới của dữ liệu và chỉ những trường đã thay đổi. Để thực hiện điều này trong các kích hoạt, yêu cầu là phải có khóa chính trên bảng hoặc chỉ các hàng đơn được cập nhật.

Đây là một bài viết hay với các kịch bản về cách đạt được nó - Tạo Trails Trails

Các tài liệu tham khảo hữu ích khác để xem:


Liên kết thứ hai là xấu bây giờ.
Jeremy Harris

@cillosis, Cảm ơn bạn đã nhận thấy điều này. Nó được cập nhật ngay bây giờ :)
Yusubov

3

Bạn có thể muốn xem tài liệu dự án NHibernate Envers để biết ý tưởng.

Về cơ bản, bạn có một bảng sửa đổi, nơi bạn có thể thêm dữ liệu bổ sung như dấu thời gian hoặc người dùng. Sau đó, mỗi bảng bạn theo dõi sẽ có một bảng kiểm toán bổ sung với tất cả các cột được nhân đôi, một fk cho bảng sửa đổi và loại sửa đổi (thêm, sửa đổi, xóa). AFAIK, bạn sẽ không muốn các bảng kiểm toán của mình có FK thực sự với bảng thực vì điều đó sẽ ngăn việc xóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.