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

Cách giữ lịch sử chỉnh sửa của trường chuỗi lớn trong cơ sở dữ liệu quan hệ

Một giải pháp mà tôi đang thực hiện ngay bây giờ, đang hoạt động tốt cho đến nay, thực hiện thiết kế mà tôi đã đề xuất trong câu hỏi

Tôi sẽ chia sẻ chi tiết cụ thể về việc triển khai của mình tại đây

Để tạo delta và sử dụng để tạo lại toàn văn, tôi đang sử dụng thư viện google-diff-match-patch . Bạn có thể đọc tài liệu API bất khả tri triển khai để hiểu rõ hơn về các ví dụ mã bên dưới, mặc dù nó khá dễ đọc.

google-diff-match-patch có triển khai Java và JS nên tôi có thể sử dụng nó để tính toán các delta với Java trên máy chủ. Tôi đã chọn chuyển đổi từng đồng bằng thành một Chuỗi để có thể dễ dàng lưu trữ trong cơ sở dữ liệu và dễ dàng sử dụng thư viện JS trên máy khách. Thông tin thêm về điều này bên dưới.

public String getBackwardsDelta(String editedBlogPost, String existingBlogPost) {
    diff_match_patch dmp = new diff_match_patch();
    LinkedList<diff_match_patch.Patch> patches = 
        dmp.patch_make(editedBlogPost, existingBlogPost);
    return dmp.patch_toText(patches);
}

N.B. điều mà tôi đã mất một lúc để tìm ra là làm thế nào để gỡ bỏ bản dựng chính thức của google-diff-match-patch sử dụng maven. Nó không nằm trong kho trung tâm của maven, mà trên repo của chính họ trên googlecode.com. Chỉ cần lưu ý, một số người đã chia nhỏ nó và đặt các phiên bản đã tách của họ vào trung tâm maven, nhưng nếu bạn thực sự muốn phiên bản chính thức, bạn có thể nhận được bằng cách thêm repo và phụ thuộc vào pom.xml của mình như sau

<repository>
  <id>google-diff-patch-match</id>
  <name>google-diff-patch-match</name>
  <url>https://google-diff-match-patch.googlecode.com/svn/trunk/maven/</url>
</repository>

<dependency>
  <groupId>diff_match_patch</groupId>
  <artifactId>diff_match_patch</artifactId>
  <version>current</version>
</dependency>

Đối với giao diện người dùng, tôi chuyển toàn văn bài đăng blog mới nhất, cùng với một chuỗi delta quay ngược thời gian đại diện cho từng chỉnh sửa và sau đó tạo lại toàn văn của từng phiên bản trong trình duyệt bằng JS.

Để tải thư viện, tôi đang sử dụng npm + Browserify. Thư viện khả dụng vào npm dưới dạng diff-match-patch . Phiên bản 1.0.0 là phiên bản duy nhất.

getTextFromDelta: function(originalText, delta) {
  var DMP = require('diff-match-patch'); // get the constructor function
  var dmp = new DMP();
  var patches = dmp.patch_fromText(delta);
  return dmp.patch_apply(patches, originalText)[0];
}

Và đó là nó, nó hoạt động tuyệt vời.

Về việc lưu trữ các chỉnh sửa của các bài đăng trên blog, tôi chỉ sử dụng một bảng BLOG_POST_EDITS nơi tôi lưu trữ id bài đăng trên blog, dấu thời gian về thời điểm thực hiện chỉnh sửa (sau này tôi sử dụng để sắp xếp các chỉnh sửa một cách chính xác nhằm tạo chuỗi khi tạo lại các phiên bản toàn văn trên ứng dụng khách) và dấu gạch ngang ngược giữa phiên bản trực tiếp hiện tại bài đăng trên blog trong BLOG_POST và phiên bản đã chỉnh sửa sắp tới của bài đăng trên blog.

Tôi đã chọn lưu trữ một 'chuỗi' các delta vì nó phù hợp với trường hợp sử dụng của tôi và đơn giản hơn trên phần cuối của mã máy chủ. Điều đó có nghĩa là để tạo lại phiên bản M của N, tôi phải gửi cho khách hàng một chuỗi N- (M-1) delta từ bài đăng blog trực tiếp toàn văn sang phiên bản M. Nhưng trong trường hợp sử dụng của tôi, tôi tình cờ muốn gửi toàn bộ chuỗi mỗi lần, vì vậy điều này là tốt.

Để có hiệu quả over-the-wire tốt hơn một chút cho việc yêu cầu các phiên bản cụ thể, tất cả các delta có thể được tính toán lại từ phiên bản bài đăng blog đã chỉnh sửa mới trở lại từng phiên bản (được khôi phục) mỗi khi thực hiện chỉnh sửa, nhưng điều này có nghĩa là nhiều công việc hơn và phức tạp hơn trên máy chủ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHỌN từ một bảng, CHÈN vào hai bảng khác dựa trên điều kiện

  2. Tôi có kết quả khác với truy vấn cho COUNT ('e.id') hoặc COUNT (e.id)

  3. Rails:Triển khai đến Heroku, Nhiều vấn đề

  4. Rails:Cách sử dụng phạm vi để tìm một phần tử trong mảng của mảng

  5. Không thể xác định kiểu đa hình vì đầu vào có kiểu không xác định