CouchDB và phiên bản tài liệu


12

Tôi hiện đang làm việc trên một ứng dụng wiki-esque bằng CouchDB và đang cố gắng thực hiện một sơ đồ phiên bản tài liệu. Cách tôi nhìn thấy có hai cách để làm điều này:

  1. Lưu trữ mỗi phiên bản dưới dạng một tài liệu riêng biệt
  2. Lưu trữ các phiên bản cũ hơn dưới dạng tệp đính kèm vào một tài liệu.

Ngay bây giờ, tôi đã có một hình thức số 1 làm việc. Khi người dùng chỉnh sửa tài liệu và lưu tài liệu, phần đầu tiên sẽ sao chép bản sửa đổi trước đó sang tài liệu mới và sau đó lưu phiên bản mới. Mỗi tài liệu có một mảng 'history' chứa dữ liệu trên mỗi phiên bản (tài liệu _id của phiên bản cũ, dấu thời gian, trình chỉnh sửa, v.v.).

Vì mảng lịch sử này có thể trở nên khá dài đối với một tài liệu được cập nhật thường xuyên, tôi có một chế độ tìm nạp lịch sử trong quá trình đọc bình thường (và một chế độ xem khác để tìm nạp lịch sử).

Câu hỏi của tôi là thế này: Tôi cảm thấy không yên tâm về cách tiếp cận hiện tại của mình và đã suy nghĩ về việc thay đổi phương pháp 'đính kèm'. Nhưng tôi không chắc lắm. Tôi hy vọng ai đó hiểu rõ về CouchDB hơn tôi (tôi mới chỉ ở đây được vài tuần - và đây là dự án đầu tiên của tôi sử dụng CouchDB ... và NoQuery) có thể cho tôi biết những ưu và nhược điểm của mỗi tiếp cận. Hoặc có lẽ có một số sơ đồ phiên bản khác mà tôi đang xem?


2
Mặc dù tôi hoàn toàn không thể nói đến tác động hiệu suất, nhưng hệ thống bạn đang sử dụng là "tinh thần" phù hợp với CouchDB. Lưu trữ các phiên bản trước dưới dạng phân cấp phản hồi là thành ngữ, vì nó nằm trong "tổ tiên tinh thần" của CouchDB, cơ sở dữ liệu tài liệu Lotus Notes (NSF) (Damien Katz đã làm việc sâu sắc trước khi phát triển cái khác, giữ và cải thiện tốt nhất trong khi đưa ra các yêu cầu tương thích ngược và ngược / lỗi, rất nhiều câu hỏi cấu trúc cơ bản hơn sẽ có câu trả lời trong Ghi chú.)

Câu trả lời:


2

Lưu trữ chỉ thay đổi sẽ là một ý tưởng tốt, bởi vì lưu trữ các tài liệu cũ dưới dạng tài liệu riêng hoặc tệp đính kèm để sửa đổi cơ sở dữ liệu cuối cùng sẽ tạo ra một chi phí cho máy chủ cơ sở dữ liệu.

Khi bạn thay đổi một giá trị khóa trong tài liệu của mình, hãy thêm một khóa mới có tên _h_i_s_<key_name>. Trong phần mới được tạo (hoặc được tạo trong lần cập nhật trước), hãy chắp thêm các đối tượng như bên dưới sau mỗi lần chỉnh sửa / cập nhật: -

{
key_name: "Hello",
_h_i_s_key_name:{time_of_update:value_of_key_name_before_update},
....
}

hoặc là

    {
    key_name: "Hello",
    _h_i_s_key_name:[{time:time_of_update,value:value_of_key_name_before_update}, {time:time_of_last_update,value:value_of_key_name_before_last_update}],
    ....
    }

Cách tiếp cận này sẽ tiết kiệm rất nhiều không gian đĩa và băng thông sao chép trong thời gian dài.


0

Không có bất kỳ kiến ​​thức nào về CouchDB. Lưu trữ mọi phiên bản mặc dù có thể chỉ khác biệt so với phiên bản trước là lãng phí lưu trữ. Tôi chỉ khuyên bạn nên lưu trữ các thay đổi.

Bạn có thể muốn xem ở đây hoặc tìm kiếm phiên bản dữ liệu.


Câu trả lời này không cho biết lựa chọn nào 1 (tài liệu riêng) hoặc 2 (là một phần của tài liệu) là tốt hơn.
binki

0

Nhiều năm sau ;-)

bạn không phải lưu trữ các thay đổi vì CouchDB sẽ làm điều đó cho bạn. Nếu một tài liệu được thay đổi, một sửa đổi mới sẽ được tạo ra. Xin lưu ý rằng đây thực sự là một tài liệu khác có cùng tài liệu _idnhưng mới _rev(revison) và sẽ tiêu tốn dung lượng trên đĩa của bạn.

Để chắc chắn bạn sẽ phải giữ tất cả các sửa đổi có nghĩa là gì, rằng bạn cần một đĩa rất lớn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.