Confronto tra database relazionali e database a grafo


90

Qualcuno può spiegarmi i vantaggi e gli svantaggi di un database di relazioni come MySQL rispetto a un database a grafo come Neo4j?

In SQL hai più tabelle con vari ID che le collegano. Quindi devi unirti per collegare i tavoli. Dal punto di vista di un principiante, perché dovresti progettare il database per richiedere un join piuttosto che avere le connessioni esplicite come bordi dall'inizio come con un database a grafo. Concettualmente non avrebbe senso per un principiante. Presumibilmente c'è una ragione molto tecnica ma non concettuale per questo?


I metodi di accesso sono diversi. In un database relazionale, utilizzi l' algebra relazionale , migliorata con la ricorsione, una rappresentazione scomoda ma popolare della quale è (ricorsiva, con extra procedurali) SQL. In un database di grafici, utilizzi linguaggi di attraversamento dei grafici come Gremlin . Le implementazioni di database sottostanti fino al layout su disco verrebbero scelte per fornire le migliori prestazioni per il rispettivo metodo di accesso e nelle implementazioni si possono trovare ottimizzazioni / variazioni arbitrarie.
David Tonhofer

Risposte:


115

In realtà c'è un ragionamento concettuale dietro entrambi gli stili. Wikipedia sul modello relazionale e sui database a grafo fornisce una buona panoramica di questo.

La differenza principale è che in un database a grafo le relazioni vengono memorizzate a livello di record individuale, mentre in un database relazionale la struttura è definita a un livello superiore (le definizioni di tabella).

Ciò ha importanti ramificazioni:

  • Un database relazionale è molto più veloce quando si opera su un numero enorme di record. In un database a grafo, ogni record deve essere esaminato individualmente durante una query per determinare la struttura dei dati, mentre questo è noto in anticipo in un database relazionale.
  • I database relazionali utilizzano meno spazio di archiviazione, perché non devono archiviare tutte queste relazioni.

Memorizzare tutte le relazioni a livello di record individuale ha senso solo se ci saranno molte variazioni nelle relazioni; altrimenti stai semplicemente duplicando le stesse cose più e più volte. Ciò significa che i database a grafo sono adatti a strutture irregolari e complesse. Ma nel mondo reale, la maggior parte dei database richiede strutture regolari e relativamente semplici. Questo è il motivo per cui predominano i database relazionali.


16
La memorizzazione delle relazioni a livello di record ha senso anche in altri casi, poiché fornisce adiacenze prive di indice. In altre parole, è possibile eseguire attraversamenti del grafico senza ricerche di indice che portano a prestazioni molto migliori. E non è una duplicazione, poiché memorizzi le relazioni effettive, che differiscono.
nawroth

4
Dite: "In un database a grafo, ogni record deve essere esaminato individualmente durante una query per determinare la struttura dei dati". Questa è una proprietà universale dei database a grafo o più o meno vera in generale? Che ne dici di OrientDb che supporta lo schema completo per vertici e bordi?
Lodewijk Bogaards

@LodewijkBogaard alcuni database a grafo, come Neo4j, consentono l'indicizzazione di base. Se la query raggiunge gli indici, credo che non sia necessario determinare la struttura dei dati dietro l'indice. Ma dipende dalla query.
Vojtěch Vít

3
Sono assolutamente in disaccordo su entrambi i punti. Il database del grafico è sempre più veloce quando sono presenti chiavi esterne. Perché non abbiamo bisogno di operazioni di join. I database relazionali devono memorizzare la chiave esterna in molte tabelle. Un bordo e una chiave esterna dovrebbero occupare lo stesso spazio di archiviazione.
cegprakash

3
@cegprakash Hai anche una documentazione dalla quale possiamo concludere lo stesso?
Victor

102

La differenza fondamentale tra un grafico e un database relazionale è che i database relazionali funzionano con gli insiemi mentre i database grafici funzionano con i percorsi.

Questo si manifesta in modi inaspettati e inutili per un utente RDBMS. Ad esempio, quando si tenta di emulare operazioni sui percorsi (ad esempio amici di amici) unendosi in modo ricorsivo a un database relazionale, la latenza delle query cresce in modo imprevedibile e massiccio così come l'utilizzo della memoria, per non parlare del fatto che tortura SQL per esprimere quel tipo di operazioni. Più dati significa più lento in un database basato su set, anche se puoi ritardare il problema attraverso un'indicizzazione giudiziosa.

