postgresql: the nosql way

35
PostgreSQL: The NoSQL Way Hans-J¨ urgen Sch¨ onig May 7, 2015 Hans-J¨ urgenSch¨onig May 7, 2015

Upload: hans-juergen-schoenig

Post on 06-Aug-2015

103 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Page 1: PostgreSQL: The NoSQL way

PostgreSQL: The NoSQL Way

Hans-Jurgen Schonig

May 7, 2015

Hans-Jurgen SchonigMay 7, 2015

Page 2: PostgreSQL: The NoSQL way

Anforderung: Unstrukturierte Daten

Hans-Jurgen SchonigMay 7, 2015

Page 3: PostgreSQL: The NoSQL way

Strukturiert vs. Unstrukturiert

I Relationale Systeme speichern traditionell in strukturierterForm.

I Das Grundprinzip:

I “Think first”.I Erst die Struktur, dann die Daten

Hans-Jurgen SchonigMay 7, 2015

Page 4: PostgreSQL: The NoSQL way

Unstrukturierte Daten

I Der Inhalt kann sich zur Laufzeit andern.

I Felder kommen dazu, andern sich, etc.

I Das ist relational auch moglich:

I DDLs sind auf minimales Locking optimiert

Hans-Jurgen SchonigMay 7, 2015

Page 5: PostgreSQL: The NoSQL way

Strukturbruche

I Schwieriger wird es, wenn sich Beziehungen andern

I 1:1 auf 1:n oder m:nI Das ist nicht ganz einfach

I Spaltenanderungen und Typanderungen sind eher trivial

Hans-Jurgen SchonigMay 7, 2015

Page 6: PostgreSQL: The NoSQL way

Der NoSQL Ansatz

I Key / Value StoresI Ein verteilter Schlussel

Hans-Jurgen SchonigMay 7, 2015

Page 7: PostgreSQL: The NoSQL way

Die Problematik: Ein Beispiel

I Kann man ohne Struktur Software schreiben?

I Beispiel: Ein einfacher Punkt . . .

I Ein normaler Punkt: (x, y)

I GPS:

I 48 07’29.0“N 16 33’27.0”EI 48.124722, 16.557500

I Nord / Sud ist eigentlich die y-Koordinate

Hans-Jurgen SchonigMay 7, 2015

Page 8: PostgreSQL: The NoSQL way

Struktur

I Es muss also irgendwo immer Wissen uber die Struktur geben.

I Entweder in der Applikation oder in der Database

Hans-Jurgen SchonigMay 7, 2015

Page 9: PostgreSQL: The NoSQL way

PostgreSQL Funktionalitat

Hans-Jurgen SchonigMay 7, 2015

Page 10: PostgreSQL: The NoSQL way

Neue Datentypen

I PostgreSQL stellt spezielle Datentypen fur generischeDatenbestande zur Verfugung:

I hstoreI jsonI jsonb

I Json folgt RFC 7159

Hans-Jurgen SchonigMay 7, 2015

Page 11: PostgreSQL: The NoSQL way

hstore: Key / Value Store

I hstore ist der traditionelle Key / Value StoreI hstore hat ein proprietares FormatI Schon seit vielen Jahren verfugbarI hochkompaktes Format

Hans-Jurgen SchonigMay 7, 2015

Page 12: PostgreSQL: The NoSQL way

json Dokumente

I Der json-Datentyp validiert json Daten

I Intern wird als Text gespeichert

I Spezielle Operatoren konnen direkt auf das json Dokumentlosgelassen werden

I Einsatz: Ideal fur Daten, die fast nie analysiert werden undschnell geschrieben werden mussen.

Hans-Jurgen SchonigMay 7, 2015

Page 13: PostgreSQL: The NoSQL way

jsonb: Binares json

I PostgreSQL zerlegt das json und legt es intern binar ab.

I Dabei werden bei er Speicherung alle Register gezogen, umdas moglichst klein zu machen.

I Es muss nie wieder geparst werden.

I Einsatz: Wenn Daten oft angefasst und gelesen werden.

Hans-Jurgen SchonigMay 7, 2015

Page 14: PostgreSQL: The NoSQL way

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}’::json;

-- Arrays and objects can be nested arbitrarily

SELECT ’{"foo": [true, "bar"],

"tags": {"a": 1, "b": null}}’::json;

Hans-Jurgen SchonigMay 7, 2015

Page 15: PostgreSQL: The NoSQL way

Ordnung im Dokument (1)

