Domanda

Ho usato molto DB relazionali e ho deciso di avventurarmi su altri tipi disponibili.

Questo particolare prodotto sembra buono e promettente: http://neo4j.org/

Qualcuno ha usato database basati su grafici? Quali sono i pro ei contro da una prospettiva di usabilità?

Li hai usati in un ambiente di produzione? Qual è stato il requisito che ti ha spinto a usarli?

È stato utile?

Soluzione

Ho usato un database grafico in un precedente lavoro. Non stavamo usando Neo4j, era una cosa interna costruita su Berkeley DB, ma era simile. È stato usato in produzione (lo è ancora).

La ragione per cui abbiamo usato un database di grafi era che i dati archiviati dal sistema e le operazioni che il sistema stava facendo con i dati erano esattamente il punto debole dei database relazionali ed erano esattamente il punto forte dei database di grafi. Il sistema doveva archiviare raccolte di oggetti privi di uno schema fisso e collegati tra loro da relazioni. Per ragionare sui dati, il sistema doveva fare molte operazioni che sarebbero state un paio di traversate in un database di grafi, ma che sarebbero query piuttosto complesse in SQL.

I principali vantaggi del modello grafico sono stati il ??rapido tempo di sviluppo e la flessibilità. Potremmo aggiungere rapidamente nuove funzionalità senza influire sulle distribuzioni esistenti. Se un potenziale cliente volesse importare alcuni dei propri dati e innestarli sul nostro modello, di solito potrebbe essere fatto sul posto dal rappresentante di vendita. La flessibilità ha aiutato anche durante la progettazione di una nuova funzionalità, salvandoci dal tentativo di comprimere nuovi dati in un modello di dati rigido.

Avere uno strano database ci permette di costruire molte altre nostre strane tecnologie, dandoci un sacco di segreti per distinguere il nostro prodotto da quelli dei nostri concorrenti.

Lo svantaggio principale era che non stavamo usando la tecnologia standard di database relazionale, che può essere un problema quando i tuoi clienti sono enterprise. I nostri clienti si chiederebbero perché non potremmo semplicemente ospitare i nostri dati sui loro giganteschi cluster Oracle (i nostri clienti di solito avevano grandi data center). Uno dei team ha effettivamente riscritto il livello del database per utilizzare Oracle (o PostgreSQL o MySQL), ma era leggermente più lento dell'originale. Almeno una grande impresa aveva anche una politica solo Oracle, ma fortunatamente Oracle acquistò Berkeley DB. Dovevamo anche scrivere molti strumenti extra, ad esempio non potevamo usare Crystal Reports.

L'altro svantaggio del nostro database di grafi era che lo abbiamo creato da soli, il che significa che quando abbiamo riscontrato un problema (di solito con scalabilità) abbiamo dovuto risolverlo da soli. Se avessimo utilizzato un database relazionale, il fornitore avrebbe già risolto il problema dieci anni fa.

Se stai costruendo un prodotto per clienti aziendali e i tuoi dati si adattano al modello relazionale, se puoi puoi utilizzare un database relazionale. Se l'applicazione non si adatta al modello relazionale ma si adatta al modello grafico, utilizzare un database grafico. Se si adatta solo a qualcos'altro, usalo.

Se la tua applicazione non ha bisogno di adattarsi all'attuale architettura blub, usa un database grafico, o CouchDB, o BigTable, o qualunque cosa sia adatta alla tua app e pensi che sia interessante. Potrebbe darti un vantaggio ed è divertente provare cose nuove.

Qualunque cosa tu abbia scelto, cerca di non creare tu stesso il motore di database a meno che non ti piaccia davvero costruire motori di database.

Altri suggerimenti

Lavoriamo con il team Neo da oltre un anno e siamo stati molto felici. Modelliamo artefatti accademici e le loro relazioni, che sono perfetti per un grafico db, ed eseguiamo algoritmi di raccomandazione sulla rete.

Se stai già lavorando in Java, penso che la modellazione usando Neo4j sia molto semplice e abbia le prestazioni più piatte / veloci per R / W di qualsiasi altra soluzione che abbiamo provato.

