Domanda

mi viene richiesto di utilizzare un database PostgreSQL e andrà a sostituire il mio attuale utilizzo di BerkeleyDB. Sebbene; Mi rendo conto che questa non è una situazione ideale, è al di là del mio controllo.

Quindi la domanda è ... Se sono stati tenuti a fare PostgreSQL in un negozio chiave di valore come è possibile andare a fare questo, rendendo allo stesso tempo più efficiente possibile?

I miei valori sono array di byte e la mia chiave sono stringhe, mi potrebbero imporre alcune restrizioni sulle lunghezze di queste stringhe.

Suppongo dovrei usare un blob per il mio valore e la colonna della chiave primaria tenendo premuto il tasto, ma come sto solo avventurarsi in questo viaggio sono curioso se qualcuno nella comunità di overflow dello stack ha fatto questo, o se ci sono specifici 'trucchi' che dovrebbero guardare fuori per.

È stato utile?

Soluzione

L'estensione in PostgreSQL per fare correttamente questo è chiamato hstore. Funziona in modo simile come ci si aspetterebbe di altri sistemi di negozio chiave-valore. Basta caricare l'estensione. La sintassi è unico, ma se avete Redis mai utilizzati o Mongo si otterrà rapidamente. Non rendere più difficile di quanto non sia. Ho capito, che spesso non arriva a scegliere i nostri strumenti e devono accontentarsi.
Ecco la pagina del documento:

http://www.postgresql.org/docs/9.1/static/ hstore.html

Altri suggerimenti

Se si è costretti a utilizzare database relazionale, vorrei suggerire di provare a trovare la struttura nei dati di approfittare del fatto, dal momento che rinunciare al vantaggio della velocità che hai con i dati non strutturati e memoria dei valori-chiave. La struttura più a trovare, il vantaggio migliore si ottiene dalla vostra situazione. Anche se si trova solo la struttura nelle chiavi.

Guarda anche se si avrà solo bisogno di accesso sequenziale o casuale ai dati e in cui il rapporto e strutturare la vostra base di dati da questo requisito. Avete intenzione di fare domande sui vostri valori per tipo per esempio? Ognuna di queste domande potrebbe avere effetto su come si struttura il database.

Una considerazione specifiche sul bolle in PostgreSQL sono rappresentati internamente come pg_largetable (loid: OID, pageno: int4, dati: bytea). La dimensione dei blocchi è definita da LOBBLKSIZE, ma tipicamente 2k. Quindi, se si può usare array di byte nella tabella invece di macchie e le dimensioni limite del vostro valore / coppia di chiavi sotto del blocco, è possibile evitare questo riferimento indiretto attraverso seconda tabella. Si potrebbe anche aumentare la dimensione del blocco se si ha accesso alla configurazione del database.

Io suggerirei di andare in cerca di struttura in dati e modelli in accesso ai dati e quindi chiedere di nuovo la tua domanda con più dettagli.

In realtà dovrebbe essere dipendente da quello che sarà la chiave. Se sarà sempre una stringa sotto 255 caratteri, quindi utilizzare un Varchar come yoru PK e quindi utilizzare un blob (assumendo un valore elevato) per il valore. se sarà sempre un numero, uso int, etc.

In altre parole, hanno bisogno di più informazioni per davvero dare una buona risposta:)

Che cosa è necessario memorizzare come un valore? Stringhe ? Int? Oggetti (ad esempio serializzati oggetti Java). Una semplice implementazione sarebbe lavorare con una tabella 3 colonna di ricerca come:

NAME(VARCHAR)   TYPE(VARCHAR)   VALUE(VARCHAR)

(forse il tipo è un po 'l'enumerazione). È possibile che questo non avrebbe funzionato per i dati binari, come oggetti serializzati, e anche se forse avete bisogno di un BLOB lì.

In alternativa (e probabilmente un molto meglio l'idea), hai visto Apache Commons configurazione? È possibile eseguire che con un database (tramite JDBC) ed è possibile memorizzare le proprietà in modo tale che li si recupera in tal modo:

// get a property called 'number'
Double double = config.getDouble("number");
Integer integer = config.getInteger("number");

che si può risparmiare un sacco di dolore in termini di attuazione. possono avere un problema con il salvataggio dei dati binari, in quella che avrebbe dovuto puntate che prima dell'inserimento e post-recupero. Ma ho usato in passato per la memorizzazione int, doppie e oggetti Java serializzati tramite Xstream, quindi posso confermare che funziona bene.

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