Pregunta

estoy siendo obligado a utilizar una base de datos PostgreSQL y que va a sustituir a mi uso actual de datos Berkeley. A pesar de que; Sé que esto no es una situación ideal, es más allá de mi control.

Así que la pregunta es ... Si se le requirió para que PostgreSQL en un almacén de claves valor ¿cómo ir haciendo esto, mientras que lo que es lo más eficiente posible?

Mis valores son matrices de bytes y de mi clave son cadenas, que podrían imponer algunas restricciones en las longitudes de estas cadenas.

Asumo que debo usar una gota de mi valor y la columna de clave principal que sostiene la llave, pero ya que estoy simplemente aventurarse en este viaje tengo curiosidad si alguien en la comunidad de desbordamiento de pila se ha hecho esto, o si hay alguna específica 'trampas' que deben tener en cuenta.

¿Fue útil?

Solución

La extensión en PostgreSQL hacer correctamente esto se llama hstore. Funciona de manera similar como era de esperar otros sistemas de almacenamiento de valores clave. Sólo tiene que cargar la extensión. La sintaxis es la única, pero si usted tiene Redis han utilizado alguna vez o Mongo se obtendrá con rapidez. No hacer que sea más difícil de lo que es. Entiendo, que a menudo no llega a escoger nuestras herramientas y tienen que conformarse.
Aquí está la página del documento:

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

Otros consejos

Si se ve obligado a utilizar la base de datos relacional, sugeriría a tratar de encontrar la estructura de los datos para tomar ventaja del hecho, ya que renunciar a la ventaja de la rapidez con la que tienes los datos no estructurados y almacén de claves-valor. El más estructura a encontrar, la mejor ventaja que salir de su situación. Incluso si sólo se encuentra en la estructura de las llaves.

Ten en cuenta también si usted no necesitará utilizar acceso secuencial o aleatorio a los datos y en el que la relación y la estructura de su base de datos por este requisito. ¿Vas a hacer consultas sobre sus valores por tipo, por ejemplo? Cada una de estas preguntas podrían tener efecto en cómo la estructura de su base de datos.

Una consideración específica sobre manchas en PostgreSQL que se representan internamente como pg_largetable (loid: oid, pageno: int4, los datos: bytea). El tamaño de los trozos se define por LOBBLKSIZE, pero típicamente 2k. Así que si usted puede utilizar matrices de bytes en la tabla en lugar de manchas y el tamaño límite de su valor / bajo par de claves de bloque, se puede evitar esta vía indirecta a través de la segunda tabla. También podría aumentar el tamaño de bloque si tiene acceso a la configuración de la base de datos.

Yo sugeriría a ir en busca de la estructura de los datos y los patrones de acceso a datos y luego hacer su pregunta de nuevo con más detalle.

En realidad debería depender de lo que será la clave. Si siempre será una cadena debajo de 255 caracteres, a continuación, utilizar un varchar como yoru PK y luego usar una gota (asumiendo un valor grande) para el valor. si siempre será un número, el uso int, etc.

En otras palabras, necesita más información para darle realmente una buena respuesta:)

¿Qué se necesita para almacenar como un valor? Cuerdas? Enteros? Objetos (por ejemplo serializan objetos Java). Una aplicación sencilla que trabajaría con una tabla de 3 columnas que parece:

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

(quizás el tipo es un poco de enumeración). Lo anterior no funcionaría para los datos binarios como objetos serializados, sin embargo y tal vez necesite un BLOB allí.

Como alternativa (y probablemente un más mejor idea), ¿ha visto Apache Commons configuración? Puede hacer una copia que, con una base de datos (a través de JDBC) y se puede almacenar propiedades tales que se recupere de este modo:

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

que usted puede ahorrar una gran cantidad de dolor en términos de implementación. Usted puede tener un problema con el ahorro de datos binarios, en el que habría que serializar que antes de la inserción y después de la recuperación. Pero yo he utilizado en el pasado para almacenar enteros, dobles y objetos Java serializados a través xstream, por lo que puedo confirmar que funciona bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top