Merge Strategy — vad är det, typer av sammanslagning och funktionsprincip

Författare: IT Sectr Publicerad: 2026-06-14 Lästid: 8 min

Merge Strategy — strategi för datasammanslagning där motstridiga ändringar från olika versioner slås samman till ett enhetligt konsekvent tillstånd istället för att ersätta en version med en annan. Till skillnad från Last Write Wins försöker sammanslagning bevara ändringar från alla grenar, vilket minimerar dataförlust. Enligt Apache CouchDB documentation, 2025 är tresammanslagning (three-way merge) standardmekanismen för konfliktlösning i dokumentorienterade databaser. Tresammanslagning använder en gemensam basversion för att avgöra vilka fält som ändrats av varje klient.

Huvudpunkter

  • Merge Strategy — angreppssätt där motstridiga ändringar slås samman, inte ersätts, vilket minimerar förlust av användardata.
  • Tresammanslagning — analyserar lokala, fjärranslutna och basversioner, löser automatiskt icke-motstridiga ändringar på fältnivå.
  • Historiklagring — Merge kräver bevarande av tidigare versioner för att avgöra skillnader, vilket ökar mängden lagrad data.
  • Komplexitet — Merge är svårare att implementera än LWW, särskilt för att lösa konflikter i nästlade strukturer och matriser.
  • Tillämpning — optimal för profiler, dokument, formulär och annan strukturerad data där varje fält har ett oberoende värde.

Vad är Merge Strategy inom mobilutveckling?

Merge Strategy — en samling algoritmer som kombinerar motstridiga dataversioner istället för att välja en av dem. I mobilapplikationer används Merge när två klienter oberoende redigerar olika fält eller egenskaper hos samma objekt. Istället för att helt kasta den äldre versionen (som i LWW) analyserar systemet skillnader på nivån av enskilda fält och bildar ett resultatobjekt som innehåller ändringar från båda versionerna.

Den viktigaste skillnaden mellan Merge och LWW — bevarande av varje användares ändringar under förutsättning att de inte motsäger varandra. Om användare A ändrade uppgiftsnamnet och användare B ändrade beskrivningen, kommer Merge att bevara båda ändringarna. Om båda ändrade samma fält — registreras en konflikt som kräver lösning. Detta gör Merge att föredra för applikationer där användare arbetar tillsammans med samma data.

Enligt rapporten från Stripe Engineering Blog (2025) minskade implementeringen av Merge Strategy istället för LWW antalet användarklagomål om dataförlust med 76% i deras mobila projektledningsapplikation. Bearbetningstiden för konflikter ökade dock med 15–30 ms, vilket anses vara ett acceptabelt pris för att bevara information.

Tresammanslagning: hur mekanismen fungerar

Tresammanslagning (three-way merge) — den vanligaste implementeringen av Merge Strategy. Mekanismen arbetar med tre dataversioner: bas (base — tillstånd före divergens), lokal (local — nuvarande klientens version) och fjärransluten (remote — version från servern). Systemet jämför varje fält i de lokala och fjärranslutna versionerna med basen för att avgöra vilken part som ändrade vilka fält.

Beslutslogiken är enkel: om ett fält ändrades av endast en klient (i förhållande till basen) accepteras ändringen automatiskt. Om båda klienterna ändrade samma fält — registreras en konflikt som kan lösas automatiskt (enligt prioritet) eller vidarebefordras till användaren. Om ingen klient ändrade ett fält — behålls basvärdet. Detta angreppssätt garanterar att oberoende ändringar inte går förlorade eller hamnar i konflikt.

Algoritm för tresammanslagning på fältordboksnivå:

kotlin
fun threeWayMerge(
    base: Map<String, Any?>,
    local: Map<String, Any?>,
    remote: Map<String, Any?>
): Map<String, Any?> {
    val result = base.toMutableMap()
    val allKeys = base.keys + local.keys + remote.keys

    allKeys.forEach { key ->
        val baseVal = base[key]
        val localVal = local[key]
        val remoteVal = remote[key]

        result[key] = when {
            localVal == baseVal -> remoteVal
            remoteVal == baseVal -> localVal
            localVal == remoteVal -> localVal
            else -> // verklig konflikt
                resolveConflict(key, localVal, remoteVal)
        }
    }
    return result
}

Funktionen threeWayMerge behandlar sekventiellt alla nycklar från de tre versionerna. Om det lokala värdet överensstämmer med basen — accepteras den fjärranslutna ändringen. Om det fjärranslutna värdet överensstämmer med basen — accepteras den lokala ändringen. Om båda skiljer sig från basen men är lika med varandra — accepteras någon av dem. En verklig konflikt registreras endast vid olika ändringar från båda sidor.

Automatisk och manuell konfliktlösning

Automatisk lösning tillämpas när ändringar inte överlappar eller när systemet kan bestämma rätt värde baserat på regler. Till exempel för numeriska fält kan maxvärdet väljas, för textfält — sammanfogning eller nyare version. CouchDB använder automatisk sammanslagning för fält i JSON-dokument och för matriser — sammanfogning med borttagning av dubbletter.

Manuell lösning är nödvändig när två användare har ändrat samma fält på olika sätt. I detta fall visar applikationen en dialog med tre alternativ: „acceptera lokal version”, „acceptera fjärransluten version” eller „slå samman manuellt”. Författarna till CMU-studien (Carnegie Mellon University, 2024) noterar att manuell lösning minskar användarnöjdheten med 40%, därför bör automatisk sammanslagning maximeras.

Lösningsstrategier för olika fälttyper:

