Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

NOSQL con PostgreSQL (in italiano)

PostgreSQL 9.3 è molto più di un DBMS relazionale. Il supporto nativo per JSON consente di considerare il database come una scatola nera in grado di memorizzare dati non strutturati e di comunicare con le applicazioni in JSON.
by

Gabriele Bartolini

on 15 November 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of NOSQL con PostgreSQL (in italiano)

NOSQL con PostgreSQL 9.3
Gabriele Bartolini
Data architect
2ndQuadrant Italia

Non solo SQL con Postgres
Contatti
@_GBartolini_
gabriele.bartolini@2ndquadrant.it
@2ndquadrant_it
Azienda fondata in UK da Simon Riggs (code committer)
Uffici in Europa, America, Oceania, Asia
Sponsor di platino di PostgreSQL
Modello di business open source
Leader HA, Disaster Recovery, Scalabilità e Performance su PostgreSQL
Supporto 24/7 ("follow the sun")
JSON in Postgres 9.3
DROP SCHEMA angus CASCADE;

\timing
BEGIN;

CREATE SCHEMA angus;
SET search_path TO angus;

CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(16) UNIQUE
);

CREATE TABLE pictures (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id),
title TEXT,
metadata
JSON
,
thumbnail BYTEA,
picture BYTEA,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now()
);

INSERT INTO users VALUES (100, 'gabriele');

INSERT INTO pictures
(user_id, title, metadata)
VALUES (100,
'A picture of my Stratocaster',

'{"latitude":43.883,"longitude":11.1,"width":2240,"height":1680}'
);

COMMIT;
ANALYSE;
WITH
m
AS (

SELECT 43.883 AS latitude,
11.1 AS longitude,
2240 AS width,
1680 AS height
)
INSERT INTO pictures (user_id, title, metadata)
SELECT 100, 'Another picture of my Stratocaster',
to_json(m)
FROM m
;
Alternativa con CTE
-- Restituisce un oggetto JSON
WITH p AS (
SELECT title, metadata, created_at
FROM pictures WHERE id = 1
)
SELECT
to_json(p)
AS json FROM p;
-- Restituisce un array di JSON
SELECT id, title, metadata, created_at
FROM pictures WHERE user_id = 100;
WITH p AS (
SELECT id, title, metadata, created_at
FROM pictures WHERE user_id = 100
)
SELECT json
_agg(p) AS json
FROM p;
-- Accede a un valore nell'oggetto JSON
SELECT id, (
metadata->'longitude'
,

metadata->'latitude'
) AS coords
FROM pictures
WHERE user_id = 100;
{"title":"A picture of my Stratocaster","metadata":{"latitude":43.883,"longitude":11.1,"width":2240,"height":1680},"created_at":"2013-10-01 14:52:22.163447"}
[{"id":1,"title":"A picture of my Stratocaster","metadata":{"latitude":43.883,"longitude":11.1,"width":2240,"height":1680},"created_at":"2013-10-01 14:52:22.163447"}, +
{"id":2,"title":"Another picture of my Stratocaster","metadata":{"latitude":43.883,"longitude":11.1,"width":2240,"height":1680},"created_at":"2013-10-01 14:52:22.163447"}]
id | coords
----+---------------
1 | (11.1,43.883)
2 | (11.1,43.883)
PostgreSQL 9.3 aggiunge:
Generatori
Operatori
Ricordiamoci che Postgres ha indici funzionali!
Integrazione con hstore (estensione dizionario key->value)
Postgre
NO
SQL
Grazie
http://creativecommons.org/licenses/by-nc-sa/3.0/deed.it
Copyright 2013, 2ndQuadrant Italia

Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported (CC BY-NC-SA 3.0)

JSON
Javascript Object Notation
Formato di interscambio dati
Tipi di dato supportati:
null
true/false
stringhe ("")
numeri
array ([])
array associativi (oggetti, {})
{
"type": "menu",
"value": "File",
"items": [
{"value": "New", "action": "CreateNewDoc"},
{"value": "Open", "action": "OpenDoc"},
{"value": "Close", "action": "CloseDoc"}
]
}
JSON in Postgres 9.2
Il supporto JSON è stato introdotto in PostgreSQL 9.2:
tipo di dato JSON
memorizzato internamente come stringa
parser per validazione
funzioni row_to_json() e array_to_json()
Nessuna possibilità di generare valori JSON
Nessuna possibilità di accedere internamente a valori JSON
Necessità di utilizzare PL/V8 per utilizzarlo internamente
Generazione di valori JSON
converte un valore in JSON, utilizzando, sulla base del tipo:
casting
rappresentazione testuale
to_json(anyelement)
aggrega un set di record come un array di oggetti JSON
json_agg(record)
Altre funzioni interessanti
json_each(json)
json_each_text(json)
json_extract_path(json, text[])
json_extract_path_text(json, text[])
json_object_keys(json)
Dettaglio: http://www.postgresql.org/docs/9.3/static/functions-json.html
Alcuni operatori
JSON -> int
Accede a un elemento interno dell'array
JSON -> text
Accede a un campo interno
'[1,2,3]'::json->2
'{"a":1,"b":2}'::json->'b'
Variante ->>
Restituisce testo
Con due '>'
Dettaglio: http://www.postgresql.org/docs/9.3/static/functions-json.html
Integrazione con hstore
Tipo di dato per memorizzazione di dizionari chiave/valore come un singolo valore (quindi, come colonna)
hstore è un'estensione di Postgres
Utile per memorizzare:
dati semi-strutturati
tanti attributi per un record
memorizzati come testo
(binario in 9.4?)
Fornisce operatori
Supporta indici (GIN e GIST)
mono-livello
(nested in 9.4?)
PostgreSQL 9.3 aggiunge cast da hstore a JSON
Esempio
Benchmark
Applicazione Python
potrebbe essere qualsiasi linguaggio con supporto JSON
Esecuzione di una query:
caso 1: standard
caso 2: output in JSON (json_agg - Python JSON)
caso 3: output in JSON (json_agg - Python stringa)
Visualizzazione risultato in JSON
Tempo medio su 1000 esecuzioni
Database di circa 7GB di dimensioni
Risultati
Caso 1 (SQL):
20.16 ms

