Come conservare post modifiche / istantanee come StackExchange?

0

Ho trovato alcune idee per la progettazione del database, ma non so se nessuna di esse sarebbe stata utile nella produzione:

  1. posts e una tabella post_edits separata con una copia di tutte le revisioni precedenti. Per ottenere un singolo post, è completamente trasparente come se la tabella post_edits non fosse presente. Niente di male in questo, ma sembra dilettante avere due tabelle quasi identiche e semplicemente copiare cose tra di loro in questo modo. Un vantaggio è che potresti immediatamente eliminare post_edits se hai mai avuto bisogno di farlo per qualche motivo.

  2. Singola tabella posts con tutto in una catena autoreferenziale. Per leggere un post, devi filtrare tutti i post con un certo slug o qualcosa del genere, quindi ordinare per data / ora più recente per trovare il post "reale". All'inizio pensavo che fosse un po 'intelligente, ma a pensarci due sembra davvero disordinato ... come faresti ad avere una lista di post effettivi, non ci sarebbe bisogno di essere una colonna in più solo per tenere traccia di quali sono "reali"? Spingere i post "reali" su ElasticSearch o tenerne traccia in Redis potrebbe risolvere questo problema, ma sarebbe complicato da gestire e le prestazioni non sarebbero ottimali.

  3. post_meta e una tabella post_data separata unita su di essa. Ogni volta che viene eseguita una revisione, viene aggiunta una nuova riga a post_data . Per ottenere un elenco di post: per ogni riga da post_meta , seleziona l'ultima riga di riferimento da post_data e unisciti a essa. In apparenza sembra più professionale di 1., ma sarebbe almeno 2 volte più lento, e non ne ricavate alcun vantaggio.

In che modo StackExchange lo implementa, come si presenta il design del database? Se usano diffs invece di memorizzare interi post, esiste un'implementazione python simile per codificare / decodificare tra due post e il loro diff?

    
posta dtgq 12.11.2017 - 18:57
fonte

1 risposta

2

Non so come faccia SE, ma il modo più semplice per avvicinarsi a questo sarebbe (IMHO):

  • Archivia il post iniziale in una tabella posts
  • Quando qualcuno apporta una modifica, crea una diff tra il nuovo post e il post originale (o versione precedente, se è stata modificata in precedenza).

    Cerca una libreria text-diff o google per un algoritmo "Longest Common Subsequence" se hai davvero un buon motivo per implementarlo da solo.

  • Salva il diff in una tabella post_edits (inclusa la data)

  • Quando qualcuno ha bisogno di vedere un post, carica il post originale e applica tutte le modifiche che sono state apportate (vedi "Event Sourcing") nell'ordine corretto.

Ecco come fanno alcuni sistemi SCM, come svn . In effetti, per la prototipazione, puoi archiviare i tuoi messaggi in file e usare git per gestirli. In seguito, probabilmente vorrai passare a un DB per prestazioni.

Se sei estremamente interessato alle prestazioni, puoi mantenere il post più recente nella tabella posts e ripristinare le modifiche memorizzate in posts_edits quando qualcuno vuole vedere una versione precedente.

Modifica : mi dispiace, in qualche modo ho trascurato la tua ultima frase. Non ho alcuna libreria Python per questo, ma a prima vista, difflib sembra promettente.

    
risposta data 23.11.2017 - 22:12
fonte

Leggi altre domande sui tag