PostgreSQL: The NoSQL Way
Hans-J¨urgen Sch¨onig
May 7, 2015
Hans-J¨urgen Sch¨onig
May 7, 2015
Anforderung: Unstrukturierte Daten
Hans-J¨urgen Sch¨onig
May 7, 2015
Strukturiert vs. Unstrukturiert
Relationale Systeme speichern traditionell in strukturierter
Form.
Das Grundprinzip:
“Think first”.
Erst die Struktur, dann die Daten
Hans-J¨urgen Sch¨onig
May 7, 2015
Unstrukturierte Daten
Der Inhalt kann sich zur Laufzeit ¨andern.
Felder kommen dazu, ¨andern sich, etc.
Das ist relational auch m¨oglich:
DDLs sind auf minimales Locking optimiert
Hans-J¨urgen Sch¨onig
May 7, 2015
Strukturbr¨uche
Schwieriger wird es, wenn sich Beziehungen ¨andern
1:1 auf 1:n oder m:n
Das ist nicht ganz einfach
Spalten¨anderungen und Typ¨anderungen sind eher trivial
Hans-J¨urgen Sch¨onig
May 7, 2015
Der NoSQL Ansatz
Key / Value Stores
Ein verteilter Schl¨ussel
Hans-J¨urgen Sch¨onig
May 7, 2015
Die Problematik: Ein Beispiel
Kann man ohne Struktur Software schreiben?
Beispiel: Ein einfacher Punkt . . .
Ein normaler Punkt: (x, y)
GPS:
48 07’29.0“N 16 33’27.0”E
48.124722, 16.557500
Nord / S¨ud ist eigentlich die y-Koordinate
Hans-J¨urgen Sch¨onig
May 7, 2015
Struktur
Es muss also irgendwo immer Wissen ¨uber die Struktur geben.
Entweder in der Applikation oder in der Database
Hans-J¨urgen Sch¨onig
May 7, 2015
PostgreSQL Funktionalit¨at
Hans-J¨urgen Sch¨onig
May 7, 2015
Neue Datentypen
PostgreSQL stellt spezielle Datentypen f¨ur generische
Datenbest¨ande zur Verf¨ugung:
hstore
json
jsonb
Json folgt RFC 7159
Hans-J¨urgen Sch¨onig
May 7, 2015
hstore: Key / Value Store
hstore ist der traditionelle Key / Value Store
hstore hat ein propriet¨ares Format
Schon seit vielen Jahren verf¨ugbar
hochkompaktes Format
Hans-J¨urgen Sch¨onig
May 7, 2015
json Dokumente
Der json-Datentyp validiert json Daten
Intern wird als Text gespeichert
Spezielle Operatoren k¨onnen direkt auf das json Dokument
losgelassen werden
Einsatz: Ideal f¨ur Daten, die fast nie analysiert werden und
schnell geschrieben werden m¨ussen.
Hans-J¨urgen Sch¨onig
May 7, 2015
jsonb: Bin¨ares json
PostgreSQL zerlegt das json und legt es intern bin¨ar ab.
Dabei werden bei er Speicherung alle Register gezogen, um
das m¨oglichst klein zu machen.
Es muss nie wieder geparst werden.
Einsatz: Wenn Daten oft angefasst und gelesen werden.
Hans-J¨urgen Sch¨onig
May 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}’::
-- Arrays and objects can be nested arbitrarily
SELECT ’{"foo": [true, "bar"],
"tags": {"a": 1, "b": null}}’::json;
Hans-J¨urgen Sch¨onig
May 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-J¨urgen Sch¨onig
May 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-J¨urgen Sch¨onig
May 7, 2015
Einfache Operationen (1)
Auf Existenz pr¨ufen
test=# SELECT ’"foo"’::jsonb @> ’"foo"’::jsonb;
?column?
----------
t
(1 row)
Hans-J¨urgen Sch¨onig
May 7, 2015
Einfache Operationen (2)
Ist “rechts” in “links” enthalten?
test=# SELECT ’[1, 2, 3]’::jsonb @> ’[1, 3]’::jsonb;
?column?
----------
t
(1 row)
Hans-J¨urgen Sch¨onig
May 7, 2015
Einfache Operationen (3)
Elemente extrahieren
test=# SELECT ’[{"a":"foo"},{"b":"bar"},
{"c":"baz"}]’::json->2;
?column?
-------------
{"c":"baz"}
(1 row)
Hans-J¨urgen Sch¨onig
May 7, 2015
Einfache Operationen (4)
Objekte ¨uber den Key holen
test=# SELECT ’{"a": {"b":"foo"}}’::json->’a’;
?column?
-------------
{"b":"foo"}
(1 row)
Hans-J¨urgen Sch¨onig
May 7, 2015
Einfache Operationen (5)
Auf Pfade zugreifen
test=# SELECT ’{"a": {"b":{"c": "foo"}}}’::json#>’{a,b}’;
?column?
--------------
{"c": "foo"}
(1 row)
Hans-J¨urgen Sch¨onig
May 7, 2015
JSON erzeugen und zerlegen
Hans-J¨urgen Sch¨onig
May 7, 2015
Relational -> Json
Relationale Daten k¨onnen sehr sehr einfach in ein json
transformiert werden.
Hans-J¨urgen Sch¨onig
May 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-J¨urgen Sch¨onig
May 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-J¨urgen Sch¨onig
May 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-J¨urgen Sch¨onig
May 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-J¨urgen Sch¨onig
May 7, 2015
Indizierung
Hans-J¨urgen Sch¨onig
May 7, 2015
json Indizierung
Es ist jederzeit m¨oglich, einzelne Elemente zu indizieren
Funktionelle Indices sind immer m¨oglich
GIN Indices sind jedoch praktischer.
GIN indiziert JEDES Feld im json
Hans-J¨urgen Sch¨onig
May 7, 2015
GIN: Ganz einfach ..
CREATE INDEX idx_name ON t_table USING gin (json_field);
Hans-J¨urgen Sch¨onig
May 7, 2015
Performance:
Just two words: IT ROCKS !
Hans-J¨urgen Sch¨onig
May 7, 2015
GIN Internas
GIN verwendet intern sehr effiziente varbit Encodings
Der Index ist sehr klein
Alle Felder sind indiziert
Hans-J¨urgen Sch¨onig
May 7, 2015
Conclusion
Hans-J¨urgen Sch¨onig
May 7, 2015
PostgreSQL
Bietet gute M¨oglichkeiten, unstrukturierte Daten zu speichern.
Bei Bedarf sind Erweiterungen schnell zu schreiben
Unstrukturierte Speicherung ist in einem relationalen
Powerhouse m¨oglich
Weitere Funktionalit¨at wird folgen.
Hans-J¨urgen Sch¨onig
May 7, 2015
Finally . . .
Gibt es Fragen?
Hans-J¨urgen Sch¨onig
May 7, 2015

