2009-08-26 47 views
21

Sau đây là chiến lược khả thi để thực hiện phiên bản (sử dụng "ví dụ" làm loại tài liệu mẫu):Chiến lược phiên bản CouchDB

Có một tài liệu gốc nơi trường loại được đặt tên example_original.

Các thay đổi tiếp theo đối với tài liệu đều có example_change và id của tài liệu example_original làm khóa. Thay đổi cũng sẽ mang dấu thời gian.

Giữ một tài liệu với loại example_current là kết quả của example_original với tất cả example_change "apply". Một tài liệu example_change mới sẽ tự động được áp dụng cho tài liệu này.

Tìm phiên bản cụ thể sẽ bao gồm việc truy xuất tài liệu example_original và áp dụng các thay đổi mong muốn (chủ yếu là đến một dấu thời gian nhất định, nhưng cũng có thể là một số thay đổi).

Tôi nên đề cập đến trường hợp sử dụng của tôi sẽ liên quan đến một số thay đổi giới hạn đối với bản gốc. Hầu hết các cập nhật sẽ bao gồm các tài liệu gốc mới. Trong khi đây là trường hợp sử dụng hiện tại của tôi, tôi cũng sẽ quan tâm đến các vấn đề có thể xảy ra nếu có nhiều thay đổi liên quan.

Bạn thấy ưu và nhược điểm nào trong phương pháp này?

+0

Bạn đang cố gắng phiên bản nội dung tài liệu hoặc cấu trúc tài liệu? – Dokie

+0

Chỉ nội dung. Các trường sẽ không bao giờ bị xóa chỉ được thêm vào. – mac

Trả lời

9

Lo lắng đầu tiên của tôi là: Khi "nhận" một phiên bản nhất định, bạn có thể áp dụng các thay đổi cho bản gốc mà không sửa đổi cơ sở dữ liệu không?

Bạn có bao giờ phải xóa nội dung nào đó khỏi lịch sử không? Bạn thật sự chắc không? Thực sự, thực sự chắc chắn? Làm thế nào về chi nhánh?

Tất cả trong tất cả, điều này trông giống như một chiến lược phức tạp. Hãy nhớ rằng tôi đã nghe nói về CouchDB nhưng không bao giờ sử dụng nó. Tôi muốn tìm cách tiếp cận đơn giản hơn:

  1. Khi bạn tạo tài liệu, bạn gán UUID. Không sử dụng tên hoặc bạn sẽ gặp rắc rối trong quá trình đổi tên. Thêm trường phiên bản có nội dung "1". Tạo tài liệu thứ hai chứa danh sách tài liệu có cùng UUID hoặc thêm con trỏ "cha" vào tài liệu đầu tiên.

    Có "tài liệu lịch sử" cho mỗi tài liệu cho phép điều hướng lịch sử nhanh hơn nhưng con trỏ gốc sẽ an toàn hơn (vì bạn không thể dễ dàng tạo cấu trúc bất hợp pháp với chúng).

  2. Khi bạn tạo bản sửa đổi mới, hãy sử dụng lại UUID và gán phiên bản mới, duy nhất. Cập nhật tài liệu lịch sử hoặc con trỏ chính.

Chiến lược này khá đơn giản để triển khai và cho phép tất cả các loại linh hoạt sau này. Bạn có thể xóa các phần của lịch sử một cách dễ dàng, đổi tên rất đơn giản và bạn có thể tạo các nhánh.

+0

Xem điểm của bạn, cảm ơn đề xuất. Tôi sẽ không bao giờ phải xóa nội dung nào đó khỏi lịch sử, nhưng một số thay đổi có thể được đánh dấu là "lỗi" hoặc tương tự. Hỗ trợ phân nhánh sẽ không cần thiết. – mac

1

Trạng thái doanh nghiệp của các tài liệu này, đặc biệt là hợp pháp là gì? Tôi đã làm việc trong các tình huống mà đề xuất của bạn sẽ không phù hợp với một doanh nghiệp persepctive, vì cần chứng minh rằng tài liệu được trình bày là v.3 thực sự là phiên bản 3 của tài liệu. Tự động áp dụng các vùng đồng bằng sẽ không cắt mù tạt tuân thủ.

