7

Tôi phát hiện ra rằng RCS cho các mô hình là một vấn đề thú vị để giải quyết trong bối cảnh kiên trì dữ liệu. Họ là một số giải pháp bằng cách sử dụng ORM django để đạt được điều này django-reversionAuditTrail mỗi trong số đó đề xuất cách riêng của họ để làm điều đó.Bạn sẽ triển khai một hệ thống điều khiển sửa đổi cho các mô hình của bạn trong mô hình db ưa thích của bạn như thế nào?

Dưới đây là mô hình (ở định dạng django-mô hình tương tự) mà tôi muốn có các phiên bản:

class Page(Model): 

    title = CharField() 
    content = TextField() 
    tags = ManyToMany(Tag) 
    authors = ManyToMany(Author) 
  • Mỗi rà soát này cần được chú thích với một ngày , một số sửa đổi , nhận xét và người dùng đã thực hiện sửa đổi.

Bạn sẽ làm điều đó như thế nào trong DB ưa thích (Mongo, neo4j, CouchDb, GAE Datastore)?

Vui lòng chỉ đăng một ví dụ về mô hình RCS cho mỗi bài đăng.

Tôi không yêu cầu mã hoàn chỉnh (có thể là giải thích là đủ?) Nhưng đủ để xem vấn đề này có thể được giải quyết như thế nào trong mỗi loại db.

+0

Bạn có thể cụ thể hơn không? –

Trả lời

0

Trong CouchDB, điều này khá đơn giản. Mỗi mục trong DB có một _id và một _rev. Vì vậy, bạn không cần một số sửa đổi riêng biệt. Tôi có lẽ sẽ làm điều này sau đó. Chỉ định mỗi mục một số systemrev. Số này sẽ là một liên kết đến một bản ghi DB khác có chứa ngày, nhận xét và người dùng cho bản sửa đổi đó.

Ví dụ:

mục đang được theo dõi:

{ 
    _id: "1231223klkj123", 
    _rev: "4-1231223klkj123", 
    systemRev: "192hjk8fhkj123", 
    foo: "bar", 
    fooarray: ["bar1", "bar2", bar3"] 
} 

Và sau đó tạo ra một kỷ lục phiên bản riêng biệt:

{ 
    _id: "192hjk8fhkj123", 
    _rev: "2-192hjk8fhkj123", 
    user: "John", 
    comment: "What I did yesterday", 
    date: "1/1/2010", 
    tags: ["C# edits", "bug fixes"] 
} 

Đối với tôi nó có vẻ khá thanh lịch ....

2

Trước hết, nếu bạn đang sử dụng CouchDB, không sử dụng trường _rev.

Tại sao? Các phiên bản cũ bị mất khi một cơ sở dữ liệu được nén chặt.

Nén ghi lại tệp cơ sở dữ liệu, xóa tài liệu đã lỗi thời và tài liệu đã bị xóa.

CouchDB wiki - Compaction page

Có một vài khả năng giải pháp:

  1. Giữ các phiên bản hiện tại và cũ trong cùng một cơ sở dữ liệu. Thêm trường sửa đổi bổ sung để xác định sự khác biệt giữa phiên bản hiện tại và phiên bản cũ.
  2. Lưu trữ các bản sửa đổi cũ trong một cơ sở dữ liệu riêng biệt.Khi một bản sửa đổi mới được thêm vào cơ sở dữ liệu "hiện tại", tài liệu sửa đổi cũ có thể được xóa và chèn vào cơ sở dữ liệu "sửa đổi".

Điều nào tốt nhất? Nó phụ thuộc vào cách dữ liệu của bạn sẽ được truy cập. Nếu bạn có thể truy vấn các phiên bản cũ độc lập với các bản sửa đổi hiện tại, thì việc lưu trữ tài liệu trong 2 cơ sở dữ liệu khác nhau sẽ cung cấp cho bạn một số lợi ích hiệu suất.

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