Ad essere sincero, ho difficoltà a non pensare in termini di un grafico / rete perché è molto più facile che progettare strutture di tabelle contorte per contenere proprietà e relazioni degli oggetti.

Detto questo, archiviamo alcune informazioni in MySQL semplicemente perché è più facile per il lato Business eseguire veloci query SQL. Per eseguire le stesse funzioni con Neo avremmo bisogno di scrivere codice che semplicemente non abbiamo la larghezza di banda per ora. Non appena lo facciamo, sto trasferendo tutti quei dati su Neo!

Buona fortuna.

Due punti:

In primo luogo, sui dati con cui ho lavorato negli ultimi 5 anni in SQL Server, ho recentemente colpito il muro della scalabilità con SQL per il tipo di query che dobbiamo eseguire (relazioni annidate ... sai. ..graphs). Ho giocato con neo4j e i miei tempi di ricerca sono più veloci di molti ordini di grandezza quando ho bisogno di questo tipo di ricerca.

In secondo luogo, al punto che i database dei grafici sono obsoleti. Um ... no. All'inizio, mentre le persone cercavano di capire come archiviare e cercare i dati in modo efficiente, hanno creato e giocato con modelli di database in stile grafico e di rete. Questi sono stati progettati in modo che il modello fisico riflettesse il modello logico, quindi la loro efficienza non era eccezionale. Questo tipo di struttura di dati era buono per i dati semi-strutturati, ma non altrettanto buono per i dati densi strutturati. Quindi, questo tizio IBM di nome Codd stava cercando modi efficienti per organizzare e archiviare dati strutturati e ha avuto l'idea per il modello di database relazionale. Ed è stato bello e la gente era felice.

Che cosa abbiamo qui? Due strumenti per due scopi diversi. I modelli di database grafici sono ottimi per rappresentare dati semi-strutturati e le relazioni tra entità (che possono o meno esistere). I database relazionali sono utili per i dati strutturati che hanno uno schema molto statico e in cui le profondità di join non vanno molto in profondità. Uno è buono per un tipo di dati, l'altro è buono per altri tipi di dati.

Per coniare la frase, non esiste un proiettile d'argento. È lungimirante affermare che i modelli di database dei grafi non sono aggiornati e utilizzarne uno lascia perdere 40 anni di progressi. È come dire che usare C significa rinunciare a tutti i progressi tecnologici che abbiamo fatto per ottenere cose come Java e C #. Questo non è vero però. C è uno strumento necessario per alcune attività. E Java è uno strumento per altre attività.

Uso MySQL da anni per gestire i dati di ingegneria, e ha funzionato bene, ma uno dei problemi che abbiamo avuto (ma non ci siamo resi conto che era) era che dovevamo sempre pianificare lo schema in anticipo. Un altro problema che sapevamo di avere era mappare i dati su oggetti di dominio e viceversa.

Ora abbiamo appena iniziato a provare neo4j e sembra che stia risolvendo entrambi i problemi per noi. La possibilità di aggiungere proprietà diverse a ciascun nodo (e relazione) ci ha permesso di ripensare il nostro intero approccio ai dati. È come i linguaggi dinamici contro quelli statici (Ruby contro Java), ma per i database. La creazione del modello di dati nel database può essere eseguita in modo molto più agile e dinamico e ciò semplifica notevolmente il nostro codice.

E poiché il modello a oggetti nel codice è generalmente una struttura grafica, anche la mappatura dal database è più semplice, con meno codice e di conseguenza meno bug.

E come bonus aggiuntivo, il nostro codice prototipo iniziale per il caricamento dei nostri dati in neo4j sta effettivamente funzionando più velocemente della precedente versione di MySQL. Non ho numeri solidi su questo (ancora), ma quella era una bella caratteristica aggiuntiva.

Ma alla fine, la scelta dovrebbe probabilmente basarsi principalmente sulla natura del tuo modello di dominio. Si associa meglio a tabelle o grafici? Decidi facendo alcuni prototipi, carica i dati e gioca con esso. Usa neoclipse per guardare diverse viste dei dati. Dopo averlo fatto, spero che tu sappia se sei bravo o no.

