Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

PostgreSQL: The NoSQL way

1.112 Aufrufe

Veröffentlicht am

PostgreSQL is not only a relational database - it also provides powerful NoSQL functionality such as superior JSON support and so on.

Veröffentlicht in: Daten & Analysen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

PostgreSQL: The NoSQL way

  1. 1. PostgreSQL: The NoSQL Way Hans-J¨urgen Sch¨onig May 7, 2015 Hans-J¨urgen Sch¨onig May 7, 2015
  2. 2. Anforderung: Unstrukturierte Daten Hans-J¨urgen Sch¨onig May 7, 2015
  3. 3. 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
  4. 4. 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
  5. 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. 6. Der NoSQL Ansatz Key / Value Stores Ein verteilter Schl¨ussel Hans-J¨urgen Sch¨onig May 7, 2015
  7. 7. 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
  8. 8. 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
  9. 9. PostgreSQL Funktionalit¨at Hans-J¨urgen Sch¨onig May 7, 2015
  10. 10. 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
  11. 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. 12. 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
  13. 13. 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
  14. 14. 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
  15. 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. 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. 17. 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
  18. 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. 19. 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
  20. 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. 21. 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
  22. 22. JSON erzeugen und zerlegen Hans-J¨urgen Sch¨onig May 7, 2015
  23. 23. Relational -> Json Relationale Daten k¨onnen sehr sehr einfach in ein json transformiert werden. Hans-J¨urgen Sch¨onig May 7, 2015
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 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. 28. Indizierung Hans-J¨urgen Sch¨onig May 7, 2015
  29. 29. 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
  30. 30. GIN: Ganz einfach .. CREATE INDEX idx_name ON t_table USING gin (json_field); Hans-J¨urgen Sch¨onig May 7, 2015
  31. 31. Performance: Just two words: IT ROCKS ! Hans-J¨urgen Sch¨onig May 7, 2015
  32. 32. 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
  33. 33. Conclusion Hans-J¨urgen Sch¨onig May 7, 2015
  34. 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. 35. Finally . . . Gibt es Fragen? Hans-J¨urgen Sch¨onig May 7, 2015

×