Lựa chọn của tôi sẽ là một biến thể của cách tiếp cận 2. In đậm chỉ ra các trường trong khóa chính.
- Bạn chèn mọi bài viết vào một bảng
articles_versioned
( id , dấu thời gian , tên, văn bản) - Bảng thứ hai của bạn là
articles
( id , dấu thời gian, [tên, văn bản]). Lưu ý cách dấu thời gian không phải là chính; tên và văn bản có thể được sao chép hoặc bạn có thể sử dụng liên kết vớiarticles_versioned
(sẽ nhanh chóng vì id và dấu thời gian làarticles_versioned
khóa chính) -
articles_versioned
có một trình kích hoạt trên chèn lấy hàng vừa được chèn và sao chép nó trênarticles
- Để khôi phục một phiên bản cụ thể của một bài báo, bạn sửa đổi
articles
bảng.
Ưu điểm của phương pháp này là:
- Bạn nhận được miễn phí một thông tin khác (ngày và giờ của bài viết) trong bảng của mình mà bạn có thể cần đến
- Bạn không cần truy vấn cơ sở dữ liệu để lấy ngày hiện tại. Nếu bạn sử dụng phiên bản, bạn phải sử dụng.
- Mã của bạn không phải chèn bài viết vào hai bảng. Bạn chỉ cần chèn vào
articles_versioned
và đọc từarticles
, db sẽ đảm nhận việc di chuyển dữ liệu khi bạn chèn nó qua trình kích hoạt, tránh mọi vấn đề về tính nhất quán.
Con's
- Trong một môi trường đồng thời nhiều, hai phiên bản có thể được chèn vào cùng một lúc, vì vậy một trong số chúng có thể bị lỗi. Đây không phải là vấn đề khi chèn các bài báo do người dùng viết (rất khó xảy ra với độ chính xác của dấu thời gian ngày nay). Nếu bạn không chỉ định dấu thời gian trong
INSERT
của mình nhưng thay vào đó, bạn đặt trường datetime thành giá trị mặc định cho thời gian hiện tại, bạn có thể tránh hoàn toàn sự cố này.
Để trả lời phần còn lại của câu hỏi của bạn. Cách tiếp cận 1 sẽ không dẫn đến các truy vấn dài hơn miễn là bạn thêm chỉ mục về trạng thái. Điều này chỉ có ý nghĩa nếu bạn có nhiều phiên bản khác nhau của mỗi bài viết; Miễn là bạn có trung bình 2 phiên bản cho mỗi bài viết hoặc ít hơn, chỉ mục sẽ chỉ làm bạn chậm lại và dù sao thì cách tiếp cận 2 sẽ không nhanh hơn đáng kể (tuy nhiên, tôi vẫn khuyên bạn nên tiếp cận bởi vì nó đơn giản hóa mã, vì khôi phục một phiên bản không không yêu cầu trạng thái chuyển đổi cho hai hàng).
Các tài nguyên liên quan, như hình ảnh, phải tuân theo một phiên bản tương tự. Tôi giả sử bạn đang lưu chúng trên hệ thống tệp; thay vì lưu chúng bằng tên thật của chúng, hãy sử dụng bảng ( id , image_name) để cấp cho mỗi hình ảnh một id, sau đó lưu hình ảnh dưới dạng -id-.jpg
. Trường image_name sẽ giúp bạn có thể biết tên tệp gốc là gì (nếu bạn quan tâm đến điều đó). Bằng cách này, bạn có thể phiên bản hình ảnh giống như cách bạn phiên bản các bài báo và trong các bài báo, bạn sẽ sử dụng một cái gì đó như <img src="-id-.jpg">
, mà bạn biết sẽ vẫn tồn tại mãi mãi.