postgresql: the nosql way
TRANSCRIPT
PostgreSQL: The NoSQL Way
Hans-Jurgen Schonig
May 7, 2015
Hans-Jurgen SchonigMay 7, 2015
Anforderung: Unstrukturierte Daten
Hans-Jurgen SchonigMay 7, 2015
Strukturiert vs. Unstrukturiert
I Relationale Systeme speichern traditionell in strukturierterForm.
I Das Grundprinzip:
I “Think first”.I Erst die Struktur, dann die Daten
Hans-Jurgen SchonigMay 7, 2015
Unstrukturierte Daten
I Der Inhalt kann sich zur Laufzeit andern.
I Felder kommen dazu, andern sich, etc.
I Das ist relational auch moglich:
I DDLs sind auf minimales Locking optimiert
Hans-Jurgen SchonigMay 7, 2015
Strukturbruche
I Schwieriger wird es, wenn sich Beziehungen andern
I 1:1 auf 1:n oder m:nI Das ist nicht ganz einfach
I Spaltenanderungen und Typanderungen sind eher trivial
Hans-Jurgen SchonigMay 7, 2015
Der NoSQL Ansatz
I Key / Value StoresI Ein verteilter Schlussel
Hans-Jurgen SchonigMay 7, 2015
Die Problematik: Ein Beispiel
I Kann man ohne Struktur Software schreiben?
I Beispiel: Ein einfacher Punkt . . .
I Ein normaler Punkt: (x, y)
I GPS:
I 48 07’29.0“N 16 33’27.0”EI 48.124722, 16.557500
I Nord / Sud ist eigentlich die y-Koordinate
Hans-Jurgen SchonigMay 7, 2015
Struktur
I Es muss also irgendwo immer Wissen uber die Struktur geben.
I Entweder in der Applikation oder in der Database
Hans-Jurgen SchonigMay 7, 2015
PostgreSQL Funktionalitat
Hans-Jurgen SchonigMay 7, 2015
Neue Datentypen
I PostgreSQL stellt spezielle Datentypen fur generischeDatenbestande zur Verfugung:
I hstoreI jsonI jsonb
I Json folgt RFC 7159
Hans-Jurgen SchonigMay 7, 2015
hstore: Key / Value Store
I hstore ist der traditionelle Key / Value StoreI hstore hat ein proprietares FormatI Schon seit vielen Jahren verfugbarI hochkompaktes Format
Hans-Jurgen SchonigMay 7, 2015
json Dokumente
I Der json-Datentyp validiert json Daten
I Intern wird als Text gespeichert
I Spezielle Operatoren konnen direkt auf das json Dokumentlosgelassen werden
I Einsatz: Ideal fur Daten, die fast nie analysiert werden undschnell geschrieben werden mussen.
Hans-Jurgen SchonigMay 7, 2015
jsonb: Binares json
I PostgreSQL zerlegt das json und legt es intern binar ab.
I Dabei werden bei er Speicherung alle Register gezogen, umdas moglichst klein zu machen.
I Es muss nie wieder geparst werden.
I Einsatz: Wenn Daten oft angefasst und gelesen werden.
Hans-Jurgen SchonigMay 7, 2015
Wie sieht das aus?
SELECT ’5’::json;
-- Array elements (elements need not be of same type)
SELECT ’[1, 2, "foo", null]’::json;
-- Object containing pairs of keys and values
-- Note that object keys must always be quoted strings
SELECT ’{"bar": "baz", "balance": 7.77, "active": false}’::json;
-- Arrays and objects can be nested arbitrarily
SELECT ’{"foo": [true, "bar"],
"tags": {"a": 1, "b": null}}’::json;
Hans-Jurgen SchonigMay 7, 2015
Ordnung im Dokument (1)
SELECT ’{"bar": "baz", "balance": 7.77,
"active":false}’::json;json
-------------------------------------------------
{"bar": "baz", "balance": 7.77, "active":false}(1 row)
Hans-Jurgen SchonigMay 7, 2015
Ordnung im Dokument (2)
SELECT ’{"bar": "baz", "balance": 7.77,
"active":false}’::jsonb;jsonb
--------------------------------------------------
{"bar": "baz", "active": false, "balance": 7.77}(1 row)
Hans-Jurgen SchonigMay 7, 2015
Einfache Operationen (1)
I Auf Existenz prufen
test=# SELECT ’"foo"’::jsonb @> ’"foo"’::jsonb;
?column?
----------
t
(1 row)
Hans-Jurgen SchonigMay 7, 2015
Einfache Operationen (2)
I Ist “rechts” in “links” enthalten?
test=# SELECT ’[1, 2, 3]’::jsonb @> ’[1, 3]’::jsonb;
?column?
----------
t
(1 row)
Hans-Jurgen SchonigMay 7, 2015
Einfache Operationen (3)
I Elemente extrahieren
test=# SELECT ’[{"a":"foo"},{"b":"bar"},{"c":"baz"}]’::json->2;
?column?
-------------
{"c":"baz"}(1 row)
Hans-Jurgen SchonigMay 7, 2015
Einfache Operationen (4)
I Objekte uber den Key holen
test=# SELECT ’{"a": {"b":"foo"}}’::json->’a’;?column?
-------------
{"b":"foo"}(1 row)
Hans-Jurgen SchonigMay 7, 2015
Einfache Operationen (5)
I Auf Pfade zugreifen
test=# SELECT ’{"a": {"b":{"c": "foo"}}}’::json#>’{a,b}’;?column?
--------------
{"c": "foo"}(1 row)
Hans-Jurgen SchonigMay 7, 2015
JSON erzeugen und zerlegen
Hans-Jurgen SchonigMay 7, 2015
Relational -> Json
I Relationale Daten konnen sehr sehr einfach in ein jsontransformiert werden.
Hans-Jurgen SchonigMay 7, 2015
Ein Beispiel
test=# SELECT row_to_json(x)
FROM (VALUES (1, 2), (3, 4)) AS x;
row_to_json
---------------------------
{"column1":1,"column2":2}{"column1":3,"column2":4}
(2 rows)
Hans-Jurgen SchonigMay 7, 2015
jsons aggregieren
test=# SELECT json_agg(row_to_json(x))
FROM (VALUES (1, 2), (3, 4)) AS x;
json_agg
--------------------------------------------------------
[{"column1":1,"column2":2}, {"column1":3,"column2":4}](1 row)
Hans-Jurgen SchonigMay 7, 2015
Ein json als Tabelle darstellen
test=# SELECT *
FROM json_each(’{"a":"foo", "b":"bar"}’);key | value
-----+-------
a | "foo"
b | "bar"
(2 rows)
Hans-Jurgen SchonigMay 7, 2015
json -> record
test=# SELECT *
FROM json_to_record(’{"a":1,"b":[1,2,3],"c":"bar"}’)AS x(a int, b text, d text);
a | b | d
---+---------+---
1 | [1,2,3] |
(1 row)
Hans-Jurgen SchonigMay 7, 2015
Indizierung
Hans-Jurgen SchonigMay 7, 2015
json Indizierung
I Es ist jederzeit moglich, einzelne Elemente zu indizieren
I Funktionelle Indices sind immer moglich
I GIN Indices sind jedoch praktischer.
I GIN indiziert JEDES Feld im json
Hans-Jurgen SchonigMay 7, 2015
GIN: Ganz einfach ..
CREATE INDEX idx_name ON t_table USING gin (json_field);
Hans-Jurgen SchonigMay 7, 2015
Performance:
I Just two words: IT ROCKS !
Hans-Jurgen SchonigMay 7, 2015
GIN Internas
I GIN verwendet intern sehr effiziente varbit EncodingsI Der Index ist sehr kleinI Alle Felder sind indiziert
Hans-Jurgen SchonigMay 7, 2015
Conclusion
Hans-Jurgen SchonigMay 7, 2015
PostgreSQL
I Bietet gute Moglichkeiten, unstrukturierte Daten zu speichern.
I Bei Bedarf sind Erweiterungen schnell zu schreiben
I Unstrukturierte Speicherung ist in einem relationalenPowerhouse moglich
I Weitere Funktionalitat wird folgen.
Hans-Jurgen SchonigMay 7, 2015
Finally . . .
Gibt es Fragen?
Hans-Jurgen SchonigMay 7, 2015