Sto costruendo una intranet nella mia azienda.

Sono interessato a capire come caricare i dati memorizzati nelle tabelle (Oracle, MySQL, SQL Server, Excel, Access, vari elenchi casuali) e caricarli in Neo4J o in qualche altro database grafico. In particolare, cosa succede quando i dati comuni si sovrappongono ai dati esistenti già nel sistema.

Sì, so che alcuni dati sono meglio modellati in RDBMS, ma ho questa idea che mi prude, che quando è necessario sovrapporre più tabelle distinte, il modello grafico è migliore della struttura della tabella.

Ad esempio, lavoro in un ambiente di produzione. C'è un grande progetto su cui stiamo lavorando e, data la complessità, ogni dipartimento ha creato un foglio di calcolo Excel separato che ha un BOM (distinta materiali) gerarchia in una colonna a sinistra e poi diverse colonne di note e controlli effettuati da persone che hanno realizzato questi fogli.

Quindi uno dei problemi è l'unione di tutte queste note in una "vista" in modo che qualcuno possa vedere tutti i problemi che devono essere affrontati in qualsiasi parte particolare.

Il secondo problema è che un foglio di calcolo Excel fa schifo nel rappresentare una DBA gerarchica quando un componente comune viene utilizzato in più di un sottoassieme. Ciò significa che, se qualcuno scrive una nota sul relè P34 nel sottoassieme di accensione, lo stesso commento dovrebbe essere associato ai relè P34 utilizzati nel sottoassieme del driver del motore. Ciò non si verificherà nel foglio di calcolo Excel.

Per la intranet aziendale, voglio essere in grado di cercare qualsiasi cosa facilmente. Come i dati relativi a un numero di parte, una struttura DBA, un numero di telefono, un indirizzo e-mail, una politica aziendale o una procedura. Voglio anche estenderlo per gestire le risorse hardware del computer e il software installato.

Immagino che una volta che la rete di informazione inizia a popolarsi, puoi iniziare a fare interessanti spostamenti come "voglio scrivere una e-mail a tutti coloro che lavorano al progetto XYZ". Le persone saranno state associate al progetto perché saranno taggate come creazione e modifica dei dati all'interno del progetto XYZ. Quindi, usando il progetto XYZ come chiave di ricerca, verrà creato un set enorme con tutto ciò che riguarda il progetto XYZ. Compresi collegamenti a persone che hanno realizzato il progetto XYZ. I collegamenti persone si collegheranno ai loro indirizzi e-mail. Quindi, grazie al loro coinvolgimento nel progetto XYZ, saranno inclusi nella mia e-mail. Ciò è in netto contrasto con alcuni segretari che cercano di mantenere un elenco di persone che lavorano al progetto. Generiamo molte liste. Dedichiamo molto tempo alla manutenzione degli elenchi e alla verifica che siano aggiornati. E la maggior parte non aggiunge alcun valore ai nostri prodotti.

Un altro fantastico attraversamento potrebbe riportare tutti i computer su cui è installato un determinato software, in base alla versione. Tale rapporto potrebbe essere utilizzato per generare attività per rimuovere copie extra di vecchi software e per aggiornare le persone che devono disporre della copia più recente. Sarebbe utile anche per il tracciamento della licenza.

Ecco un buon articolo che parla delle esigenze che i database non relazionali soddisfano: http://www.readwriteweb.com/enterprise/2009/02/is-the-relational-database-doomed.php

Fa un buon lavoro nel sottolineare (a parte il nome) che i database relazionali non sono imperfetti o sbagliati, è solo che in questi giorni le persone stanno iniziando a elaborare sempre più dati nei software e nei siti Web tradizionali e che i database relazionali non si adatta a queste esigenze.

potrebbe essere un po 'in ritardo, ma c'è un numero crescente di progetti che utilizzano Neo4j, i più noti elencati in Neo4j . Anche NeoTechnology, la società dietro Neo4j, ha alcuni riferimenti su la pagina dei loro clienti

Nota: faccio parte del team Neo4j

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top