SELECT ’{"bar": "baz", "balance": 7.77,

"active":false}’::json;json

-------------------------------------------------

{"bar": "baz", "balance": 7.77, "active":false}(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 16: PostgreSQL: The NoSQL way

Ordnung im Dokument (2)

SELECT ’{"bar": "baz", "balance": 7.77,

"active":false}’::jsonb;jsonb

--------------------------------------------------

{"bar": "baz", "active": false, "balance": 7.77}(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 17: PostgreSQL: The NoSQL way

Einfache Operationen (1)

I Auf Existenz prufen

test=# SELECT ’"foo"’::jsonb @> ’"foo"’::jsonb;

?column?

----------

t

(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 18: PostgreSQL: The NoSQL way

Einfache Operationen (2)

I Ist “rechts” in “links” enthalten?

test=# SELECT ’[1, 2, 3]’::jsonb @> ’[1, 3]’::jsonb;

?column?

----------

t

(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 19: PostgreSQL: The NoSQL way

Einfache Operationen (3)

I Elemente extrahieren

test=# SELECT ’[{"a":"foo"},{"b":"bar"},{"c":"baz"}]’::json->2;

?column?

-------------

{"c":"baz"}(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 20: PostgreSQL: The NoSQL way

Einfache Operationen (4)

I Objekte uber den Key holen

test=# SELECT ’{"a": {"b":"foo"}}’::json->’a’;?column?

-------------

{"b":"foo"}(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 21: PostgreSQL: The NoSQL way

Einfache Operationen (5)

I Auf Pfade zugreifen

test=# SELECT ’{"a": {"b":{"c": "foo"}}}’::json#>’{a,b}’;?column?

--------------

{"c": "foo"}(1 row)

Hans-Jurgen SchonigMay 7, 2015

Page 22: PostgreSQL: The NoSQL way

JSON erzeugen und zerlegen

Hans-Jurgen SchonigMay 7, 2015

Page 23: PostgreSQL: The NoSQL way

Relational -> Json

I Relationale Daten konnen sehr sehr einfach in ein jsontransformiert werden.

Hans-Jurgen SchonigMay 7, 2015

Page 24: PostgreSQL: The NoSQL way

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-Jurgen SchonigMay 7, 2015

Page 25: PostgreSQL: The NoSQL way

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-Jurgen SchonigMay 7, 2015

Page 26: PostgreSQL: The NoSQL way

Ein json als Tabelle darstellen

test=# SELECT *

FROM json_each(’{"a":"foo", "b":"bar"}’);key | value

-----+-------

a | "foo"

b | "bar"

(2 rows)

Hans-Jurgen SchonigMay 7, 2015

Page 27: PostgreSQL: The NoSQL way

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-Jurgen SchonigMay 7, 2015

Page 28: PostgreSQL: The NoSQL way

Indizierung

Hans-Jurgen SchonigMay 7, 2015

Page 29: PostgreSQL: The NoSQL way

json Indizierung

I Es ist jederzeit moglich, einzelne Elemente zu indizieren

I Funktionelle Indices sind immer moglich

I GIN Indices sind jedoch praktischer.

I GIN indiziert JEDES Feld im json

Hans-Jurgen SchonigMay 7, 2015

Page 30: PostgreSQL: The NoSQL way

GIN: Ganz einfach ..

CREATE INDEX idx_name ON t_table USING gin (json_field);

Hans-Jurgen SchonigMay 7, 2015

Page 31: PostgreSQL: The NoSQL way

Performance:

I Just two words: IT ROCKS !

Hans-Jurgen SchonigMay 7, 2015

Page 32: PostgreSQL: The NoSQL way

GIN Internas

I GIN verwendet intern sehr effiziente varbit EncodingsI Der Index ist sehr kleinI Alle Felder sind indiziert

Hans-Jurgen SchonigMay 7, 2015

Page 33: PostgreSQL: The NoSQL way

Conclusion

Hans-Jurgen SchonigMay 7, 2015

Page 34: PostgreSQL: The NoSQL way

PostgreSQL

I Bietet gute Moglichkeiten, unstrukturierte Daten zu speichern.

I Bei Bedarf sind Erweiterungen schnell zu schreiben

I Unstrukturierte Speicherung ist in einem relationalenPowerhouse moglich

I Weitere Funktionalitat wird folgen.

Hans-Jurgen SchonigMay 7, 2015

Page 35: PostgreSQL: The NoSQL way

Finally . . .

Gibt es Fragen?

Hans-Jurgen SchonigMay 7, 2015