Ho trovato alcune idee per la progettazione del database, ma non so se nessuna di esse sarebbe stata utile nella produzione:
-
posts
e una tabellapost_edits
separata con una copia di tutte le revisioni precedenti. Per ottenere un singolo post, è completamente trasparente come se la tabellapost_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 eliminarepost_edits
se hai mai avuto bisogno di farlo per qualche motivo. -
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. -
post_meta
e una tabellapost_data
separata unita su di essa. Ogni volta che viene eseguita una revisione, viene aggiunta una nuova riga apost_data
. Per ottenere un elenco di post: per ogni riga dapost_meta
, seleziona l'ultima riga di riferimento dapost_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?