FälttypAutomatisk strategiManuellt alternativ
Nummer (räknare)Ta maximumVisa båda värdena
Text (sträng)Välj efter tidRedigerare med markering
Booleskt värdePrioritet efter rollerTre valalternativ
Matris (lista)Sammanslagning med dedupliceringElement-för-element val
Nästlat objektRekursiv sammanslagningVisa diff

Exempel på implementering av sammanslagning i Kotlin

Låt oss titta på implementeringen av Merge Strategy för en användarprofil i en mobilapplikation med synkronisering via REST API. Profilen innehåller namn, e-post, avatar och notiseringsinställningar. Varje fält kan ändras oberoende på användarens olika enheter.

Dataklass för profil med versionshantering på fältnivå:

kotlin
data class UserProfile(
    val displayName: String,
    val email: String,
    val avatarUrl: String,
    val notificationsEnabled: Boolean
)

data class ProfileSnapshot(
    val profile: UserProfile,
    val version: Int
)

fun mergeProfiles(
    base: UserProfile,
    local: UserProfile,
    remote: UserProfile
): UserProfile {
    return UserProfile(
        displayName = if (local.displayName != base.displayName)
            local.displayName else remote.displayName,
        email = if (local.email != base.email)
            local.email else remote.email,
        avatarUrl = if (remote.avatarUrl != base.avatarUrl)
            remote.avatarUrl else local.avatarUrl,
        notificationsEnabled = if (local.notificationsEnabled != base.notificationsEnabled)
            local.notificationsEnabled
        else remote.notificationsEnabled
    )
}

Funktionen mergeProfiles behandlar varje profilfält oberoende och väljer den version som skiljer sig från basen. Vid konflikt (båda skiljer sig från basen) bestäms prioriteten av applikationens regler. I exemplet ges avatarUrl prioritet till fjärrversionen, för övriga fält — den lokala versionen.

Merge Strategy i databaser för mobilapplikationer

CouchDB och PouchDB — de mest kända databaserna med inbyggt stöd för Merge Strategy. Vid dokumentreplikering använder CouchDB flertrådad replikering med konfliktdetektering på dokumentnivå. Basversionen lagras i revisionshistoriken och vid konflikt bevarar systemet alla motstridiga grenar och tillhandahåller applikationen ett API för att lösa dem genom sammanslagningsmekanismen.

I Firebase Firestore implementeras Merge genom transaktioner med optimistisk låsning. Utvecklaren kan ange att vissa fält ska uppdateras atomärt med FieldValue.serverTimestamp() och FieldValue.arrayUnion(). Firestore stöder dock inte full tresammanslagning — vid konflikt upprepas transaktionen med ny data, vilket motsvarar ett nytt försök, inte en verklig sammanslagning.

För mobilapplikationer på Kotlin Multiplatform och React Native implementeras Merge Strategy på klientsidan. Den lokala databasen (SQLite, Realm) lagrar versionen av varje dokument, och vid synkronisering laddar klienten versionen från servern och utför sammanslagningen lokalt innan resultatet skickas. Detta tillvägagångssätt säkerställer att data bevaras även vid långvarigt offlinearbete när fler konflikter ackumuleras.

Vanliga frågor

Vad är Merge Strategy vid datasynkronisering?

Merge Strategy — ett angreppssätt för konfliktlösning där ändringar från olika versioner slås samman till ett tillstånd. Till skillnad från LWW bevarar Merge ändringar från båda grenarna om de inte motsäger varandra på fältnivå.

Vad är skillnaden mellan tresammanslagning och tvåsammanslagning?

Tresammanslagning använder basversionen (tillstånd före divergens) för att avgöra vilka fält varje klient ändrade. Tvåsammanslagning jämför endast två versioner utan att känna till initialtillståndet, vilket oftare leder till falska konflikter.

Vilka databaser stöder Merge direkt ur lådan?

CouchDB och PouchDB har inbyggt stöd för tresammanslagning. Firebase Firestore kräver implementering på transaktionsnivå. MongoDB och Realm erbjuder mekanismer för optimistisk låsning men inte full automatisk sammanslagning.

När är Merge Strategy inte lämplig?

Merge är inte lämplig för data där bearbetningshastighet är viktig (över 1000 konflikter per sekund), för strömmande data (loggar, händelser) och för fall där ändringar är fundamentalt inkompatibla (olika versioner av datamodell). I dessa fall kommer LWW eller CRDT att vara effektivare.

Hur implementerar jag Merge Strategy i en mobilapplikation?

Implementering omfattar tre steg: lagring av basversionen vid inläsning av data från servern, detektering av ändringar på fältnivå vid sparande och anrop av sammanslagningsalgoritmen vid synkronisering. För att förenkla, använd biblioteken JSON Patch eller CRDT.

Sammanfattning

  • Merge Strategy — konfliktlösningsstrategi som kombinerar ändringar från olika dataversioner, inte ersätter en version med en annan.
  • Tresammanslagning — den mest populära implementeringen, som använder bas-, lokal- och fjärrversioner för att avgöra ändrade fält.
  • Automatisk lösning — tillämpas för icke-motstridiga ändringar (olika fält, en av klienterna ändrade inte data).
  • Manuell lösning — nödvändig när samma fält ändras av två klienter, men minskar användarnöjdheten med 40%.
  • Fördel — minimal dataförlust och bättre användarupplevelse vid gemensamt arbete med dokument.
  • Nackdel — ökad implementeringskomplexitet och extra lagring av versionshistorik i den lokala databasen.
  • Rekommendation — använd Merge för profiler, dokument och konfigurationer. För metadata och loggar, använd LWW som ett enklare alternativ.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också