sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan opbevarer du redigeringshistorikken for stort strengfelt i relationsdatabasen

En løsning, jeg arbejder på lige nu, som fungerer godt indtil videre, implementerer det design, jeg foreslog i spørgsmålet

Jeg vil dele detaljerne om min implementering her

Til at oprette deltaer og bruge til at rekonstruere fuldteksten bruger jeg den fantastiske google-diff-match-patch library . Du kan læse den agnostiske implementerings API-dokumentation for bedre at forstå kodeeksemplerne nedenfor, selvom det alligevel er ret læseligt.

google-diff-match-patch har Java og JS implementeringer, så jeg kan bruge det til at beregne deltaerne med Java på serveren. Jeg valgte at konvertere hver delta til en streng begge, så den nemt kan gemmes i databasen og nemt forbruges af JS-biblioteket på klienten. Mere om dette nedenfor.

public String getBackwardsDelta(String editedBlogPost, String existingBlogPost) {
    diff_match_patch dmp = new diff_match_patch();
    LinkedList<diff_match_patch.Patch> patches = 
        dmp.patch_make(editedBlogPost, existingBlogPost);
    return dmp.patch_toText(patches);
}

NB noget, det tog mig et stykke tid at finde ud af, var, hvordan man fjerner den officielle build af google-diff-match-patch ved hjælp af maven. Det er ikke i mavens centrale repo, men på deres egen repo på googlecode.com. Bare for at bemærke, nogle mennesker har gaflet det og lagt deres gaflede versioner i maven central, men hvis du virkelig vil have den officielle version, kan du få ved at tilføje repoen og afhængigheden i din pom.xml som følger

<repository>
  <id>google-diff-patch-match</id>
  <name>google-diff-patch-match</name>
  <url>https://google-diff-match-patch.googlecode.com/svn/trunk/maven/</url>
</repository>

<dependency>
  <groupId>diff_match_patch</groupId>
  <artifactId>diff_match_patch</artifactId>
  <version>current</version>
</dependency>

Til frontend sender jeg det seneste blogindlæg i fuld tekst sammen med en kæde af deltaer, der går baglæns i tid, der repræsenterer hver redigering, og rekonstruerer derefter den fulde tekst af hver version i browseren i JS.

For at få biblioteket bruger jeg npm + browserify. Biblioteket er tilgængeligt på npm som diff-match-patch . Version 1.0.0 er den eneste version.

getTextFromDelta: function(originalText, delta) {
  var DMP = require('diff-match-patch'); // get the constructor function
  var dmp = new DMP();
  var patches = dmp.patch_fromText(delta);
  return dmp.patch_apply(patches, originalText)[0];
}

Og det er det, det fungerer fantastisk.

Med hensyn til at gemme redigeringerne af blogindlæggene bruger jeg bare en tabel BLOG_POST_EDITS hvor jeg gemmer blogindlægs-id'et, et tidsstempel for hvornår redigeringen blev foretaget (som jeg senere bruger til at bestille redigeringerne korrekt for at lave kæden ved rekonstruering af fuldtekstversionerne på klienten) og baglæns deltaet mellem den aktuelle live blogindlæg i BLOG_POST tabel, og den indkommende redigerede version af blogindlægget.

Jeg valgte at gemme en 'kæde' af delta'er, fordi det passer godt til min use case, og det er mere simpelt i serverkoden. Det betyder, at for at rekonstruere version M af N, er jeg nødt til at sende klienten en kæde af N-(M-1) deltaer tilbage fra live-blogindlægget i fuld tekst til version M. Men i mit tilfælde er jeg tilfældigvis ønsker at sende hele kæden hver gang, alligevel, så det er fint.

For en lidt bedre over-the-wire effektivitet for at anmode om specifikke versioner, kunne alle delta'er genberegnes fra den nye redigerede blogindlægsversion tilbage til hver (gendannet) version, hver gang der foretages en redigering, men dette ville betyde mere arbejde og kompleksitet på server.



  1. MySql Connector EF6

  2. hvordan forespørges jointabellen ved hjælp af dvale?

  3. SQL:slet alle data fra alle tilgængelige tabeller

  4. Trin-for-trin-procedure til at migrere data fra Excel til MySql-databasetabel