2010-05-18 6 views
19

Il co-fondatore di Reddit ha presentato una presentazione sui problemi riscontrati durante il ridimensionamento a milioni di utenti. È disponibile un riepilogo here.Database con "schema aperto" - Idea buona o cattiva?

Ciò che mi ha sorpreso è il punto 3:

Al contrario, essi mantengono una tabella cosa e una tabella di dati. Tutto in Reddit è una cosa: utenti, link, commenti, subreddit, premi, ecc. Le cose mantengono attributi comuni come voti alti/bassi, un tipo e data di creazione. La tabella Dati ha tre colonne: cosa id, chiave, valore. C'è una riga per ogni attributo. C'è una riga per titolo, url, autore, voti spam, ecc. Quando aggiungono nuove funzionalità non devono più preoccuparsi del database. Non hanno dovuto aggiungere nuovi tavoli per nuove cose o preoccuparsi degli aggiornamenti.

Questa mi sembra una pessima idea, ma sembra aver funzionato per Reddit. È una buona idea in generale, però? O è una peculiarità di Reddit che è successo a lavorare per loro?

risposta

16

Questo è un modello di dati noto come EAV per valore attributo entità. Ha i suoi usi. Un primo esempio sono i dati dei test dei pazienti che sono naturalmente sparsi in quanto vi sono centinaia di migliaia di test che possono essere eseguiti, ma in genere solo una manciata è presente per un paziente. Una tabella con centinaia di migliaia di colonne è stupida, ma una tabella con EAV ha senso.

7

Ho notato che non hanno menzionato nulla sulla facilità o difficoltà nella creazione di rapporti su tali dati. Se utilizzato in un ristretto insieme di circostanze, l'EAV può essere utile. Essendo una parte centrale della maggior parte dei sistemi, diventerà un incubo quando si colpiranno i rapporti. Il problema con gli EAV è che la maggior parte del beneficio è all'inizio del progetto e la maggior parte del dolore è più tardi nell'analisi e nella segnalazione soprattutto a causa della grave mancanza di integrità dei dati. "Non dovermi preoccupare delle chiavi straniere" per me sembra un incubo di file orfani. Aggiungi l'uso delle chiavi surrogate per tutto e hai una palude intricata che generalmente termina con una riscrittura completa

+0

In realtà nel discorso Huffman parla di creare report e come lo fanno esportando un gruppo di dati in un file di testo e analizzandolo altrove https://vimeo.com/10506751 m24: 50 –

+0

Reddit ha pochi o nessuno requisiti di integrità dei dati. Non è come se stessero memorizzando valori di date o interi che devono essere compresi tra determinati intervalli o avere regole aziendali complicate. La correttezza dei dati non è molto importante per un sito come reddit; deve solo essere per lo più corretto. Tuttavia, le app LOB non sono così tolleranti rispetto all'inesattezza. Il design di Reddit è focalizzato sull'acquisizione dei dati non sulla correttezza. Tuttavia, la cosa sulla correttezza è che quando ci si preoccupa di farlo, è eccessivamente costoso non affrontarlo in anticipo. – Thomas

8

La maggior parte dei siti Web di grandi dimensioni finiscono per utilizzare una sorta di incredibilmente semplice sul lato del database delle cose. Questo ha il vantaggio che è veloce e scalabile. Ha lo svantaggio che tutte le relazioni che si otterrebbero il database imporre automaticamente (tramite trigger e simili) è necessario per imporre il proprio codice client invece. Mantenere la coerenza è un dolore al collo, e c'è quasi sempre qualche possibilità che i dati siano incoerenti, almeno per brevi periodi di tempo.

Per un sito di social networking, è un compromesso utile. I dati per lo più giusti per la maggior parte del tempo sono adeguati (ad esempio, a chi importa davvero se il numero di voti positivi ricevuti per un articolo è veramente scaduto di 20 millisecondi quando viene inviato) e mantenendo i costi ragionevoli durante il ridimensionamento per supportare un gazillion gli utenti contano molto.