PostgreSQL: The NoSQL way

  • 1.
    PostgreSQL: The NoSQLWay Hans-J¨urgen Sch¨onig May 7, 2015 Hans-J¨urgen Sch¨onig May 7, 2015
  • 2.
  • 3.
    Strukturiert vs. Unstrukturiert RelationaleSysteme speichern traditionell in strukturierter Form. Das Grundprinzip: “Think first”. Erst die Struktur, dann die Daten Hans-J¨urgen Sch¨onig May 7, 2015
  • 4.
    Unstrukturierte Daten Der Inhaltkann sich zur Laufzeit ¨andern. Felder kommen dazu, ¨andern sich, etc. Das ist relational auch m¨oglich: DDLs sind auf minimales Locking optimiert Hans-J¨urgen Sch¨onig May 7, 2015
  • 5.
    Strukturbr¨uche Schwieriger wird es,wenn sich Beziehungen ¨andern 1:1 auf 1:n oder m:n Das ist nicht ganz einfach Spalten¨anderungen und Typ¨anderungen sind eher trivial Hans-J¨urgen Sch¨onig May 7, 2015
  • 6.
    Der NoSQL Ansatz Key/ Value Stores Ein verteilter Schl¨ussel Hans-J¨urgen Sch¨onig May 7, 2015
  • 7.
    Die Problematik: EinBeispiel Kann man ohne Struktur Software schreiben? Beispiel: Ein einfacher Punkt . . . Ein normaler Punkt: (x, y) GPS: 48 07’29.0“N 16 33’27.0”E 48.124722, 16.557500 Nord / S¨ud ist eigentlich die y-Koordinate Hans-J¨urgen Sch¨onig May 7, 2015
  • 8.
    Struktur Es muss alsoirgendwo immer Wissen ¨uber die Struktur geben. Entweder in der Applikation oder in der Database Hans-J¨urgen Sch¨onig May 7, 2015
  • 9.
  • 10.
    Neue Datentypen PostgreSQL stelltspezielle Datentypen f¨ur generische Datenbest¨ande zur Verf¨ugung: hstore json jsonb Json folgt RFC 7159 Hans-J¨urgen Sch¨onig May 7, 2015
  • 11.
    hstore: Key /Value Store hstore ist der traditionelle Key / Value Store hstore hat ein propriet¨ares Format Schon seit vielen Jahren verf¨ugbar hochkompaktes Format Hans-J¨urgen Sch¨onig May 7, 2015
  • 12.
    json Dokumente Der json-Datentypvalidiert json Daten Intern wird als Text gespeichert Spezielle Operatoren k¨onnen direkt auf das json Dokument losgelassen werden Einsatz: Ideal f¨ur Daten, die fast nie analysiert werden und schnell geschrieben werden m¨ussen. Hans-J¨urgen Sch¨onig May 7, 2015
  • 13.
    jsonb: Bin¨ares json PostgreSQLzerlegt das json und legt es intern bin¨ar ab. Dabei werden bei er Speicherung alle Register gezogen, um das m¨oglichst klein zu machen. Es muss nie wieder geparst werden. Einsatz: Wenn Daten oft angefasst und gelesen werden. Hans-J¨urgen Sch¨onig May 7, 2015
  • 14.
    Wie sieht dasaus? 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}’:: -- Arrays and objects can be nested arbitrarily SELECT ’{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}’::json; Hans-J¨urgen Sch¨onig May 7, 2015
  • 15.
    Ordnung im Dokument(1) SELECT ’{"bar": "baz", "balance": 7.77, "active":false}’::json; json ------------------------------------------------- {"bar": "baz", "balance": 7.77, "active":false} (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 16.
    Ordnung im Dokument(2) SELECT ’{"bar": "baz", "balance": 7.77, "active":false}’::jsonb; jsonb -------------------------------------------------- {"bar": "baz", "active": false, "balance": 7.77} (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 17.
    Einfache Operationen (1) AufExistenz pr¨ufen test=# SELECT ’"foo"’::jsonb @> ’"foo"’::jsonb; ?column? ---------- t (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 18.
    Einfache Operationen (2) Ist“rechts” in “links” enthalten? test=# SELECT ’[1, 2, 3]’::jsonb @> ’[1, 3]’::jsonb; ?column? ---------- t (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 19.
    Einfache Operationen (3) Elementeextrahieren test=# SELECT ’[{"a":"foo"},{"b":"bar"}, {"c":"baz"}]’::json->2; ?column? ------------- {"c":"baz"} (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 20.
    Einfache Operationen (4) Objekte¨uber den Key holen test=# SELECT ’{"a": {"b":"foo"}}’::json->’a’; ?column? ------------- {"b":"foo"} (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 21.
    Einfache Operationen (5) AufPfade zugreifen test=# SELECT ’{"a": {"b":{"c": "foo"}}}’::json#>’{a,b}’; ?column? -------------- {"c": "foo"} (1 row) Hans-J¨urgen Sch¨onig May 7, 2015
  • 22.
    JSON erzeugen undzerlegen Hans-J¨urgen Sch¨onig May 7, 2015
  • 23.
    Relational -> Json RelationaleDaten k¨onnen sehr sehr einfach in ein json transformiert werden. Hans-J¨urgen Sch¨onig May 7, 2015
  • 24.
    Ein Beispiel test=# SELECTrow_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-J¨urgen Sch¨onig May 7, 2015
  • 25.
    jsons aggregieren test=# SELECTjson_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-J¨urgen Sch¨onig May 7, 2015
  • 26.
    Ein json alsTabelle darstellen test=# SELECT * FROM json_each(’{"a":"foo", "b":"bar"}’); key | value -----+------- a | "foo" b | "bar" (2 rows) Hans-J¨urgen Sch¨onig May 7, 2015
  • 27.
    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-J¨urgen Sch¨onig May 7, 2015
  • 28.
  • 29.
    json Indizierung Es istjederzeit m¨oglich, einzelne Elemente zu indizieren Funktionelle Indices sind immer m¨oglich GIN Indices sind jedoch praktischer. GIN indiziert JEDES Feld im json Hans-J¨urgen Sch¨onig May 7, 2015
  • 30.
    GIN: Ganz einfach.. CREATE INDEX idx_name ON t_table USING gin (json_field); Hans-J¨urgen Sch¨onig May 7, 2015
  • 31.
    Performance: Just two words:IT ROCKS ! Hans-J¨urgen Sch¨onig May 7, 2015
  • 32.
    GIN Internas GIN verwendetintern sehr effiziente varbit Encodings Der Index ist sehr klein Alle Felder sind indiziert Hans-J¨urgen Sch¨onig May 7, 2015
  • 33.
  • 34.
    PostgreSQL Bietet gute M¨oglichkeiten,unstrukturierte Daten zu speichern. Bei Bedarf sind Erweiterungen schnell zu schreiben Unstrukturierte Speicherung ist in einem relationalen Powerhouse m¨oglich Weitere Funktionalit¨at wird folgen. Hans-J¨urgen Sch¨onig May 7, 2015
  • 35.
    Finally . .. Gibt es Fragen? Hans-J¨urgen Sch¨onig May 7, 2015