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. 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. 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: 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. 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
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. 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-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. 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. 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
23. Relational -> Json
Relationale Daten k¨onnen sehr sehr einfach in ein json
transformiert werden.
Hans-J¨urgen Sch¨onig
May 7, 2015
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. 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. 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. 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
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. GIN: Ganz einfach ..
CREATE INDEX idx_name ON t_table USING gin (json_field);
Hans-J¨urgen Sch¨onig
May 7, 2015
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
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