O PostgreSQL acabou de lançar o JSONB e já está em alta nas notícias de hackers . Seria ótimo se alguém pudesse explicar como é diferente do Hstore e JSON anteriormente presentes no PostgreSQL. Quais são suas vantagens e limitações e quando alguém deve considerar usá-lo?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
fonte
fonte
Respostas:
Primeiro,
hstore
é um módulo contrib, que permite armazenar apenas pares chave => valor, onde chaves e valores podem ser apenastext
s (no entanto, os valores também podem ser sqlNULL
s).Ambos
json
&jsonb
permite que você armazene um valor JSON válido (definido em suas especificações ).F.ex. estes são representações JSON válidos:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
é apenas um pequeno subconjunto comparado ao que JSON é capaz (mas se você só precisa este subconjunto, está tudo bem).A única diferença entre
json
&jsonb
é o armazenamento:json
é armazenado em seu formato de texto sem formatação, enquantojsonb
é armazenado em alguma representação bináriaExistem três consequências principais disso:
jsonb
normalmente ocupa mais espaço em disco para armazenar do quejson
(às vezes não)jsonb
leva mais tempo para construir a partir de sua representação de entrada do quejson
json
as operações levam muito mais tempo do quejsonb
(e a análise também precisa ser feita sempre que você realiza alguma operação com umjson
valor digitado)Quando
jsonb
estará disponível com uma versão estável, haverá dois casos de uso principais, quando você poderá selecionar facilmente entre eles:json
.jsonb
.fonte
jsonb
que não suporta isso?UPDATE test SET data->'a' = 123 WHERE id = 1;
DeCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
maisjsonb
é se por razões de legado seu código consumindo suajson
é dependente da ordenação dosjson
campos e eles não podem ser reordenadas.text
vsjson
.: o último vem com validação JSON, portanto, com JSON inválido, ele falha apenas na inserção, em vez de toda vez que seu aplicativo lê (porque obtém uma representação inválida). Além disso, você pode transmitir com segurança o último parajsonb
dentro do banco de dados.Peeyush:
A resposta curta é:
Para uma resposta mais longa, você precisará esperar que eu faça uma redação completa do "HowTo" mais próxima da versão 9.4.
fonte
Uma explicação simples da diferença entre json e jsonb ( imagem original de PostgresProfessional ):
Mais em vídeo discursivo e apresentação de slides por desenvolvedores jsonb. Eles também introduziram o JsQuery , pg.extension fornece uma poderosa linguagem de consulta jsonb
fonte
hstore
é mais um tipo de armazenamento de "coluna ampla", é um dicionário simples (não aninhado) de pares de valores-chave, sempre armazenados em um formato binário razoavelmente eficiente (uma tabela de hash, daí o nome).json
armazena documentos JSON como texto, realizando a validação quando os documentos são armazenados e analisando-os na saída, se necessário (por exemplo, acessar campos individuais); deve suportar toda a especificação JSON. Como todo o texto JSON é armazenado, sua formatação é preservada.jsonb
utiliza atalhos por motivos de desempenho: os dados JSON são analisados na entrada e armazenados no formato binário, as ordens de chave nos dicionários não são mantidas e as chaves duplicadas. O acesso a elementos individuais no campo JSONB é rápido, pois não requer a análise do texto JSON o tempo todo. Na saída, os dados JSON são reconstruídos e a formatação inicial é perdida.Na IMO, não há razão significativa para não usar
jsonb
quando estiver disponível, se você estiver trabalhando com dados legíveis por máquina.fonte
JSONB é uma versão "melhor" do JSON.
Vejamos um exemplo:
Em geral, deve-se preferir o JSONB, a menos que haja necessidades especializadas, como suposições herdadas sobre a ordem de chaves de objetos.
fonte
Eu estava no pgopen hoje, os benchmarks são muito mais rápidos que o mongodb, acredito que foi cerca de 500% mais rápido para os selects. Praticamente tudo foi mais rápido, pelo menos em 200%, quando comparado ao mongodb. No momento, uma exceção é uma atualização que exige reescrever completamente toda a coluna json com a qual o mongodb lida melhor.
A indexação do gin no jsonb parece incrível.
Além disso, o postgres persistirá tipos de jsonb internamente e basicamente corresponderá a isso com tipos como numérico, texto, booleano etc.
Associações também serão possíveis usando jsonb
Adicione o PLv8 para procedimentos armazenados e isso basicamente será um sonho para os desenvolvedores do node.js.
Sendo armazenado como binário, o jsonb também removerá todo o espaço em branco, alterará a ordem das propriedades e removerá as propriedades duplicadas usando a última ocorrência da propriedade.
Além do índice, ao consultar uma coluna jsonb em contraste com uma coluna json, o postgres não precisa executar a funcionalidade para converter o texto em json em todas as linhas, o que provavelmente economizará muito tempo sozinho.
fonte
Em relação às diferenças entre
json
ejsonb
tipos de dados, vale ressaltar a explicação oficial:Fonte: https://www.postgresql.org/docs/current/datatype-json.html
fonte
Tanto quanto eu posso dizer,
hstore como existe atualmente (no Postgresql 9.3) não permite aninhar outros objetos e matrizes como os valores de seus pares chave / valor. no entanto, um futuro patch hstore permitirá o aninhamento. esse patch não estará na versão 9.4 e pode não ser incluído tão cedo.
O json, como ele existe atualmente , permite o aninhamento, mas é baseado em texto e não permite a indexação; portanto, é "lento"
O jsonb que será lançado com a versão 9.4 terá os recursos de aninhamento atuais do json, bem como a indexação GIN / GIST do hstore, por isso será rápido
As pessoas que trabalham no postgresql 9.4 parecem dizer que o novo e rápido tipo jsonb agradará as pessoas que escolheriam usar um repositório de dados noSQL como o MongoDB, mas agora podem combinar um banco de dados relacional com dados não estruturados passíveis de consulta sob o mesmo teto
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Os benchmarks do postgresql 9.4 jsonb parecem estar no mesmo nível ou em alguns casos mais rápidos que o MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
fonte
Outra diferença importante, que não foi mencionada em nenhuma resposta acima, é que não há operador de igualdade para o
json
tipo, mas existe um parajsonb
.Isso significa que você não pode usar a
DISTINCT
palavra-chave ao selecionar essejson
tipo e / ou outros campos de uma tabela (você pode usarDISTINCT ON
, mas isso nem sempre é possível devido a casos como esse ).fonte