2011-06-22 28 views
8

Tôi biết đôi khi đó là một tính năng tốt, nhưng nếu tôi cần lưu trữ lượng lớn dữ liệu, thì không cần thiết "siêu dữ liệu" khác xung quanh dữ liệu.Làm thế nào để tắt phiên bản trong CouchDB?

Có cách nào để vô hiệu hóa phiên bản trong CouchDB hay tôi cần sử dụng công cụ DB khác, như Mongo?

Trả lời

17

Versioning không phải là một tính năng của CouchDB nó là một chức năng cốt lõi của cách nó hoạt động ghi dữ liệu vào đĩa và khuôn phôi PET tái tạo giải quyết xung đột với các nút khác. Đó là không một cơ chế lịch sử.

Rất tiếc là không có cụm từ nào tốt hơn version để tham chiếu đến các bản sao trước của tài liệu. Bởi vì version đối với hầu hết các nhà phát triển có nghĩa là một cái gì đó historical được lưu trữ. Đó không phải là những gì nó được dự định để được sử dụng như ở tất cả trong CouchDB.

Nó được dán trên tất cả các tài liệu CouchDB để không dựa trên trước phiên bản như sao lưu hoặc một hệ thống versioning, rằng họ có khả năng có thể biến mất bất cứ lúc nào, bởi vì chúng được sử dụng để phát hiện xung đột sao chép chủ yếu. Nhưng thực tế đơn giản là đây không phải là tính năng nó chỉ là cách CouchDB hoạt động.

Cách duy nhất để xóa các phiên bản trước là compact cơ sở dữ liệu định kỳ. Trong phiên bản hiện tại của CouchDB, điều này có thể được kích hoạt với một kịch bản lệnh gắn vào các bản cập nhật tài liệu và kích hoạt tính năng nén bán tự động dựa trên ngưỡng đánh dấu nước cao. Thông thường, điều này được thực hiện thủ công sau khi một bộ tài liệu lớn được cập nhật theo lô, bạn biết rằng điều này có thể có lợi từ quan điểm cụ thể của ứng dụng.

Điều đó nói rằng, nếu bạn không cập nhật tài liệu không có lịch sử được tạo và điều này là không cần thiết.

+2

+1. Radek, có lẽ tự hỏi: đây có phải là một sự tối ưu hóa sớm không? Tại sao tôi tránh các bản sửa đổi CouchDB? Bởi vì nó không * cảm thấy * phải không? Hoặc bởi vì tôi có bằng chứng (hoặc lý do mạnh mẽ) cho thấy MVCC sẽ là quá nhiều gánh nặng? (** Có! ** đúng vậy, CouchDB áp đặt không gian đĩa, đĩa i/o và gánh nặng của khách hàng) Trong kinh nghiệm (jhs) của tôi, MVCC * cảm thấy * sai nhưng không có vấn đề gì trong thực tế, * tuy nhiên *, cho cao khối lượng, dữ liệu không có lịch sử, CouchDB không phải là lý tưởng. Có lẽ Redis hoặc Membase? (Membase được lên kế hoạch để tương thích với CouchDB trong tương lai thông qua Couchbase.) – JasonSmith

+0

@jhs CouchDB 'phiên bản' không dành cho lịch sử, chúng là để kiểm soát nhân rộng. Nếu bạn có dữ liệu * không có lịch sử * thì sẽ không bao giờ có nhiều hơn 1 phiên bản trong CouchDB. Bạn đúng rằng lo lắng về hiệu suất mà không cần lược tả là tối ưu hóa sớm. Tôi kinh nghiệm của tôi CouchDB là ** tuyệt vời ** cho * không có lịch sử * dữ liệu như mục nhập tệp nhật ký. Nó viết nhanh, nó đọc nhanh và với toàn văn chỉ mục nó truy vấn nhanh. –

+0

@Jarrod Nghiêm túc, từ đọc của tôi lên, nó cho MVCC tức là: kiểm soát đồng thời. Bằng cách không bao giờ ghi đè lên một bản ghi hiện có, luôn luôn thêm dữ liệu vào các tệp db, bạn có thể thả khóa và giao dịch chủ yếu, và rev-id hoạt động để nhân bản/lưu xung đột quá. – andora

4

Bạn có thể thử API _revs_limit (ví dụ:/database/_revs_limit). Tôi chưa từng sử dụng nó Tôi chỉ đọc về nó trên liên kết này http://wiki.apache.org/couchdb/Security_Features_Overview

+2

Đó là một gợi ý rất thông minh, tuy nhiên tôi đoán rằng việc đặt giới hạn thành 0 sẽ không hoạt động và nếu bạn đặt thành 1 hoặc cao hơn, CouchDB sẽ vẫn yêu cầu trường '_rev', vì vậy bạn vẫn phải tìm nạp/sửa đổi/lưu trữ. Có lẽ nó có giá trị một thử mặc dù! – JasonSmith

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