Để thêm vào Charles' answer, tôi sẽ sử dụng một Entity-Attribute-Value model thay vì tạo ra một bảng lịch sử khác nhau cho mỗi bảng khác trong cơ sở dữ liệu của bạn.
Về cơ bản, bạn sẽ tạo mộtHistory
bảng như sau:
Create Table History
{
tableId varChar(64) Not Null,
recordId varChar(64) Not Null,
changedAttribute varChar(64) Not Null,
newValue varChar(64) Not Null,
effectiveUtc DateTime Not Null,
Primary Key (tableId , recordId , changedAttribute, effectiveUtc)
}
Sau đó, bạn sẽ tạo ra một kỷ lục History
bất cứ lúc nào bạn tạo hoặc sửa đổi dữ liệu trong một bảng của bạn.
Để làm theo ví dụ, khi bạn thêm 'Kyle' vào bảng Employee
, bạn sẽ tạo hai bản ghi (một cho mỗi thuộc tính không phải id) và sau đó bạn sẽ tạo bản ghi mới mỗi lần thay đổi thuộc tính:
thay đổi
History
+==========+==========+==================+==========+==============+
| tableId | recordId | changedAttribute | newValue | effectiveUtc |
| Employee | 1 | Name | Kyle | N |
| Employee | 1 | Property | 30 | N |
| Employee | 1 | Property | 50 | N+1 |
| Employee | 1 | Property | 70 | N+2 |
Ngoài ra, như a_horse_with_no_name gợi ý, nếu bạn không muốn lưu trữ một kỷ lục mới History
cho mỗi thay đổi lĩnh vực, bạn có thể lưu trữ nhóm (ví dụ như thay đổi Name
để 'Kyle' và Property
-30 trong cùng cập nhật) dưới dạng một bản ghi. Trong trường hợp này, bạn sẽ cần phải diễn tả tập hợp các thay đổi trong JSON hoặc một số định dạng blob khác. Điều này sẽ hợp nhất các trường changedAttribute
và newValue
thành một (changedValues
). Ví dụ:
History
+==========+==========+================================+==============+
| tableId | recordId | changedValues | effectiveUtc |
| Employee | 1 | { Name: 'Kyle', Property: 30 } | N |
Đây có lẽ là khó hơn việc tạo ra một bảng History cho mỗi bảng khác trong cơ sở dữ liệu của bạn, nhưng nó có nhiều lợi ích:
- thêm lĩnh vực mới để bảng trong cơ sở dữ liệu của bạn giành chiến thắng' t yêu cầu thêm các lĩnh vực cùng một bảng
- bảng ít sử dụng
- Nó dễ dàng hơn để tương quan bản cập nhật cho các bảng khác nhau theo thời gian
Ứng dụng của bạn có cần phải hiểu lịch sử (tức là trình bày lịch sử này cho người dùng cuối) hay là mục đích kiểm toán? – Matthew
Đó có phải là một yêu cầu mà điều này được lưu trữ trong DB? Thông thường điều này được thực hiện tại ứng dụng để nó có thể được kiểm soát phiên bản và được áp dụng giữa nhiều nhà phát triển. –
Có, ứng dụng sẽ cần phải trình bày lịch sử này cho người dùng. –