Obecnie pracuję nad aplikacją typu wiki za pomocą CouchDB i próbuję wdrożyć schemat wersjonowania dokumentów. Widzę to na dwa sposoby:
- Przechowuj każdą wersję jako osobny dokument
- Przechowuj starsze wersje jako załączniki do jednego dokumentu.
W tej chwili mam formę # 1 działającą. Gdy użytkownik edytuje dokument i zapisuje go, zaplecze najpierw kopiuje poprzednią wersję do nowego dokumentu, a następnie zapisuje nową wersję. Każdy dokument ma tablicę „historii”, która zawiera dane dotyczące każdej wersji (identyfikator _id starej wersji, znacznik czasu, edytor itp.).
Ponieważ ta tablica historii może być dość długa dla często aktualizowanego dokumentu, mam widok, który pobiera dokument bez historii podczas normalnego odczytu (i inny widok do pobierania historii).
Moje pytanie brzmi: czuję się zaniepokojony moim obecnym podejściem i zastanawiałem się nad przejściem na metodę „przywiązania”. Ale nie jestem pewien. Mam nadzieję, że ktoś, kto zna CouchDB lepiej niż ja (pracuję nad tym dopiero od kilku tygodni - i to jest mój pierwszy projekt z wykorzystaniem CouchDB ... i NoSQL) może mi powiedzieć, jakie są zalety i wady każdego z nich podejście. A może przeoczyłem jakiś inny schemat kontroli wersji?
źródło
Odpowiedzi:
Zachowywanie tylko zmian będzie dobrym pomysłem, ponieważ przechowywanie starszych dokumentów jako osobnych dokumentów lub załączników do ostatecznej wersji bazy danych spowoduje narzut na serwer bazy danych.
Po każdej zmianie wartości klucza w dokumencie dodaj nowy klucz o nazwie
_h_i_s_<key_name>
. W nowo utworzonym (lub utworzonym podczas ostatniej aktualizacji) dołączaj obiekty takie jak poniżej po każdej edycji / aktualizacji: -lub
Takie podejście pozwoli zaoszczędzić dużo miejsca na dysku i przepustowości replikacji na dłuższą metę.
źródło
Bez znajomości CouchDB. Przechowywanie każdej wersji może jednak różnić się tylko nieznacznie od poprzednika, co jest marnotrawstwem pamięci. Polecam tylko przechowywanie zmian.
Możesz zajrzeć tutaj lub wyszukać wersjonowanie danych.
źródło
lata później ;-)
nie musisz przechowywać zmian, ponieważ CouchDB zrobi to za Ciebie. Jeśli dokument zostanie zmieniony, zostanie utworzona nowa wersja. Pamiętaj, że jest to fizycznie kolejny dokument z tym samym,
_id
ale nowym_rev
(rewizja) i zajmie miejsce na dysku.Na pewno będziesz musiał zachować wszystkie wersje, co oznaczałoby, że potrzebujesz bardzo dużego dysku.
źródło