In un database grafico, le connessioni tra i nodi sono chiamate edges e possono connettere due nodi qualsiasi da qualsiasi punto della tabella. I bordi definiscono le relazioni tra i nodi e possono avere tipi specifici. Ad esempio, due amici verrebbero collegati con un bordo “Amici”, ma un utente sarebbe connesso a un post con un bordo “Pubblicato” o “Mi piace”.
Cosa li rende più veloci? Non sono i database relazionali come MySQL non puòmemorizzare strutture simili a grafici, collegamenti come questi sono ancora concetti fondamentali per le tabelle SQL. I collegamenti formano connessioni tra tabelle, consentendo l’archiviazione e l’aggiornamento dei dati in tabelle separate mantenendo un collegamento altrove nel database, in modo molto simile a come funzionano i puntatori in C. Nell’esempio del social network, non vorrai memorizzare il nome di ogni amico che un determinato utente ha come quell’amico può cambiare il proprio nome, quindi memorizzi invece l’ID dell’amico ed esegui una ricerca ogni volta che hai bisogno dei dati giusti. Forse metti nella cache i risultati per caricare un po’ il database, ma la maggior parte dei sistemi funzionerà in modo simile a questo. Memorizzazione di un set di link (come una lista di amici) va bene, ma il problema arriva quando inizi a fare qualsiasi tipo di analisi complessa. L’esempio classico è la ricerca degli amici degli amici. Per ottenere un elenco di tutti coloro che hanno un amico in comune con una determinata persona, è necessario scorrere l’elenco di amici di tale persona, quindi scorrere l’elenco di amici di ogni amico, quindi eseguire una ricerca per ogni record. Devi anche assicurarti di non restituire record duplicati, il che è un ciclo extra.
Se” Se hai familiarità con la notazione Big O, potresti già vedere il problema qui. È un problema di complessità esponenziale; fare più cicli annidati come questo interrompe il computer molto rapidamente. Inoltre, non è un modo intelligente per risolvere questo problema. Dai un’occhiata a questo benchmark di neo4j che esegue gli amici -of-friends query, rispetto a un database relazionale tradizionale (come MySQL):
A profondità 2, è semplice query per entrambi i database. Alla profondità 3, MySQL diventa incapace di eseguire questa query in un normale lasso di tempo, prendendo 05 secondi per restituire una risposta. A suo merito, riesce a restituire la query di profondità 4 dopo 30 minuti, sebbene la profondità 5 blocchi il database.
Il database del grafico non ha problemi a restituire nessuna di queste query, con tutte le esecuzioni volte inferiore a 2 secondi, rendendolo migliaia di volte più veloce.
Come fa? Matematica molto complicata, per lo più. I grafici sono in fondo una struttura matematica e dietro c’è molta teoria, che non siamo assolutamente qualificati per discutere in dettaglio. Ma i grafici relazionali sono abbastanza semplici da capire visivamente, il che rende in pratica facile lavorare con i database di grafici.
Se vuoi ottenere iniziato a lavorare con uno, dovrai scegliere e installare un database grafico. Neo4j è gratuito e open source e un’opzione molto popolare. AWS ha il proprio database Neptune, che puoi provare gratuitamente, ma deve ospitare su AWS. Alcuni database multi-modello supportano i grafici come opzione, come Microsoft SQL Server, Oracle Database e ArangoDB.