2009-08-26 14 views
21

Czy dodaje się być realną strategią wdrażania wersjonowanie (przy użyciu „przykład” jako próbki typu dokumentu):CouchDB strategia wersjonowanie

mieć jeden oryginalny dokument, w którym pole typu nazwie example_original.

Kolejne zmiany w dokumencie mają typ example_change i identyfikator dokumentu example_original jako klucza. Zmiana będzie również zawierać znacznik czasu.

Zachowaj jeden dokument z typem example_current, który jest wynikiem example_original z wszystkimi example_change "applied". Nowy dokument example_change zostanie automatycznie zastosowany do tego dokumentu.

Poszukiwanie konkretnej wersji polegałoby na pobraniu dokumentu przyklad_originalnego i zastosowaniu pożądanych zmian (przeważnie do określonego znacznika czasu, ale może to być również pewna liczba zmian).

Należy wspomnieć, że mój przypadek użycia będzie zawierał ograniczoną liczbę zmian w oryginale. Większość aktualizacji będzie składać się z nowych oryginalnych dokumentów. Chociaż jest to mój obecny przypadek użycia, byłbym również zainteresowany problemami, które mogłyby powstać, gdyby w grę wchodziło wiele zmian.

Jakie zalety i wady widzisz w tym podejściu?

+0

Czy próbujesz zmienić wersję dokumentu lub strukturę dokumentu? – Dokie

+0

Tylko treść. Pola nigdy nie zostaną usunięte tylko dodane. – mac

Odpowiedz

9

Moją pierwszą zmartwieniem jest: Kiedy "otrzymasz" określoną wersję, możesz zastosować zmiany do oryginału bez modyfikowania bazy danych?

Czy kiedykolwiek będziesz musiał usunąć coś z historii? Czy jesteś pewny? Naprawdę, naprawdę pewny? A co z oddziałami?

Podsumowując, wygląda to na złożoną strategię. Pamiętaj, że słyszałem o CouchDB, ale nigdy go nie używałem. Poszedłem na prostsze podejście:

  1. Podczas tworzenia dokumentu przypisujesz identyfikator UUID. Nie używaj tej nazwy, bo inaczej wystąpią problemy podczas operacji zmiany nazwy. Dodaj pole wersji, które brzmi "1". Utwórz drugi dokument, który zawiera listę dokumentów o tym samym identyfikatorze UUID lub dodaj "nadrzędny" wskaźnik do pierwszego dokumentu.

    Posiadanie dokumentu „History” dla każdego dokumentu pozwala na szybsze nawigacji historii ale rodzic wskaźniki są bardziej „bezpieczne” (ponieważ nie można łatwo tworzyć nielegalnych struktur z nich).

  2. Po utworzeniu nowej wersji należy ponownie użyć identyfikatora UUID i przydzielić nową, unikatową wersję. Zaktualizuj dokument historii lub wskaźnik rodzica.

Ta strategia jest łatwa do wdrożenia i pozwala później na wszystkie rodzaje elastyczności. Możesz łatwo wymazać części historii, zmienić nazwę jest prosta i możesz tworzyć gałęzie.

+0

Zobacz swoją opinię, dzięki za sugestię. Nigdy nie będę musiał usuwać czegoś z historii, ale niektóre zmiany mogą być oznaczone jako "błąd" lub podobne. Wsparcie dla rozgałęzień nie będzie potrzebne. – mac

1

Jaki jest status biznesowy tych dokumentów, w szczególności legalnych? Pracowałem w sytuacjach, w których twoja propozycja nie byłaby odpowiednia z punktu widzenia biznesu, ze względu na potrzebę udowodnienia, że ​​dokument przedstawiony jako v.3 naprawdę jest wersją 3 dokumentu. Dynamiczne stosowanie delt nie ograniczyłoby musztardy zgodności.

Jeśli, jak mówisz, zmiany w dokumentach ae rzadkie, to nie będą oszczędności dużo miejsca na dysku poprzez przechowywanie delty zamiast całych dokumentów. Przechowywanie całych dokumentów pozwala również na rzetelne prognozowanie czasu pobierania dla dowolnego dokumentu. Zmniejsza to również złożoność procesu pobierania.

+0

Nie sądzę, że będzie to stanowić problem zgodności, o ile ma dziennik kontroli dla wszystkich dokumentów, w tym dokumentów zmian. Podejście analogiczne do pierwotnej umowy i późniejszych zmian. – mac

1

Strategia wersjonowania z CouchDB polega na tym, aby nigdy nie kompaktować bazy danych zawierającej dokumenty, dla których konieczne jest zachowanie pełnej historii. Nadal można kompaktować inne bazy danych. Ta prosta strategia działa dziś po wyjęciu z pudełka ze strategią rozwiązywania konfliktów edycji.

Usunięcie dokumentu można wykonać, pisząc nową wersję bez zawartości, ale z usuniętym zestawem właściwości.

Odgałęzień nie można wykonać w ten sposób, ponieważ mechanizm wersjonowania oferuje jeden wątek wersji.

teraz za ewentualną przyszłością CouchDB:

  • Dzisiaj każda wersja posiada pełną kopię dokumentu, ale można by pomyśleć, że optymalizacje z silnikiem couchdb można delty sklepów dni.
  • Możliwe jest również, że w przyszłości CouchDB będzie oferować interfejs API, który zapobiegnie zagęszczeniu niektórych typów dokumentów. Pozwoli to zachować wszystkie dokumenty w tej samej bazie danych. Byłaby to łatwa łatka dla CouchDB.
  • Ta strategia umożliwia zarządzanie działami dokumentów, ale biorąc pod uwagę charakter CouchDB jako bazy danych dokumentów, jest to rozsądna, ale długotrwała możliwość.
+0

Ciekawy pomysł, ale nie dobra rada. Chociaż można wdrożyć bardzo prosty system wersjonowania, po prostu unikając zagęszczania, pracowałbyś przeciwko bazie danych, zamiast pracować z nią. Lepiej przechowywać każdą wersję, którą chcesz zachować, za pomocą innego _id, aby baza danych wiedziała, że ​​musi być zapisana. –

+0

@NickPerkins, specjalnie wspomniałem, że nie mam zwartej "bazy danych", która ... Oznacza to, że możesz mieć jedną lub więcej innych baz danych, które wciąż byś kompaktował. Dlatego to rozwiązanie nie działa wbrew bazie danych. –

19

Simple Document Versioning with CouchDB

wersjonowanie jako załączniki podejścia opisanego w tym artykule, należy dopasować wymagania większości ludzi do wersjonowania.

+2

linki nie są już aktywne, ale [ten] (http://jchris.ic.ht/drl/_design/sofa/_list/post/post-page?startkey=%5B%22Versioning-docs-in-CouchDB % 22% 5D) zawiera omówienie 4 metod opisanych –

+0

Uważam, że jest to zaktualizowany [link] (https://blog.couchbase.com/how-implement-document-versioning-couchbase) –

+0

@BrianPutt: Link give mówi o CouchBase, która różni się od CouchDB http://www.couchbase.com/couchbase-vs-couchdb –