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