Rozwiązywanie konfliktów replikacji dla usuniętych dokumentów w CouchDB
Sposób rozwiązywania konfliktów replikacji zalecany przez oficjalną dokumentację to:
Czytaj sprzeczne wersje za pomocą dokumentów_conflicts
pole (np. przez widok)Pobierz dokumenty dla wszystkich wymienionych wersjiWykonaj scalanie specyficzne dla aplikacjiUsuń niechciane wersjeProblem pojawia się, gdy chcę się połączyćusunięte dokumenty. Nie pojawiają się w_conflicts
pole, ale w_deleted_conflicts
. Jeśli łączę tylko używając_conflicts
pole, a dokument zostanie usunięty z lokalnej bazy danych i edytowany w zdalnej replice, zostanie wskrzeszony lokalnie podczas replikacji. Mój model aplikacji zakłada, że usuwanie zawsze ma pierwszeństwo podczas łączenia: usunięte dokumenty pozostają usuwane niezależnie od tego, z jakimi edycjami koliduje.
Na pierwszy rzut oka najprościej jest to sprawdzić_deleted_conflicts
nie jest pusty, a jeśli nie jest pusty, usuń dokument, prawda? Cóż ... problem z tym polega na tym, że może to również zawierać usunięte wersje wprowadzone przez rozwiązanie konfliktów edycji w kroku 4, więc znaczenie_deleted_conflicts
jest w tym przypadku niejednoznaczny.
Jaki jest kanoniczny sposób radzenia sobie z konfliktami usuwania w CouchDB (jeśli istnieje), który nie wiąże się z robieniem rażących rzeczy, takich jak oznaczanie dokumentów jako usunięte i filtrowanie w warstwie aplikacji?