ruby-on-rails - sirve - ruby on rails ejemplos
¿Puedo almacenar matrices en hstore con Rails? (3)
Quiero guardar datos como este:
User.create(name:"Guy", properties:{url:["url1","url2","url3"], street_address:"asdf"})
¿Puedo hacerlo en Rails 4? Hasta ahora, he intentado la migración: add_column :users, :properties, :hstore, array: true
Pero cuando guardo la matriz en hstore, devuelve un error:
PG::InvalidTextRepresentation: ERROR: array value must start with "{" or dimension information
hstore
está diseñado para el almacenamiento simple de clave / valor, donde tanto las claves como los valores son cadenas simples no estructuradas. Del fino manual :
F 16. hstore
Este módulo implementa el tipo de datos de la
store
para almacenar conjuntos de pares clave / valor dentro de un único valor de PostgreSQL. [...] Las claves y los valores son simplemente cadenas de texto.
Tenga en cuenta la última oración: las claves y los valores en hstore
son cadenas. Eso significa que no se puede poner una matriz en un valor hstore
sin un poco de agarre hstore
para convertir la matriz a una cadena y desde ella, y realmente no se quiere perder el tiempo con ese tipo de cosas.
Sin embargo, hay un tipo de datos JSON disponible:
8.14. Tipo de JSON
El tipo de datos
json
se puede usar para almacenar datos JSON (JavaScript Object Notation), como se especifica en RFC 4627.
y JSON puede manejar fácilmente arrays y objetos incrustados. Intente usar JSON en su lugar:
add_column :users, :properties, :json
hstore
embargo, primero tendrá que eliminar la vieja columna hstore
.
Además, no quería array: true
en su columna hstore
ya que no estaba almacenando una matriz de hstore
, solo quería una de ellas.
Agregue la respuesta de Mu. Hstore también está dando una actualización muy prometedora en unos pocos meses (Postgresql 9.4 se lanzará en el tercer trimestre de 2014).
Algunos aspectos destacados de los próximos cambios que deberían abordar estas limitaciones:
- Soporte para soporte de escalares y tipos (numérico, booleano, cadenas, NULL), junto con nuevos operadores correspondientes
- Soporte para agrupamiento y matrices (los autores proponen que el formato de salida, es decir, corchetes v. Llaves, se configure con variables GUC)
- Básicamente, compatibilidad completa entre hstore y JSON, por lo que los documentos JSON ahora pueden aprovechar al máximo los índices de hstore (con GIN en particular, los autores lograron una mejora de velocidad de 120x para el rendimiento de búsqueda JSON)
Es muy difícil elegir uno entre hstore y json en este momento. Porque simplemente se están poniendo muy similares y actualizando demasiado rápido.
Mis 2 centavos a la respuesta de Mu. Estoy publicando esto como respuesta porque no tengo suficiente reputación para agregar un comentario.
JSON se está convirtiendo en la solución de referencia para almacenar datos "complejos".
Oleg Bartunov, uno de los autores de hstore, afirmó que no hay ninguna ventaja al usar hstore sobre JSON y anima a las personas a usar jsonb .
El 23 de marzo de 2014 jsonb, un formato estructurado para almacenar json , se introdujo formalmente en la lista de distribución de desarrollo de pgsql.
El 15 de mayo de 2014, JSONB apareció en el anuncio de la versión Beta 1 de PostgreSQL 9.4 .
JSONB: 9.4 incluye el nuevo tipo "JSON binario" de JSONB. Este nuevo formato de almacenamiento para datos de documentos es de mayor rendimiento y viene con indexación, funciones y operadores para manipular datos JSON.