2008-09-24 34 views
8

Rails sử dụng khái niệm di chuyển để xử lý các thay đổi mô hình bằng cách sử dụng API ActiveRecord.Thay đổi mô hình tài liệu CouchDB?

CouchDB sử dụng JSON (bản đồ lồng nhau và mảng) để đại diện cho các đối tượng mô hình của nó.

Khi làm việc với CouchDB cho đến nay, tôi không thấy cách tốt khi nhận dạng cấu trúc của tài liệu (thay vì bị xử lý kỷ luật làm nhà phát triển) hoặc chuyển tài liệu từ cũ sang mô hình mới.

Có các tính năng hiện có hoặc bạn có thực tiễn tốt nhất để xử lý các thay đổi mô hình trong CouchDB không?

Trả lời

9

Thời gian để tẩy não bằng RDBMS. :)

Một trong những điểm lớn nhất trong thiết kế lược đồ của couchdb là trực tiếp nhằm ngăn ngừa sự cần thiết phải di chuyển. Biểu diễn JSON của các đối tượng giúp bạn dễ dàng gõ vịt các đối tượng của mình.

Ví dụ: với điều kiện là bạn có ứng dụng web loại blog có bài đăng và bất kỳ thứ gì lạ mắt mà mọi người lưu trữ trong blog. Tài liệu bài của bạn có các trường như tác giả, tiêu đề, được tạo tại, v.v. Bây giờ bạn đến và tự nghĩ, "Tôi nên theo dõi giai đoạn nào của mặt trăng khi tôi xuất bản bài đăng của mình ..." bạn chỉ có thể bắt đầu thêm moon_phase thuộc tính cho bài đăng mới.

Nếu bạn muốn hoàn thành, bạn sẽ quay lại và thêm moon_phase vào các bài đăng cũ, nhưng điều đó không thực sự cần thiết.

Trong chế độ xem của bạn, bạn có thể truy cập moon_phase làm thuộc tính. Và nó sẽ là vô giá trị hoặc gây ra một ngoại lệ hoặc một cái gì đó. (Không phải chuyên gia JS, tôi nghĩ rằng null là câu trả lời đúng)

Thing là, nó không thực sự quan trọng. Nếu bạn cảm thấy muốn thay đổi thứ gì đó, hãy thay đổi nó. Mặc dù đảm bảo rằng lượt xem của bạn hiểu được sự thay đổi đó. Mà trong kinh nghiệm của tôi không thực sự đòi hỏi nhiều.

Ngoài ra, nếu bạn đang thực sự hoang tưởng, bạn có thể lưu trữ một thuộc tính phiên bản/loại, như trong:

{ 
    _id: "foo-post", 
    _rev: "23490AD", 
    type: "post", 
    typevers: 0, 
    moon_phase: "full" 
} 

Hy vọng rằng sẽ giúp.

3

Check-out ActiveCouch: http://code.google.com/p/activecouch/

CouchDB là schema-ít về mục đích, do đó không phải là một 1-to-1 lập bản đồ các khái niệm từ sự di cư của ActiveRecord đến một CouchDB tương đương. Tuy nhiên, ActiveCouch không bao gồm di chuyển cho "khung nhìn" của CouchDB.

+1

Có vẻ như activecouch hiện đã có trên GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan

3

Nếu bạn đang sử dụng các lược đồ và vẫn muốn sử dụng CouchDB, bạn sẽ nhận được "sự không phù hợp trở kháng".

Tuy nhiên, việc "di chuyển" không quá khó. Thêm một phần tử schema_version vào mỗi tài liệu. Sau đó, có "chức năng đọc tài liệu" của bạn bao gồm cập nhật. Một cái gì đó như thế này:

def read(doc_id): 
    doc = db.get(doc_id) 
    if doc.schema_version == 1: 
     # version 1 had names broken down too much 
     doc.name = "%s %s" % (doc.first, doc.last) 
     del doc.first 
     del doc.last 
     doc.schema_version = 2 
     db.put(doc) 
    if doc.schema_version == 2: weight 
     # version 2 used kg instead of g 
     doc.weight_g = doc.weight_kg * 1000 
     del doc.volume_kg 
     doc.schema_version = 3 
     db.put(doc) 
    return doc 

Nếu bạn muốn nâng cấp toàn bộ DB cùng một lúc chỉ cần gọi read(doc_id) cho mọi tài liệu.

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