Các cách để cho phép phiên bản của các mục cơ sở dữ liệu (dữ liệu) là gì?
Hãy suy nghĩ về khả năng quản lý nội dung của hệ thống để hoàn nguyên các thay đổi của bài viết.
Ưu / nhược điểm của họ là gì?
Các cách để cho phép phiên bản của các mục cơ sở dữ liệu (dữ liệu) là gì?
Hãy suy nghĩ về khả năng quản lý nội dung của hệ thống để hoàn nguyên các thay đổi của bài viết.
Ưu / nhược điểm của họ là gì?
Câu trả lời:
Về cơ bản có hai cách tiếp cận: một bảng kiểm toán, với tất cả các giá trị trước đó được lưu trong đó hoặc bao gồm ngày bắt đầu / ngày kết thúc như một phần của bảng và tất cả các bản cập nhật tạo ra một bản ghi mới trong khi đóng bản ghi cũ.
Cập nhật: SQL SERVER 2016 hỗ trợ điều này dưới dạng mẫu / bảng thiết kế - https://docs.microsoft.com/en-us/sql/relational-database/tables/temporal-tables?view=sql-server-2017
Một ý tưởng là sử dụng "Cơ sở dữ liệu chỉ chèn". Ý tưởng cơ bản là bạn không bao giờ xóa hoặc cập nhật dữ liệu liên tiếp .
Mỗi bảng được yêu cầu theo dõi sẽ có hai datetime
cột from
và to
. Họ bắt đầu với giá trị NULL
trong mỗi (bắt đầu từ thời gian đến kết thúc thời gian). Khi bạn cần "thay đổi" hàng bạn thêm một hàng mới, đồng thời bạn cập nhật to
hàng trước đó Now
và from
hàng bạn đang thêm vào Now
.
Để biết thêm thông tin chi tiết, xem tại:
Kỹ thuật này được gọi AuditTrail
để quản lý dữ liệu cũ và các cửa hàng của nó thay đổi lịch sử.
Có vẻ như câu hỏi về bản chất này đã được đăng:
Tôi nghĩ rằng bạn có thể sử dụng trình kích hoạt cho mỗi bảng và duy trì dữ liệu trong _history (hoặc bạn có thể đặt bất kỳ tên nào) và trên mỗi lần chèn, cập nhật, xóa trên bảng chính sẽ kích hoạt trình kích hoạt của bạn và bạn có thể lưu các chi tiết trong bảng này. cũng có sẵn với cơ sở dữ liệu SQLite nếu bạn đang sử dụng một cơ sở dữ liệu.
Cơ chế này cũng hữu ích cho các dự án lớn. Trong bảng này, bạn có thể ghi thông tin của người dùng đã thực hiện các thay đổi cùng với dấu thời gian của các thay đổi. sau đó bạn có thể khôi phục bảng của mình theo bất kỳ dấu thời gian nào phù hợp với yêu cầu của bạn.
Mỗi cơ sở dữ liệu có cách riêng để viết và kích hoạt mã. Nếu bạn đang sử dụng SQLite, hãy truy cập SQLite.org để biết cú pháp. Đối với các cơ sở dữ liệu khác, bạn có thể truy cập các trang web chính thức của họ.
Bạn có thể biết về công cụ db Sqlite . Toàn bộ db được lưu trong một tệp duy nhất. Api cũng hỗ trợ các hệ thống tệp ảo, vì vậy về cơ bản, bạn có thể tổ chức lưu trữ ở bất cứ đâu và với bất kỳ định dạng nào, chỉ cần phản hồi các hoạt động đọc và ghi tại các lần tắt tệp cụ thể. Các ứng dụng có thể cho việc này có thể là mã hóa, nén, v.v. Phần tốt nhất của nó là lớp container không nên biết gì về cơ sở dữ liệu, định dạng tệp sql hoặc sqlite, chỉ tuân theo các cuộc gọi lại xRead và xWrite.
Một trong những ý tưởng là thực hiện tính năng cỗ máy thời gian. Vì vậy, bất kỳ thao tác xWrite nào cũng lưu mọi phân đoạn mà nó sẽ ghi đè lên trong lịch sử "hoàn tác" và người dùng có thể chọn một ngày trong quá khứ để xem db chứa gì (có thể là chế độ chỉ đọc). Tôi chưa có ví dụ hoạt động (đã có một cuộc thảo luận về nó trong danh sách thư sqlite), nhưng có lẽ các công cụ khác cung cấp API VFS để có thể có một cái gì đó tương tự. Và một khi nó được thực hiện, nó sẽ tương thích với các cấu trúc cơ sở dữ liệu có độ phức tạp bất kỳ.
Phương pháp chúng tôi sử dụng để tạo phiên bản cơ sở dữ liệu là sử dụng bảng kiểm toán. Bảng này có một lược đồ dọc theo các dòng:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
Sau đó chúng tôi có các kích hoạt trên Chèn / Cập nhật / Xóa các bảng mà chúng tôi muốn theo dõi.
Ưu điểm:
Nhược điểm:
Tôi đang làm một phiên bản này. đối với mỗi bản ghi, tôi có Ngày chèn, ngày sửa đổi và cờ boolean Bản ghi hoạt động. Đối với lần chèn ban đầu, ngày chèn và ngày sửa đổi đều được đặt thành Now () (Ví dụ này nằm trong Access) và cờ bản ghi hoạt động được đặt thành true
. sau đó nếu tôi sửa đổi bản ghi đó, tôi sao chép toàn bộ bản ghi sang bản ghi mới, thay đổi (các) trường mà người dùng đang thay đổi, tôi để ngày Chèn bằng với bản gốc và thay đổi ngày Sửa đổi thành Hiện tại (). Sau đó tôi lật cờ Bản ghi hoạt động của bản ghi gốc false
và bản ghi mới đểtrue
. Tôi cũng có một trường cho ModifiedRecordsParentID nơi tôi lưu danh tính của bản ghi gốc.
Sau đó, nếu tôi thậm chí cần truy vấn, tôi chỉ có thể trả lại các bản ghi ở đâu ActiveRecord = true
và tôi sẽ chỉ nhận được thông tin cập nhật nhất.
ActiveRecord
cờ. Hàng MAX (*) phải luôn là bản ghi hiện tại. Khôi phục lại phiên bản trước chỉ đơn giản là chèn hàng đã nói vào bảng một lần nữa.
select top 1 order by id descending
sẽ làm.
đồng thời, nếu bạn muốn lưu trữ TẤT CẢ các thay đổi đối với DB theo thời gian, bạn có thể muốn kiểm tra việc đăng nhập ( /programming/3394132/where-can-i-find-the-mysql-transaction-log )