SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
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

Mais conteúdo relacionado

Destaque

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

PostgreSQL: The NoSQL way

  • 1. PostgreSQL: The NoSQL Way Hans-J¨urgen Sch¨onig May 7, 2015 Hans-J¨urgen Sch¨onig May 7, 2015
  • 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
  • 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) Auf Existenz 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) 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. 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) 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. JSON erzeugen und zerlegen 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
  • 31. Performance: Just two words: IT ROCKS ! 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