Mỗi lần tôi cần thiết kế một cơ sở dữ liệu mới, tôi dành khá nhiều thời gian để suy nghĩ về cách tôi nên thiết lập lược đồ cơ sở dữ liệu để giữ nhật ký kiểm toán các thay đổi.
Một số câu hỏi đã được hỏi ở đây về vấn đề này, nhưng tôi không đồng ý rằng có một cách tiếp cận tốt nhất cho tất cả các kịch bản:
- Thiết kế cơ sở dữ liệu để sửa đổi
- Thiết kế tốt nhất cho bảng cơ sở dữ liệu kiểm toán nhật ký thay đổi
- Ý tưởng về thiết kế cơ sở dữ liệu để nắm bắt các đường mòn kiểm toán
Tôi cũng đã tình cờ thấy bài viết thú vị này về Duy trì Nhật ký Thay đổi Cơ sở dữ liệu cố gắng liệt kê các ưu và nhược điểm của từng phương pháp. Nó được viết rất tốt và có thông tin thú vị, nhưng nó đã khiến cho quyết định của tôi trở nên khó khăn hơn.
Câu hỏi của tôi là: Có một tài liệu tham khảo mà tôi có thể sử dụng, có thể là một cuốn sách hoặc một cái gì đó giống như một cây quyết định mà tôi có thể tham khảo để quyết định tôi nên đi theo cách nào dựa trên một số biến đầu vào, như:
- Sự trưởng thành của lược đồ cơ sở dữ liệu
- Làm thế nào các bản ghi sẽ được truy vấn
- Xác suất cần thiết để tạo lại hồ sơ
- Điều quan trọng hơn: viết hoặc đọc hiệu suất
- Bản chất của các giá trị đang được ghi lại (chuỗi, số, đốm)
- Dung lượng lưu trữ có sẵn
Các cách tiếp cận mà tôi biết là:
1. Thêm cột cho ngày và người dùng được tạo và sửa đổi
Bảng ví dụ:
- Tôi
- giá trị_1
- giá trị_2
- giá trị_3
- ngày tạo ra
- sửa đổi_date
- được tạo bởi
- sửa đổi_by
Nhược điểm chính: Chúng tôi mất lịch sử sửa đổi. Không thể phục hồi sau khi cam kết.
2. Chỉ chèn các bảng
- Tôi
- giá trị_1
- giá trị_2
- giá trị_3
- từ
- đến
- đã xóa (Boolean)
- người sử dụng
Nhược điểm chính: Làm thế nào để giữ khóa nước ngoài cập nhật? Không gian rộng lớn cần thiết
3. Tạo một bảng lịch sử riêng cho mỗi bảng
Ví dụ bảng lịch sử:
- Tôi
- giá trị_1
- giá trị_2
- giá trị_3
- giá trị_4
- người sử dụng
- đã xóa (Boolean)
- dấu thời gian
Nhược điểm chính: Cần sao chép tất cả các bảng đã được kiểm toán. Nếu lược đồ thay đổi, nó cũng sẽ cần thiết để di chuyển tất cả các bản ghi.
4. Tạo Bảng lịch sử hợp nhất cho tất cả các bảng
Ví dụ bảng lịch sử:
- tên bảng
- cánh đồng
- người sử dụng
- giá trị mới
- đã xóa (Boolean)
- dấu thời gian
Nhược điểm chính: Tôi có thể tạo lại các bản ghi (rollback) nếu cần dễ dàng không? Cột new_value cần phải là một chuỗi lớn để có thể hỗ trợ tất cả các loại cột khác nhau.