2010-01-17 8 views
21

Sto pensando di utilizzare/implementare una sorta di archivio di valori-chiave (o documento) incorporato per l'applicazione desktop Windows. Voglio essere in grado di memorizzare vari tipi di dati (le tracce GPS potrebbero essere un esempio) e naturalmente essere in grado di interrogare questi dati. La quantità di dati sarebbe tale da non poter essere caricata tutta in memoria nello stesso momento.Archivio dati non relazionale incorporato (nosql)

Sto pensando di utilizzare sqlite come motore di archiviazione per un archivio di valori-chiave, ad esempio y-serial, ma scritto in .NET. Ho anche letto su FriendFeed's usage of MySQL to store schema-less data, che è un buon indicatore su come utilizzare RDBMS per dati non relazionali. sqlite sembra essere una buona opzione per la sua semplicità, portabilità e dimensioni della libreria.

La mia domanda è se ci sono altre opzioni per un archivio non relazionale incorporato? Non ha bisogno di essere distribuibile e non deve supportare le transazioni, ma deve essere accessibile da .NET e dovrebbe avere una piccola dimensione di download.

AGGIORNAMENTO: Ho trovato un articolo dal titolo SQLite as a Key-Value Database che confronta sqlite con Berkeley DB, che è una libreria di archivio valore-chiave incorporato.

risposta

5

Personalmente vorrei andare per SQLite con NHibernate (e Fluent NHibernate). NHibernate può generare automaticamente lo schema del database per le tue classi, quindi devi solo specificare quali classi vuoi mantenere, e questo è abbastanza facile con Fluent NHibernate. Inoltre, è possibile cercare oggetti specifici e non è necessario caricare tutti i dati nella memoria.

+0

Ma voleva un negozio senza schema .... –

+0

Astor ha ragione: voglio evitare il modello relazionale. Voglio essere in grado di memorizzare praticamente qualsiasi tipo di dati senza prima dover preparare lo schema del database per questo. Inoltre, avere un modello relazionale rigido può essere problematico se la struttura dei dati cambia in seguito - avrei bisogno di scrivere script di modifica SQL per i dati esistenti nello store. –

+1

So cosa sta cercando, ma strumenti come NHibernate con generazione di schemi nascondono quasi completamente l'aspetto relazionale. Non è necessario definire alcuno schema, ma solo la mappatura per le classi (che è molto semplice con Fluent NHibernate) e quando le classi cambiano, sarà necessario eseguire qualche tipo di aggiornamento in qualsiasi strategia di persistenza. –

19

Windows ha un archivio incorporato non relazionale incorporato. Si chiama ESENT ed è utilizzato da diverse applicazioni Windows, tra cui Active Directory e Windows Desktop Search.

http://blogs.msdn.com/windowssdk/archive/2008/10/23/esent-extensible-storage-engine-api-in-the-windows-sdk.aspx

Se volete .NET l'accesso è possibile utilizzare lo strato ManagedEsent su CodePlex.

http://managedesent.codeplex.com/

Quel progetto ha una classe che implementa PersistentDictionary un archivio di valori-chiave che implementa l'interfaccia IDictionary, ma è supportato da una base di dati.

+0

@Laurion, ho visto ESENT ed ero inizialmente molto eccitato. L'unico problema è che è solo per Windows (si pensi a Mono + Linux/Mac). –

2

Applicando il principio KISS al tuo problema, ti consiglierei di usare i file.

Come nel nomefile è la chiave. Il contenuto del file è il valore. La cartella di Windows è l'indice.

Semplice, veloce, efficiente, flessibile e infallibile (a patto che i pazzi abbiano scarsa intelligenza).

+0

Approccio gradevole, anche se ritengo che l'utilizzo di file per la memorizzazione di valori sarebbe un po 'esagerato per valori semplici (un singolo intero, ad esempio). –

+0

Il tipo di domanda implica che ciò che viene memorizzato può essere silenzioso (documenti/troppi dati da caricare in memoria). Uno dei vantaggi dell'approccio per i file è che si ottiene gratuitamente un bel set di classi di gestione stream, che è molto utile quando si gestiscono grandi blocchi di dati e molto più pulito rispetto ad esempio per dividere i dati in blob arbitary nMB e memorizzarli in un Banca dati. –

+2