Come ha accennato Dan1111, la maggior parte dei database a grafo non soffre di questo tipo di join pain perché esprimono relazioni a un livello fondamentale. Cioè, le relazioni esistono fisicamente sul disco e sono denominate, dirette e possono essere esse stesse decorate con proprietà (questo è chiamato il modello del grafico delle proprietà, vedere: https://github.com/tinkerpop/blueprints/wiki/Property-Graph -Modello ). Ciò significa che, se lo si sceglie, è possibile esaminare le relazioni sul disco e vedere come "uniscono" le entità. Le relazioni sono quindi entità di prima classe in un database a grafo e sono semanticamente molto più forti di quelle relazioni implicite reificate in fase di esecuzione in un archivio relazionale.

Allora perché dovrebbe interessarti? Per due ragioni:

  1. I database a grafo sono molto più veloci dei database relazionali per i dati connessi, un punto di forza del modello sottostante. Una conseguenza di ciò è che la latenza della query in un database di grafici è proporzionale alla quantità di grafico che si sceglie di esplorare in una query e non è proporzionale alla quantità di dati memorizzati, disinnescando così la bomba di join .
  2. I database di grafici rendono la modellazione e l'interrogazione molto più piacevoli, il che significa uno sviluppo più veloce e meno momenti WTF. Ad esempio, esprimere l'amico di un amico per un tipico social network nel linguaggio di query Cypher di Neo4j è giusto MATCH (me)-[:FRIEND]->()-[:FRIEND]->(foaf) RETURN foaf.

3
"Le relazioni sono quindi entità di prima classe in un database a grafo". Lo stesso vale in genere in un database relazionale: le entità vengono mappate su tuple nelle relazioni, così come le relazioni molti-molti. La distinzione che descrivi per le relazioni uno-molti, che sono spesso fuse in relazioni di entità?
beldaz

52
Questo confronto sembra un po 'parziale. E gli svantaggi?
Kurren

9
Un po? Troppo di parte secondo la mia onesta opinione. Nella migliore delle ipotesi, mi sembra un annuncio "Questo è un buon prodotto! Compra questo"!
ilgaar

37
Questo richiede un enorme avvertimento: questo ragazzo è il "capo scienziato" di Neo Technology, che crea il database dei grafici Neo4J.
Rob Grant,

4
Che ne dici di una ricerca arbitraria ... dammi tutti gli utenti tra i 35 ei 55 anni e hanno fatto acquisti da Walmart negli ultimi 90 giorni.
Matthew Whited

20

Dan1111 ha già fornito una risposta contrassegnata come corretta. Vale la pena notare di sfuggita un paio di punti aggiuntivi.

Innanzitutto, in quasi tutte le implementazioni di database a grafo, i record vengono "bloccati" perché esiste un numero sconosciuto di puntatori che puntano al record nella sua posizione corrente. Ciò significa che un record non può essere spostato in una nuova posizione senza lasciare un indirizzo di inoltro nella vecchia posizione o interrompere un numero sconosciuto di puntatori.

Teoricamente, si potrebbero mescolare tutti i record contemporaneamente e trovare un modo per individuare e riparare tutti i puntatori. In pratica si tratta di un'operazione che potrebbe richiedere settimane su un database di grandi dimensioni, durante le quali il database dovrebbe essere spento. Semplicemente non è fattibile.

Al contrario, in un database relazionale, i record possono essere rimescolati su una scala abbastanza ampia e l'unica cosa che deve essere fatta è ricostruire tutti gli indici che sono stati interessati. Questa è un'operazione abbastanza grande, ma neanche lontanamente grande come l'equivalente di un database a grafo.

Il secondo punto degno di nota è che il world wide web può essere visto come un gigantesco database a grafo. Le pagine Web contengono collegamenti ipertestuali e riferimenti a collegamenti ipertestuali, tra le altre cose, altre pagine Web. Il riferimento avviene tramite URL, che funzionano come puntatori.

Quando una pagina Web viene spostata su un URL diverso senza lasciare un indirizzo di inoltro al vecchio URL, un numero sconosciuto di collegamenti ipertestuali verrà interrotto. Questi collegamenti interrotti danno quindi origine al temuto messaggio "Errore 404: pagina non trovata" che interrompe il piacere di tanti navigatori.


4
Solo che la maggior parte dei database a grafo ha regole di integrità che non consentono collegamenti interrotti.
Michael Hunger

1
Se il DBMS blocca il target, ciò ovviamente eviterà la rottura del collegamento a causa dello spostamento del target del collegamento. Non conosco database a grafo che non appuntino record che potrebbero essere obiettivi di collegamenti.
Walter Mitty

I database a grafo sono generalmente privi di schema perché una modifica dello schema sarebbe un'operazione molto pesante a causa della necessità di riscrivere tutti i puntatori? Il problema del rimescolamento non può essere aggirato semplicemente memorizzando i puntatori virtuali, che passano attraverso una tabella di ricerca? Questo funzionerebbe ancora a O (1), giusto?
Lodewijk Bogaards

Ho operato con una definizione di database a grafo che includerebbe database pre-relazionali come quelli gerarchici o di rete. Alcuni di questi database avevano schemi, anche se non schemi relazionali. Non sono sicuro che la mia definizione operativa sia d'accordo o meno con la definizione standard.
Walter Mitty

Una struttura dati che fornisce una mappatura tra puntatori virtuali e puntatori fisici è essenzialmente la stessa cosa di un indice, con circa gli stessi costi. Potresti anche andare avanti e utilizzare un database relazionale.
Walter Mitty

7

Con un database relazionale possiamo modellare e interrogare un grafico utilizzando chiavi esterne e auto-join. Solo perché RDBMS contiene la parola relazionale non significa che siano bravi a gestire le relazioni. La parola relazionale in RDBMS deriva dall'algebra relazionale e non dalla relazione. In un RDBMS, la relazione stessa non esiste come oggetto a sé stante. Deve essere rappresentato esplicitamente come chiave esterna o implicitamente come valore in una tabella di collegamento (quando si utilizza un approccio di modellazione generico / universale). I collegamenti tra i set di dati vengono memorizzati nei dati stessi.

Più aumentiamo la profondità di ricerca in un database relazionale, più auto-join dobbiamo eseguire e più ne risentono le prestazioni delle query. Più in profondità andiamo nella nostra gerarchia, più tabelle dobbiamo unire e più lenta diventa la nostra query. Matematicamente il costo cresce in modo esponenziale in un database relazionale. In altre parole, più complesse sono le nostre query e relazioni, più beneficiamo di un grafico rispetto a un database relazionale. Non abbiamo problemi di prestazioni in un database di grafici durante la navigazione nel grafico. Questo perché un database a grafo memorizza le relazioni come oggetti separati. Tuttavia, le prestazioni di lettura superiori vengono a scapito di scritture più lente.

In alcune situazioni è più facile cambiare il modello di dati in un database a grafo che in un RDBMS, ad esempio in un RDBMS se cambio una relazione di tabella da 1: ne m: n devo applicare DDL con potenziali tempi di inattività.

RDBMS ha invece vantaggi in altre aree, ad esempio aggregando i dati o effettuando il controllo della versione timestamp sui dati.

Discuto alcuni degli altri pro e contro nel mio post sul blog database a grafo per il data warehousing


4

Mentre il modello relazionale può facilmente rappresentare i dati contenuti in un modello grafico, nella pratica dobbiamo affrontare due problemi significativi:

  1. SQL non ha la sintassi per eseguire facilmente l'attraversamento del grafico, specialmente gli attraversamenti in cui la profondità è sconosciuta o illimitata. Ad esempio, usare SQL per determinare gli amici dei tuoi amici è abbastanza facile, ma è difficile risolvere il problema dei "gradi di separazione".
  2. Le prestazioni peggiorano rapidamente mentre attraversiamo il grafico. Ogni livello di attraversamento aumenta notevolmente il tempo di risposta alle query.

Riferimento: database di nuova generazione


0

Vale la pena indagare sui database a grafo per i casi d'uso in cui eccellono, ma ho avuto qualche motivo per mettere in discussione alcune affermazioni nelle risposte sopra. In particolare:

Un database relazionale è molto più veloce quando si opera su un numero enorme di record (primo punto elenco di dan1111)

I database a grafo sono molto più veloci dei database relazionali per i dati connessi, un punto di forza del modello sottostante. Una conseguenza di ciò è che la latenza della query in un database a grafo è proporzionale a quanto del grafico si sceglie di esplorare in una query e non è proporzionale alla quantità di dati memorizzati, disinnescando così la bomba di join. (Primo punto elenco di Jim Webber)

In altre parole, più complesse sono le nostre query e relazioni, più beneficiamo di un grafico rispetto a un database relazionale. (2 ° paragrafo di Uli Bethke)

Sebbene queste affermazioni possano avere valore, devo ancora trovare un modo per far sì che il mio caso d'uso specifico si allinei con esse. Riferimento: Database grafico o Database relazionale Estensioni di tabelle comuni: confronto delle prestazioni delle query di grafi aciclici

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.