Nếu, như bạn nói, những thay đổi đối với tài liệu không thường xuyên, thì bạn sẽ không tiết kiệm được nhiều dung lượng đĩa bằng cách lưu trữ các vùng thay vì toàn bộ tài liệu. Lưu trữ toàn bộ tài liệu cũng cho phép dự đoán đáng tin cậy về thời gian truy xuất cho bất kỳ tài liệu nào. Nó cũng làm giảm sự phức tạp của quá trình truy xuất.

+0

Tôi không nghĩ rằng điều này sẽ đại diện cho một vấn đề tuân thủ, miễn là có một bản ghi kiểm toán cho tất cả các tài liệu bao gồm cả tài liệu thay đổi. Cách tiếp cận này tương tự như của hợp đồng gốc và các sửa đổi tiếp theo. – mac

1

Một chiến lược để phiên bản với CouchDB là KHÔNG bao giờ nén cơ sở dữ liệu chứa tài liệu mà bạn cần giữ lại toàn bộ lịch sử. Bạn vẫn có thể thu gọn các cơ sở dữ liệu khác. Chiến lược đơn giản này hoạt động ngay hôm nay với chiến lược giải quyết xung đột chỉnh sửa.

Việc xóa tài liệu có thể được thực hiện bằng cách viết phiên bản mới không có nội dung nhưng tập hợp thuộc tính đã xóa.

Chi nhánh không thể thực hiện theo cách này vì cơ chế phiên bản cung cấp một chuỗi các bản chỉnh sửa.

Bây giờ cho tương lai có thể có của CouchDB:

  • Hôm nay mỗi phiên bản nắm giữ một bản sao đầy đủ của tài liệu nhưng người ta có thể nghĩ rằng việc tối ưu của động cơ CouchDB thể một đồng bằng châu thổ cửa hàng ngày.
  • Cũng có thể trong tương lai CouchDB sẽ cung cấp một API để ngăn chặn sự nén chặt của một số loại tài liệu nhất định. Điều này sẽ cho phép giữ tất cả các tài liệu trong cùng một cơ sở dữ liệu. Đây sẽ là một bản vá dễ dàng cho CouchDB.
  • Chiến lược này cho phép quản lý các nhánh tài liệu nhưng xem xét bản chất của CouchDB như một cơ sở dữ liệu tài liệu, đây là một cái gì đó hợp lý, nhưng về lâu dài, khả năng.
+0

Một ý tưởng thú vị, nhưng không phải là lời khuyên tốt. Trong khi bạn có thể thực hiện một hệ thống phiên bản rất đơn giản bằng cách đơn giản tránh sự nén chặt, bạn sẽ làm việc với cơ sở dữ liệu thay vì làm việc với nó. Tốt hơn để lưu trữ mỗi phiên bản mà bạn muốn giữ với một _id khác, để cơ sở dữ liệu biết rằng nó phải được lưu lại. –

+0

@NickPerkins, tôi đã đề cập cụ thể đến cơ sở dữ liệu không "nhỏ gọn" .. Điều đó ngụ ý rằng bạn có thể có một hoặc nhiều cơ sở dữ liệu khác mà bạn vẫn sẽ nhỏ gọn. Do đó giải pháp này không hoạt động đối với cơ sở dữ liệu. –

19

Simple Document Versioning with CouchDB

Các phiên bản như file đính kèm phương pháp mô tả trong bài viết này phải phù hợp với yêu cầu của hầu hết mọi người cho versioning.

+2

các liên kết không còn hoạt động nữa, nhưng [liên kết này] (http://jchris.ic.ht/drl/_design/sofa/_list/post/post-page?startkey=%5B%22Versioning-docs-in-CouchDB % 22% 5D) chứa tổng quan về 4 phương pháp được mô tả –

+0

Tôi tin rằng đây là một [link] cập nhật (https://blog.couchbase.com/how-implement-document-versioning-couchbase) –

+0

@BrianPutt: Liên kết bạn cho là nói về CouchBase, khác với CouchDB http://www.couchbase.com/couchbase-vs-couchdb –

Các vấn đề liên quan