PostgreSQL: The NoSQL way

778 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
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

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

Keine Downloads
Aufrufe
Aufrufe insgesamt
778
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
342
Aktionen
Geteilt
0
Downloads
9
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

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

×