2012-04-30 15 views
9

Reddit sta attualmente migrando il suo database da PosgreSQL ad Apache Cassandra. Qualcuno sa quale schema di database usa Reddit in Cassandra?Qual è lo schema del database Cassandra utilizzato in Reddit?

+0

Non ce l'ho, e non sono sicuro che qualcuno al di fuori di Reddit lo faccia, ma dovrebbe davvero importare? Mi aspetto che alcune persone qui su SO possano aiutare a determinare lo schema che è giusto per * la tua * applicazione. –

+2

Reddit ha pubblicato il codice che alimenta il sito su GitHub: https://github.com/reddit/reddit. Potrei cercare nel codice e determinare lo schema da lì. Ma ho pensato che è più facile chiedere qui. –

+1

Ho dato un'occhiata al codice e vedo qualcosa come due dozzine di famiglie di colonne diverse che vengono create e utilizzate in modi diversi. C'è un'area in particolare di cui ti stai chiedendo, o stai cercando qualcosa come l'output di 'show schema' da cassandra-cli? –

risposta

-1

Inoltre non conosco lo schema esatto di Reddit, ma per ciò che si desidera archiviare, si è nel modo giusto, salvando una gerarchia di commenti in un database basato su documenti invece di un database relazionale. Raccomanderei di conservare un documento per ogni commento di root, quindi aggiungere tutti i bambini (e i figli dei bambini) a quel commento.

In CouchDB e MongoDB è possibile memorizzare direttamente i documenti JSON. In Cassandra salverei il JSON come una stringa. Quindi la struttura di dati sarebbe solo

root-comments 
{ 
    root-comment-id 
    root-comment-json-string 
} 

e ogni radice-commento-JSON-stringa sarebbe simile a questa:

{ 
comment : "hello world" 
answers : 
[ 
    { 
    comment : "reply to hello world" 
    answers : 
    [ 
     { 
     comment : "thanks for the good reply" 
     answers : [] 
     }, 
     { 
     comment : "yes that reply was indeed awesome" 
     answers : [] 
     } 

    ] 
    } 

] 
} 

inoltre si potrebbe desiderare di aggiungere un nome utente, ID utente, timestamp, .. .. ecc. alla struttura di ogni commento.

Questa struttura "denormalizzata" renderà le query molto veloci rispetto a una struttura relazionale normalizzata SE si dispone DI MOLTI dati.

In ogni caso dovrai occuparti di tutte le eccezioni, che possono accadere quando si implementa un sistema di questo tipo per una grande scala di utenti, ad es. Cosa succede se qualcuno risponde al commento A con il commento B, ma allo stesso tempo (o successivo) il commento A viene cancellato.

Se si cerca in Internet "cassandra hierarchical data" si trovano altri approcci, ma tutti tornano alla normalizzazione o non sono completi per una gerarchia 'infinita'.

+1

Il problema con l'approccio che descrivi è che ogni volta che viene aggiunto un nuovo commento, devi aggiornare il JSON, cioè analizzarlo, unire il commento e poi scriverlo a Cassandra. Immagina un albero con migliaia di commenti. Quindi questo approccio è più economico per il recupero, ma costoso durante l'aggiornamento. L'approccio relazionale è il contrario, costoso quando si recupera un albero dei commenti ed è economico quando si aggiorna. Penso che l'approccio migliore sia quello ibrido, memorizza i commenti più importanti mentre descrivi e quelli meno importanti in modo relazionale. –

+1

@ Calin-AndreiBurloiu Sì, vero. Sono a conoscenza del fatto che un simile sistema di commenti (come in reddit) ha molte più letture che aggiornamenti. Quindi la mia risposta è esattamente la soluzione corretta. –

+0

E la parsina del risultato può essere facilmente eseguita in JavaScript sul client, poiché è JSON. –

Problemi correlati