Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Phương pháp hay nhất cho hệ thống lập phiên bản dữ liệu mysql

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ới articles_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ên articles
  • Để 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à:

  1. 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
  2. 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.
  3. 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

  1. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể cài đặt mysql-python (phiên bản mới hơn) trong Windows

  2. lỗi mysql:đã vượt quá số kết nối tối đa mỗi giờ

  3. CodeIgniter:Không thể kết nối với máy chủ cơ sở dữ liệu của bạn bằng cách sử dụng cài đặt được cung cấp Thông báo lỗi

  4. Lọc theo định dạng MYSQL ngày giờ

  5. Các ký tự đang chạy trốn chẳng hạn như $ và% | MySQL và PHP