postgresql: the nosql way
TRANSCRIPT
![Page 1: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/1.jpg)
PostgreSQL: The NoSQL Way
Hans-Jurgen Schonig
May 7, 2015
Hans-Jurgen SchonigMay 7, 2015
![Page 2: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/2.jpg)
Anforderung: Unstrukturierte Daten
Hans-Jurgen SchonigMay 7, 2015
![Page 3: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/3.jpg)
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
![Page 4: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/4.jpg)
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
![Page 5: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/5.jpg)
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
![Page 6: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/6.jpg)
Der NoSQL Ansatz
I Key / Value StoresI Ein verteilter Schlussel
Hans-Jurgen SchonigMay 7, 2015
![Page 7: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/7.jpg)
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
![Page 8: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/8.jpg)
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
![Page 9: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/9.jpg)
PostgreSQL Funktionalitat
Hans-Jurgen SchonigMay 7, 2015
![Page 10: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/10.jpg)
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
![Page 11: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/11.jpg)
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
![Page 12: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/12.jpg)
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
![Page 13: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/13.jpg)
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
![Page 14: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/14.jpg)
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
![Page 15: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/15.jpg)
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
![Page 16: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/16.jpg)
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
![Page 17: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/17.jpg)
Einfache Operationen (1)
I Auf Existenz prufen
test=# SELECT ’"foo"’::jsonb @> ’"foo"’::jsonb;
?column?
----------
t
(1 row)
Hans-Jurgen SchonigMay 7, 2015
![Page 18: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/18.jpg)
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
![Page 19: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/19.jpg)
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
![Page 20: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/20.jpg)
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
![Page 21: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/21.jpg)
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
![Page 22: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/22.jpg)
JSON erzeugen und zerlegen
Hans-Jurgen SchonigMay 7, 2015
![Page 23: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/23.jpg)
Relational -> Json
I Relationale Daten konnen sehr sehr einfach in ein jsontransformiert werden.
Hans-Jurgen SchonigMay 7, 2015
![Page 24: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/24.jpg)
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
![Page 25: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/25.jpg)
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
![Page 26: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/26.jpg)
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
![Page 27: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/27.jpg)
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
![Page 28: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/28.jpg)
Indizierung
Hans-Jurgen SchonigMay 7, 2015
![Page 29: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/29.jpg)
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
![Page 30: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/30.jpg)
GIN: Ganz einfach ..
CREATE INDEX idx_name ON t_table USING gin (json_field);
Hans-Jurgen SchonigMay 7, 2015
![Page 31: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/31.jpg)
Performance:
I Just two words: IT ROCKS !
Hans-Jurgen SchonigMay 7, 2015
![Page 32: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/32.jpg)
GIN Internas
I GIN verwendet intern sehr effiziente varbit EncodingsI Der Index ist sehr kleinI Alle Felder sind indiziert
Hans-Jurgen SchonigMay 7, 2015
![Page 33: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/33.jpg)
Conclusion
Hans-Jurgen SchonigMay 7, 2015
![Page 34: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/34.jpg)
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
![Page 35: PostgreSQL: The NoSQL way](https://reader034.vdocuments.net/reader034/viewer/2022052413/55c35d52bb61eb5d6f8b463b/html5/thumbnails/35.jpg)
Finally . . .
Gibt es Fragen?
Hans-Jurgen SchonigMay 7, 2015