Vero. E i limiti fisici del file system? Come si comporterebbe tale negozio quando il numero di record raggiunge> 100.000? Inoltre: quando ho parlato di "troppi dati", intendevo il _whole_ database - ho menzionato questo per evitare risposte come la serializzazione degli alberi degli oggetti e simili. –

1

Grazie per la vostra gentile menzione di y_serial ... più precisamente, si tratta di un modulo Python:

oggetti magazzino Python con SQLite

"serializzazione + persistenza :: in poche righe di codice, comprimere e annota gli oggetti Python in SQLite, quindi li recupera in ordine cronologico con parole chiave prive di SQL.Un modulo "standard" più utile per un database per archiviare dati senza schema."

http://yserial.sourceforge.net

Nella mia esperienza, SQLite è una scelta più veloce e più affidabile rispetto maggior parte dei database (tra cui PostgreSQL e Berkeley DB) per la maggior parte dei progetti - e, naturalmente, non ha bisogno di un demone server .

yserial è molto facile da implementare (e di gran lunga più veloce del "nome del file è il contenuto chiave/del file è il valore" approccio ;-)

+0

Sì, mi piace molto l'approccio di y-serial, soprattutto perché usa sqlite. Mantenere il buon lavoro! Forse quando avrò un po 'di tempo dai miei altri progetti, proverò a fare qualcosa di simile in C# :) –

2

Potrebbe creare un semplice database SQLite con due colonne:

==documents== 
id|data 

e i dati sarebbero dati JSON.

Si potrebbe anche creare una tabella chiave che sarebbe:

==keys== 
keyname|keyvalue|id 

che sarebbero indicizzati su keyname e keyvalue per le ricerche veloci.

Un singolo file db può essere una raccolta ed è possibile creare più file db per più raccolte.

è possibile utilizzare le cartelle come "DBS" per abbinare la gerarchia di mongodb di DB-> Collezione> documento

+0

Solo una nota: crei un file db sqlite template, e copialo per qualsiasi momento hai bisogno di creare una nuova collezione . Se qualcuno vuole creare una configurazione php per gestire questo e open source, fammi sapere. Penso che sarebbe bello, ma non mi sono mai preoccupato di farlo da solo. – RobKohr

+0

i tuoi suggerimenti sono nella direzione di come la y-serial fa le cose. Lo hai visto? http://yserial.sourceforge.net/ –

+0

No, ma sto cercando una soluzione PHP. – RobKohr

10

Date un'occhiata a RavenDB. Sembra come se può essere integrato ed è schemaless e funziona con .NET

Dal sito web:

  • infrastruttura scalabile: Raven si basa sulla cima di esistere, comprovata e scalabile
  • Semplice configurazione di Windows : Raven è semplice da configurare ed eseguire su Windows come servizio o sito Web IIS7
  • Transazionale: supporto Raven System.Transaction con transazioni ACID. Se ci metti i dati, quei dati rimarranno lì
  • Mappa/Riduci: Definisci facilmente la mappa/riduci gli indici con query Linq
  • API client .NET: Raven viene fornito con un'API client .NET completamente funzionale che implementa Unità di lavoro e molto altro ancora
  • RESTful: Raven è costruito attorno a un'API RESTful
2

Questa è una vecchia questione, ma ho pensato che vorrei aggiungere una risposta nel caso qualcuno inciampa su di esso. La mia azienda ha appena rilasciato un database XML incorporato open source per la piattaforma .NET chiamata Nxdb. È sotto la licenza Apache 2.0 ed è stato sviluppato e utilizzato internamente per diversi anni. È fondamentalmente un legame con una versione cross-compilata (usando IKVM) di BaseX (un fantastico database Java XML) con funzionalità extra per il caso d'uso incorporato e l'ambiente .NET. La pagina del progetto è qui: https://dracorp.assembla.com/spaces/nxdb

XML funziona bene per questo tipo di archivio dati dato che fino a quando il contenuto che si sta tentando di memorizzare è serializzabile in testo è possibile memorizzare alberi gerarchici complessi. Infatti, se si accede direttamente al database, non è nemmeno necessario toccare "XML". Può anche essere interrogato con XQuery, un linguaggio di query potente e completo.

1

Si può provare questo uno https://github.com/mdsoftware/mData. Piccolo, gratuito e abbastanza insolito.Linguaggio di query di dati simile a Lisp, compilatore di espressioni, serializzazione binaria ad alte prestazioni, tutto incluso.

Problemi correlati