Domanda

Buone notizie! Dalla versione 4.8 BerkeleyDB ha c interfaccia #. BerkeleyDB è una cosa molto interessante per me a causa della sua non-SQL natura. Lo so che è un ottimo strumento se qualcuno vuole memorizzare un sacco di coppie chiave / valore. E so di tavoli 'attaccabili. Quello che non so è come memorizzare dati gerarchici con BerkeleyDB. E 'adatto a questo in generale?

Quello che voglio fare? Voglio per memorizzare i dati di dmoz.org. Ora ho tutti i rdfs thous importati a MySQL db. Ma non ho bisogno di stored procedure o altre funzioni complesse. Voglio usare BerkeleyDB come archivio dati per il mio lettore RSS on-line. Quindi c'è feed in un albero categoria (come ho detto le categorie che ho importato da dmoz e ho un sacco di loro, così come feed -. Milioni). E ... Ho dimenticato di elementi del feed. Voglio conservare anche loro con BerkleyDB :-).

E 'sembrare che ho da implementare manualmente tutti i rapporti ,,, E' ok ... Ma la cosa più importante che ho chiedendo è la velocità. Will (Can) la mia soluzione con BerkeleyDB essere più veloce poi uno basato su MySQL (o su qualsiasi RDBMS in generale)?

È stato utile?

Soluzione

E 'adatto per questo, ma può essere più lavoro di quanto si è disposti a mettere in. BerkeleyDB è un negozio molto generale chiave / valore, quindi tutto quello che fai è dire "per la chiave X, memorizzare il valore Y". In seguito si può dire "dammi il valore della chiave X" e vi darà indietro Y. Questo è davvero tutto ciò che fa da un livello elevato. Esso ha caratteristiche molto robusti per garantire importanti proprietà di affidabilità (chiamato acido, per Atomicità, Consistenza, Isolamento e durevolezza), e ha grandi prestazioni, ma dal punto di vista del programmatore, è una semplice struttura di mappa.

Quindi sì, è possibile memorizzare alberi, ma avresti bisogno di decidere su una buona rappresentazione per loro. Si può andare per chiavi intere (accertarsi che siano memorizzati in ordine di byte big-endian perché BDB utilizza ordinamento lessicografico sui tasti) e semplicemente avere una struttura come il valore che contiene un elenco di numeri interi per i bambini. Si dovrà ancora scrivere tutti i vostri algoritmi di attraversamento a mano, però. Senza sapere che cosa esigenze che avete per i vostri dati gerarchici, però, è difficile dare un suggerimento più concreto.

speedwise, per quello che fa Berkeley DB probabilmente non può ottenere molto più veloce (vale a dire, non troverete molto là fuori che è più veloce, soprattutto se si è disposti a sacrificare alcune delle proprietà ACID). Ti dà il controllo quasi completo sul vostro interfaccia per la mappa, quindi in teoria si potrebbe forse creare una struttura altamente ottimizzata per il vostro particolare caso d'uso. Tuttavia, data l'interfaccia di basso livello, si unisce se si sta attuazione, le query di filtro complesse, o qualsiasi tipo di linguaggio di query non banale su di esso, dovrete scrivere del codice molto veloce e gli algoritmi per tenere il passo con la grande database relazionali là fuori.

Se i dati possono essere modellati da XML (EuGH, ma so che alcune persone piace), v'è un database esistente costruito sulla cima di BDB BDB chiamato XML (anche da Sleepycat, ora parte di Oracle). Questo consente di memorizzare i documenti XML arbitrari nel database, e di eseguire XPath e XQuery query veloci sul database. Non credo che ci sia un'API .NET ufficiale per questo ancora, ma sono abbastanza sicuro che ho incontrato un .NET non ufficiale di legame ad esso.

In generale, a meno che non si dispone di alcuni requisiti molto particolari che le soluzioni esistenti là fuori non consentono (questo non sembra essere il caso con il vostro scenario), vorrei consigliare contro rotolare il proprio database (anche costruito in cima di BDB) a meno che non sei molto abile con algoritmi efficienti e ottimizzazione del codice. Se sei memorizzare RDF triplica, ci sono banche dati dedicati per questo, e anche i database relazionali non sono particolarmente inadatto per loro. BDB XML è ancora una valida soluzione anche per questo. E 'in ultima analisi, la vostra scelta, ma se fossi in te sceglierei di lavorare su problemi più interessanti, senza avere a che fare con le operazioni di database di basso livello (e sarebbe quindi utilizzare uno strato sottile sopra pacchetto esistente per il mio negozio reale RDF).

Altri suggerimenti

strutture gerarchiche possono essere immagazzinati in depositi chiave-valore utilizzando un attributo padre o un figlio.

Se si desidera un genitore di avere 1 o più figli, utilizzare un attributo padre su ogni record e hanno nodi principali hanno un genitore di ID 0 o un altro valore significativo.

Se si desidera un bambino ad avere 1 o più genitori, utilizzare un attributo bambino su ogni record.

Se si desidera nodi possono avere più genitori e figli utilizzare una tabella separata per memorizzare i rapporti.

In questo modo si può attraversare l'albero dai eseguendo una query per i nodi che hanno un certo genitore o un figlio.

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