Caso 2 (JSON puro):
4.52 ms
(-77.57%)

Caso 3 (JSON -> text):
2.48 ms
(-87.69%)
Conclusioni
Postgres è più di un database tradizionale
Multi-Purpose
"Postgres Momentum"
14/12/13: Amazon RDS con Postgres
Maturo e in continua evoluzione
Apprendere da "NOSQL"
Integrare fonti di dati e sistemi diversi
Non sottovalutate la licenza
Caso 1 (SQL):
8.01 ms

Caso 2 (JSON puro):
6.45 ms
(-19.47%)

Caso 3 (JSON -> text):
2.41 ms
(-77.75%)
PyPy Python
NOSQLDay 2013
Udine, 15 novembre 2013

Prestazioni vs
Durabilità
Flessibilità vs
Rigidità
NOSQL vs
SQL?
NOSQL + SQL =
YES-
SQL!
Sommario
Breve intro a PostgreSQL 9.3
Document store con PostgreSQL
Foreign Data Wrapper
Altre funzionalità interessanti
Conclusioni
Parte I
Postgres = PostgreSQL
nasce nel 1995
9.3
8.4, 9.0, 9.1 e 9.2
Licenza
Client/Server
Concorrenza (MVCC)
Integrità referenziale
Transazioni ACID
Viste
Funzioni
Trigger
Tablespace
Partitioning
Schemi
Point In Time Recovery
Replica Master/Slave
http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.3
Settembre 2013
Operatori e funzioni JSON
Viste aggiornabili
Viste materializzate
Tabelle esterne scrivibili
...
PostgreSQL 9.3
Parte II
Document Store
SQL:
Stringhe (TEXT)
Oggetti binari (BYTEA e LO)
Supporto XML
Supporto JSON
Estensione hstore (chiave => valore)
Parte III
Foreign Data Wrapper
Foreign Data Wrapper (FDW)
API
Estensioni per connettersi a sorgenti di dato esterne
Anche in scrittura da PostgreSQL 9.3
Tabelle esterne (FOREIGN TABLE)
Database federati
Esistono per Postgres, file di testo, Oracle, MySQL, MongoDB, CouchDB, Redis, Twitter, ...
-- ESEMPIO ORACLE FDW
...
CREATE FOREIGN TABLE oracle_table (
id integer NOT NULL,
...
) SERVER oradb OPTIONS
(schema 'ORAUSER', table 'ORATAB');
...
-- Push down della clausola WHERE
SELECT * FROM oracle_table WHERE
id=10
;
-- ESEMPIO REDIS FDW

CREATE FOREIGN TABLE mytable
(key
text
, value
text
)
SERVER redis_server
OPTIONS (database '0',
tablekeyprefix 'mytable:');
# Comandi: http://redis.io/commands

$ redis-cli
redis 127.0.0.1:6379> set mytable:k v
OK

$ psql -c ‘
SELECT * FROM mytable


key | value
--------------------+-------
mytable:k | v
Parte IV
Altre funzionalità
PL/Proxy
Linguaggio procedurale
Definizione di funzioni proxy
Permette
SHARDING
Scalabilità infinita
Scritto in C, da Skype
Esecuzione può avvenire su una, più o tutte le shard
Parallela se shard > 1
Query eseguite in modalità auto-commit
Map/Reduce
PL/V8
Linguaggio procedurale
Permette di implementare funzioni all’interno di Postgres utilizzando il linguaggio Javascript
Disponibile come estensione
Memcached
Sistema distribuito per caching di oggetti in memoria
coppie chiave/valore
dati volatili
Estensione pgmemcache
Integrazione di database e applicazioni:
scritture su DB
trigger automatici scrivono su memcache
letture su memcache (scalabilità in lettura)
Futuro
Indici min/max (per business intelligence)
hstore binario e per oggetti nidificati
Proliferare di FDW in scrittura
Replica multi-master
Primo passo per sharding DISTRIBUTED BY?

... avete pensato a sponsorizzare una funzionalità?
POSTGIS!!!
www.2ndQuadrant.it
23 linee!!!
Estensibilità

Capacità di rinnovarsi, sempre
Postgres
Co-fondatore e Manager di 2ndQuadrant Italia
Data Architect, ambienti Business critical (OLTP)
Data warehousing
Co-fondatore Italian PostgreSQL Users Group (www.itpug.org)
Co-fondatore PostgreSQL Europe (www.postgresql.eu)
Membro attivo della comunità internazionale di PostgreSQL
Ricordati, puoi crearci indici sopra!
Full transcript