Transcript: PP05 - Datenbanken

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Ja, hallo liebe Hörerinnen und Hörer. Willkommen beim Python-Podcast in der mittlerweile fünften Episode.

Heute geht es ein bisschen um Datenmanken.

Ja, wir haben wieder diesen schönen Wintergarten vor uns.

Ich bin der Dominik und natürlich dabei ist wie immer der Jochen.

Jo, hallo. Genau, Datenmanken. Ja, voll gut. Da freue ich mich schon drauf.

Das ist irgendwie ein Thema, mit dem ich schon viel zu tun hatte.

Das wird wahrscheinlich eine ein bisschen längere Episode.

Wir versuchen wieder ein bisschen Struktur reinzubekommen.

Wir wissen noch nicht ganz, ob das gelingt. Wir werden wieder hemmungslos abschweifen.

Wenn ihr Fragen, Anmerkungen dazu habt, Kommentare, Lob, alles, was ihr uns mitteilen wollt,

schickt eine E-Mail an hallo at python-podcast.de

Und wie immer findet ihr die Links und zusätzliche Infos der Sendung in den Shownotes.

Ja, wollen wir das eigentlich vielleicht noch erwähnen, welches Datum wir haben?

Heute ist der 24.02.2019.

Oh, wir machen jetzt mit Daten. Ja, finde ich gut.

Genau, wir haben das glaube ich schon mal gemacht.

Ja, haben wir das schon mal gemacht?

Ja, ich glaube in der ersten. Und dann haben wir es irgendwie nicht mehr gemacht.

Aber ich glaube, es ist wahrscheinlich eigentlich ganz interessant, wenn man das hört,

von wann das aufgenommen wurde.

Ja, stimmt. Ende Februar 19.

Und es ist gerade ganz gutes Wetter und es ist ein Sonntag.

Ja.

Normalerweise nehmen wir immer abends auf.

Heute ausnahmsweise mal nach dem Brunchen.

War irgendwie super lecker.

Ja, ich würde sagen, wir steigen fast direkt ins Thema ein.

Und es geht halt so ein bisschen darum, ja, das ist glaube ich nicht das erste Mal,

dass wir versuchen, so eine Folge mit Datenbanken zu strukturieren.

Das war auch der Grund, warum wir so ein bisschen länger auf die letzte Folge warten mussten.

Hatten wir ja kurz erwähnt.

Ja, was ist überhaupt so eine Datenbank, Jochen?

Und wir versuchen halt immer wieder, euch vielleicht kurz zu erklären,

was man damit noch mit Python machen kann oder welche Module es dafür gibt.

Aber das vielleicht mal als Warnung.

Python kommt in dieser Folge nicht nur vor und nicht ganz so viel,

sondern es geht halt tatsächlich darum, wie man das, was man mit Python macht,

also die Datenbanknutzung, so ein bisschen euch erklären, näher bringen kann.

Ja, wobei ich denke, dass das halt eigentlich für alle, die Python entwickeln wollen,

ein interessantes Thema ist, weil da wird man, egal in welchem Bereich man sich da tummelt,

nicht drumherum kommen, irgendwann etwas mit Datenbanken zu machen.

Und ja, dafür muss man sich halt dann auch nicht nur mit Python auskennen,

sondern muss halt auch so ein bisschen verstehen, wie das mit den Datenbanken funktioniert.

Und man kann halt nicht viel interessante Dinge machen,

wenn man halt von Datenbanken da gar nichts versteht.

Und insofern, ja.

Ja, wir werden noch ein bisschen darauf eingehen, was ist das überhaupt, ne?

Datenbanken, Unterschiede in einzelnen Datenbanktypen, ein bisschen darstellen.

Und wir wollen anhand eines kleinen Beispiels euch so ein bisschen so die Problematiken beim Skalieren

und bei dem Arbeiten mit der Datenbank erklären.

Genau.

Und da haben wir uns gedacht, nehmen wir einfach irgendwie etwas, was man halt kennt.

Ich meine, wozu ist das Internet da?

Irgendwie Dinge einkaufen, klar, weiß man ja.

So ein Buchladen, habe ich gehört, können wir als Beispiel nehmen.

Und genau, Amazon hat bestimmt die da schon mal benutzt und weiß halt, wie das funktioniert.

Und das ist halt eigentlich, denke ich, ein ganz gutes Beispiel für, wofür braucht man eigentlich Datenbanken?

Weil die haben wahrscheinlich auch für fast alle Datenbanktypen irgendwie eine Anwendung.

Und daran kann man das vielleicht ganz gut erklären.

Ja, dann vielleicht fangen wir erstmal einfach an.

Also mit was würde man einfacherweise anfangen?

Wenn man jetzt Python hat, möchte Daten haben, man könnte ja einfach so ein Dictionary jetzt nehmen oder sich eine

Liste erstellen und da irgendwie über Indizes iterieren.

Dann hätte man ja sowas wie einen kleinen Datensatz schon mal.

Ja, wenn man das Ganze jetzt mit etwas komplizierteren Daten braucht.

Wir hatten eben, glaube ich, im Vorgespräch ganz kurz über Struktur gesprochen.

Da gibt es eine Struktur, die man sich ausdenken muss.

Das ist gar nicht so trivial.

Das ist recht wichtig, dass man da so ein bisschen mehr Gedanken dazu macht.

Wie sieht denn meine Struktur der Daten überhaupt aus?

Und was soll ich denn damit machen?

Wie würdest du da direkt vorgehen?

Ja, also das ist halt, das kommt tatsächlich.

Auf den Anwendungsfall an und was ich halt in der Praxis im letzten Jahrzehnten so durchgesetzt

hat, sind relationale Datenbanken.

Aber es gibt halt auch diverse andere Arten von Datenbanken und die haben alle so ihre

Berechtigung.

Alle, die das noch nicht drauf haben, also so SQL oder NoSQL.

Ja, genannt oft.

Ja, genau.

Und ja, es hängt halt davon ab.

Also man kann natürlich auch einfach Objekte, Python-Objekte nehmen, die irgendwie serialisieren.

Nennt man das?

Also zum Beispiel gibt es da in der Steine.

In der Bibliothek das Pickle-Modul für, was halt aus einem Python-Objekt, das irgendwie

beliebig aussehen kann, macht das halt eine String- oder Byte-Repräsentation.

Also eine Serialisierung ist tatsächlich irgendwie die Darstellung als Zeichenkette

oder Byte-Strecke, damit man die übertragen kann über einen Kanal oder sowas.

Ja, genau.

Das nennt man Serialisierung.

Ist auch im Kontext von Datenbanken eine sehr wichtige Geschichte.

Und man könnte jetzt zum Beispiel diese Byte-Folgen oder Strings nehmen und die String-Folgen

halt zahlenweise in einen Pfeil reinschreiben und dann hinterher auch wieder auslesen.

Also man nimmt einfach zum Beispiel, wenn man jetzt den State von irgendeinem Programm

speichern möchte, nimmt man einfach alle Objekte, die man jetzt so findet oder die man sich

irgendwo gemerkt hat, dass man sie hat und serialisiert die halt in Pfeilen, schreibt

das Ganze in einen Pfeil.

Genau so habe ich das auch bei meiner ersten versuchten Datenbank-Operation selber gemacht,

nämlich einfach so die Daten, die ich hatte.

Es ging da um so Spielerdaten aus dem Sport, habe ich einfach alle Informationen über

einen Spieler in einem Spiel.

Und dann habe ich das Ganze in einem Spiel.

Und dann habe ich das Ganze in einem Spiel.

Und dann habe ich das Ganze in einem Spiel.

Und dann habe ich das Ganze in einem Spiel.

Und dann habe ich das Ganze in eine Zeile gepackt und die zahlenweise in eine Datei

reingeschrieben.

Genau.

Und dann, wenn man jetzt den Status wiederherstellen will des Programms, wenn man das startet,

dann nimmt das einfach die Datei, liest alles wieder ein und dann ist das im gleichen Zustand

wie vorher.

Und genau, wenn man das mit Python-Objekten macht, dann ist es halt nicht mehr menschenlesbar.

Aber man kann das halt genauso machen, indem man halt CSV schreibt oder sowas halt.

Dann wäre es halt noch menschenlesbar.

Da muss man sich halt überlegen, wie man die CSV.

in Objekte verwandelt oder Objekte wieder in CSV-Zeilen.

Ich habe einfach den Dictionary-Code in eine Teile reingeschrieben, habe das dann ausgelesen und evaluiert.

Das war wahrscheinlich nicht die beste Methode, das zu tun, aber funktioniert hat es trotzdem.

Genau.

Und wenn man sowas macht, das wurde am Anfang irgendwie bei Web-Entwicklung auch häufig gemacht.

Das nannte sich dann Flat-Files, Datenbank mit Flat-Files.

Man hat einfach den State da irgendwie rein.

Und natürlich ist auch das File-System ja schon irgendwie eine Art Datenbank.

Das ist halt eine hierarchische Datenbank, die halt so eine Baumstruktur hat.

Und deren Blätter halt Files sind, Wurzel ist halt Root/ bei Unix-Systemen oder bei Windows ist es irgendwie was komisches mit dem Laufwerksbuchstaben.

Und ja, das ist natürlich auch eine Struktur.

Man hat halt irgendwie darüber die Verzeichnis-Lese, die es da gibt, auch schon so Metadaten definiert, dass man halt weiß, so bestimmte Sachen sind halt in bestimmten Verzeichnissen so.

Und das Ganze gibt es halt auch über Netzwerk-Geschichten, indem man das so hierarchisch, die bekannteste hierarchische Datenbank im Netz.

Das ist halt so was wie LDAP, Windows nennt das irgendwie Active Directory oder ist auch vielleicht noch ein bisschen komplizierter.

Und ja, das ist halt schon mal eine grundsätzliche Art, wie man wie man Datenbanken betreiben kann.

Aber vielleicht etwas, was ich mich ganz gerne auch noch mal einsetzen würde, ist, wie Leute, also wenn man jetzt sich überlegt, wo könnten Leute etwas, das man sonst vielleicht mit Datenbanken tun könnte, irgendwie schon mal gesehen haben?

Oder was machen viele Leute?

Und wenn das halt eigentlich auch gut in den Datenbank-Kontext passt, dann würde ich vielleicht sogar eher mit sowas wie Excel oder so anfangen, weil das wird dann oft so scherzhaft auch erwähnt, wenn man sich überlegt, was ist die meisten verwendete, meisten ausgerollte Datenbank-Lösung der Welt, dann könnte man auch sagen, das ist halt Excel, weil viele Leute halt Excel quasi als Datenbank benutzen.

Allen möglichen Quatschen, irgendwelche Spalten und Teilen reinschreiben und ganz, ganz, ganz, ja.

Das ist, genau, das ist halt eigentlich, ach so, und vielleicht sollte man sich erstmal grundsätzlich überlegen, stimmt, wenn man schon so anfängt zu erklären, was Datenbanken sind, was ist denn eigentlich Daten, was sind eigentlich Informationen, was sind eigentlich Wissen, da hört man umgangssprachliche Definitionen, die halt, wo man dann weiß, was das ungefähr sein soll, aber wenn man das jetzt aus dem Datenbank-Kontext her präzisieren möchte, dann geht das eigentlich auch relativ schmerzlos, also Daten sind halt sowas wie, also ein Datum wäre,

irgendwas mit minus 3,5, wäre jetzt ein Datum, einfach nur ein Zahlenwert oder so, und das sagt einem halt natürlich noch nichts.

Weil es ja kein Bezug dafür ist, minus 3,5, was denn?

Ja, genau, richtig.

Grad Fahrenheit, ne?

Und, ja, wenn man jetzt von Informationen spricht, dann spricht man von Daten, die halt schon so ein bisschen Kontext haben, also sowas wie minus 3,5 Grad Temperatur, das heißt, man weiß halt, das steht jetzt in der Temperaturspeise,

und damit weiß man schon mal so ein bisschen, worum es da überhaupt geht, und dann nimmt man das Informationen, und das, was man aber eigentlich in Datenbanken speichern möchte, und dann was machen möchte, das ist irgendwie so Wissen, Begriff dafür ist Wissen,

und das wäre dann halt, wenn man jetzt eine ganze Reihe von Temperatursensoren hätte, die halt nicht nur die Temperatur über die Zeit irgendwie aufgenommen haben, sondern halt auch noch deren Positionen hat,

in einer Struktur, die halt bestimmte Anfragen leichter macht, halt gespeichert hätte, dann kann man damit möglicherweise das Wetter vorhersagen, oder sowas.

Das heißt, man hat halt Wissen über, wie das Wetter gerade ist, oder wie es war.

Oder man weiß zum Beispiel, dass es im Winter kälter wird als im Sommer.

Ja, genau, und dann kann man halt, wenn man Abfragen daran stellt, dann halt Schlussfolgerungen daraus ziehen, und dann vielleicht Dinge vorhersagen, oder halt auch einfach bestimmte Fragen beantwortet bekommen, die einen interessieren.

Also alle Städte, in denen es letztes Jahr kälter war, so und so, oder irgendwie sowas.

Ja, genau, das ist das, wofür man eigentlich Datenbanken verwenden möchte.

Oh, da kann man auch Analysen irgendwann machen. Das ist aber dann, glaube ich, wieder ein neues Thema, wie man Analysen dann mit Daten fährt.

Die werden wir heute, glaube ich, nicht machen.

Doch, doch, doch.

Ja, doch, doch, doch, alle.

Okay, ihr müsst heute lange, lange Geduld mitbringen, oder eine große Runde durch den Park, oder ihr könnt gerne zur Wohnung putzen, heute.

Ja, ich bin mal gespannt, wie schnell wir da durchkommen.

Aber ja, ich denke, das ist eigentlich vielleicht ganz interessant, mal so einen groben Überblick, also ich versuche dann zu verhindern,

zu sehr ins Detail zu gehen, aber wenn man einfach mal so das Gesamtthema Datenbanken mal überblickt hat.

Ja, ich halte ich so ungern davon ab, so ins Detail zu gehen, weil ich finde das unheimlich interessant, was da alles noch so drinter steckt.

Ich bin ja sehr curious, was man noch alles so findet und die Details sind halt auch irgendwie wichtig, ja.

Ja, stimmt. Wir schauen einfach mal. Ich hoffe mal, dass es nicht allzu lang wird, aber.

Okay, ja, dann fangen wir doch direkt mal mit dem Beispiel an, oder wolltest du noch so ein paar grundsätzliche Dinge über Daten?

Einmal grundsätzlich darüber, was gibt es für unterschiedliche Arten von Datenbanken, auch um halt dann, ja,

ja, um darauf dann wieder Bezug nehmen zu können in dem Beispiel und vielleicht auch das, was halt sich jetzt durchgesetzt hat.

Jedenfalls, das ist halt eben hierarchische Datenbanken, gab es schon ganz lange und ja, Sachen in Flatfiles oder irgendwie strukturierten Dateien hat man auch schon lange.

Und dann irgendwann 1971, glaube ich, ist ein Paper rausgekommen von Ted Kott und der hat sich halt Gedanken darüber gemacht, wie man eigentlich dieses Problem, ich möchte wissen, irgendwie speichern und dann irgendwie

Dinge damit später machen, wie man das so grundsätzlich angehen sollte und dessen Idee war halt, also ein Problem, was er gesehen hat mit den bisherigen Ansätzen war, dass viele Leute Zeit damit verbracht haben, die Daten, die sie halt schon auch irgendwie strukturiert, aber halt im eigenen Format in Dateien gespeichert haben, da Algorithmen für zu schreiben, wie die jetzt abzufragen sind.

Also, wenn man jetzt eben so eine Frage beantwortet haben möchte, wie, keine Ahnung.

Wie viel, was war denn jetzt die Stadt, in der es letztes Jahr am kältesten war in Deutschland oder so, dann fingen Leute an, dann Algorithmen zu schreiben, die für die Art, wie sie die Daten gespeichert hatten, halt, ja, das Problem gelöst haben, genau.

Und jeder, der halt die Daten irgendwie anders speichert, muss sich halt einen neuen Algorithmus überlegen, wie er das macht.

Und das ist ja eigentlich ziemlich blöde, also das wäre irgendwie schlauer, wenn man das standardisieren könnte und also nicht...

...sich überlegt, welchen Algorithmus oder einen Algorithmus zu schreiben, der halt das irgendwie abfragt, sondern zu beschreiben, was man haben möchte und dann irgendeine Art von Datenbank-Management-System, das dann halt weiß, wie man irgendwie diverse Arten von Indizes baut oder so, dem diese formalisierte Anfrage vorzulegen und das Ding sucht sich dann die beste Art, wie man das dann löst raus und macht das dann für einen.

Und damit das alles gut geht, muss man halt die Daten auch in einem bestimmten Format...

...speichern und man sollte die halt in Form von Relationen speichern.

Das heißt im Grunde mehr oder weniger wie in Tabellen, man kennt das halt aus Excel, wobei viele Excel-Tabellen halt nicht die Anforderungen erfüllen, die man eigentlich sozusagen dann dran stellen würde.

Weil in unterschiedlichen Spalten oder Zahlen irgendwie unterschiedliche Dinge drinstehen, die dann nicht zu suchen haben, oder?

Ja, weil sie halt nicht normalisiert sind, weil es nicht so wirkliche...

Oh, jetzt kommen wir direkt mit den Normalisierungen, ja.

Weil es nicht wirkliche Beziehungen zwischen Tabellen gibt und das in Datenbanken gibt es halt alles schon.

Und da gibt es dann auch bestimmte Regeln und Constraints irgendwie überprüft und so.

Tabellen, die auf Tabellen zeigen oder sowas.

Genau, genau.

Ja, und das wird in Excel halt alles nicht gemacht.

Und ja, das ist halt, das ist in der Praxis ein relativ großes Problem, denke ich.

Das ist halt, ich habe das, auf den kommen wir später noch zurück vielleicht.

Der heißt Simon Willison, der hat für den Guardian...

Vor zehn Jahren ungefähr irgendwie so im Bereich Datenjournalismus irgendwie, da gab es das schon.

Heute ist das ein großes Thema, aber damals hat das irgendwie keinen so richtig interessiert gearbeitet.

Und der ist halt eher so, hat was mit Datenbanken da zu tun.

Und da gab es schon jemanden, der sich damit beschäftigt hat, also von der Zeitung her.

Wenn es ein Artikel über irgendein Thema Arbeitslosigkeit oder keine Ahnung, irgendwas wirtschaftliche Themen irgendwie ging.

Wenn man da Schaubilder und Diagramme reinmachen wollte.

Wo kommen denn die Daten dafür eigentlich her?

Und er kannte irgendwie in allen Institutionen Leute, die er nach diesen Daten fragen konnte.

Wusste, wo man die bekommt und so, super.

Aber das Problem ist jetzt, also der Simon Willison, also er aus der Programmiererecke,

wollte halt die Daten auch anders noch zugänglich machen.

Und wollte halt gucken, ob man da nicht übergreifend irgendwelche Anfragen stellen kann.

Und fragte den dann so, wo denn die Daten wären oder wie er die denn speichern würde.

Und der sagte so, oh ja, ich habe da hier irgendwie ein paar tausend.

Excel-Files auf meinem Desktop.

Und da sind die halt drin.

Und ich weiß halt, in welchen Daten, in welchen Files.

Da ist so ein Ordner im Schrank, da kann ich mal blättern.

Und ich glaube, das ist tatsächlich eine Situation, die in vielen Unternehmen so ist oder so.

Dass man halt dann Experten hat dafür, für diese Domänen.

Die Menschen aus dem Archiv.

Ja, die aber dann nicht unbedingt jetzt so Datenmarktspezialisten sind.

Und die machen dann halt Excel-Files und tun das irgendwo hin.

Aber das funktioniert halt nicht gut, weil...

Man kann darüber jetzt keine übergreifenden Anfragen stellen.

Dann hat man auch so ein Problem, wenn man mit Leuten zusammenarbeitet.

Ja, wie ist das eigentlich, wenn mehrere Leute das jetzt ändern?

Dann gibt es auch wieder so komische Strategien, wie man hat das dann irgendwie auf einem Netzwerk-Share.

Und dann muss man sich irgendwie Bescheid sagen, wenn man das ändert.

Oder man macht das irgendwie über komisch benannte Dateinamen oder sowas.

Und das ist natürlich alles total furchtbar.

Also man benutzt dann im Grunde zwei Datenbanken, die nicht wirklich dafür geeignet sind,

was man dann macht.

Nämlich einmal das Filesystem, um halt so eine Art Versionskontrolle zu machen.

Und dann Excel als Datenbank, was halt auch nicht dafür geeignet ist.

Und dann macht man sich das Leben sehr, sehr schwer.

Obwohl es deutlich einfacher sein könnte.

Und ja, das sind aus meiner Perspektive auch so die beiden Dinge, wo man...

Wenn man Daten organisieren möchte.

Wenn man in Firmen so leichte Gewinne, die man machen könnte.

Also die beiden Themen, die halt vollkommen unter...

Unterschätzt sind, aus meiner Perspektive, sind einmal Versionskontrolle.

Also das sehe ich ganz oft, dass halt jetzt...

Also bei Programmierern, die wissen inzwischen, wie das funktioniert und machen das halt auch.

Und bei denen ist halt Verständnis, was jetzt Git ist und wie man das verwendet,

irgendwie durchaus angekommen.

Immer bitte den Git-Flow.

Ja.

Aber in den meisten anderen Abteilungen, wo es nicht um Programmieren geht,

die haben von solchen Dingen noch nie irgendwas gehört.

Da nimmt man Tipp-X und mal da kurz die Buchstaben, die falsch sind, raus und malt dann da drüber.

Und wenn man wüsste, was da vorher stand, dann muss man das Tipp-X abkasten.

Ja, die wissen halt vielleicht, wie sie ihre Programme bedienen oder so.

Aber die wissen gar nicht, dass sowas geht.

Und wissen gar nicht, wie das geht.

Und machen dann sehr umständlich das, was ihnen arbeitet.

Sehr fehleranfällig, die ihnen Git oder...

Tabelle 1, Tabelle 1 neu, Tabelle 1 neu, neu, neu, final.

Und ja, jetzt jetzt wirklich.

Also da könnte man mit wenig Aufwand...

Reichen.

Und eben auch da irgendwie, wenn man Daten speichert und halt auch...

Man hat ja in Excel dann oft nicht nur Daten, sondern man hat dann Daten und Logik,

weil man jetzt irgendwelche Reports erzeugt für irgendwie ein Management-Layer oder so.

Und dann ist das viel Handarbeit, wo im Grunde man, wenn man jetzt ein bisschen...

Ich habe das gerade gehört, das war gerade ein super kurzer kleiner Nebensatz.

Wenn man kurz irgendwelche Daten erzeugt, so für den Management-Layer.

Ja, das ist, denke ich, in Grundform viel.

Wenn die Leute da so Excel mit irgendwelchen Makros drin oder irgendwelche Skript-Schnipseln drin haben, warum die das verwenden.

Ja, das Problem ist halt, das funktioniert meistens und dann funktioniert es irgendwann nicht mehr oder die Daten ändern sich.

Und dann muss man halt irgendwie einen Teil von einem VBA-Skript oder so irgendwie so ein bisschen anpassen.

Und dann geht was an der anderen Stelle kaputt.

Und dann ist es auch so, dass man oft Sachen von Hand gefixt hat.

Also irgendwelche Werte sind halt nicht so, wie sie sein sollen.

Und bei Excel klickt man dann da rein und dann ändert man den Wert halt.

Und dann weiß man aber nicht, dass man das gemacht hat.

Und dann kommen jetzt neue Daten rein.

Die sind wieder falsch.

Und dann muss man es wieder ändern.

Oder es geht halt kaputt oder so.

Und das ist einfach so aus einer Programmierersicht nicht so das, was man tun sollte.

Das geht man dann mit Stunden, um Stunden, um Stunden, um Stunden.

Genau, aus Programmierersicht ist es so, wenn ich da irgendwie was ändere, dann ist das halt irgendwie Programmlogik.

Und wenn dann neue Daten reinkommen, dann wird die halt genauso angewendet.

Und dann muss ich das halt nur einmal hinschreiben.

Und dann ist es sozusagen für immer irgendwie gelöst.

Und ja, es gibt auch ganz in VBAs natürlich noch so ein...

Extra-Problem.

Das soll übrigens bei Python gehen, habe ich gehört.

Ja, ich weiß, dass bei Microsoft gibt es irgendwie so ein...

Die haben da auch so ein Priorisierungstool sozusagen.

Ich weiß nicht genau, was das ist.

Und ich glaube, das meiste nach Requested Feature ist es, VBA durch Python zu ersetzen.

Mit irgendwie tausenden Upvotes.

Aber ich glaube, definitiv dazu geäußert, ob das irgendwie dann kommt, hat sich da auch noch niemand.

Aber das wäre natürlich auch eine interessante Geschichte.

Aber man hat auch bei Python dann immer noch das Problem, was man halt wahrscheinlich...

eigentlich nicht machen können wird, ist sowas wie mit PIP irgendwie Dinge nachinstallieren oder so.

Selbst wenn es mit Python jetzt die VBA ersetzen würde.

Gut, man hätte schon den Vorteil natürlich, dass die Standard-Bibliothek von Python sehr viel mächtiger ist,

als das, was VBA kann.

Aber es ist halt immer noch nicht...

Also es gibt diverse Probleme, die noch gelöst werden müssten, damit das alles wirklich smooth ist.

Und das Grundproblem ist natürlich, dass Excel das vollkommen ungeeignete Tool ist für vieles,

was da in dem Bereich gemacht wird.

Ja, aber genau.

Also eigentlich wäre das, was viele Leute damit machen,

die wären viel besser bedient, wenn sie halt Python nehmen würden und eine relationale Datenbank.

Und weil die eben diese ganzen Geschichten auch löst.

Da gibt es dann halt, wenn da mehrere Leute drauf zugreifen und Dinge ändern,

dann sorgt die Datenbank dafür, oder das Datenbank-Management-System,

dass da nichts schief geht, dass alle Leute immer die gleichen Daten sehen,

jedenfalls innerhalb von einer Transaktion und so.

Und da gibt es auch die ganze Zugriffskontrolle und all das ist alles schon fertig implementiert.

Und ja, das ist halt so das, was Leute im Grunde verstehen, wenn man von Datenbanken spricht, denke ich.

Aber es gibt halt auch noch eine ganze Menge anderer Datenbanken.

Und dass sich relationale Datenbanken so durchgesetzt haben, ist auch aus meiner Perspektive ein Stück weit Glück.

Oder hängt halt an der Geschichte von einzelnen Firmen.

Also man hätte sich auch durchaus vorstellen können, dass sich andere Paradigmen durchgesetzt haben.

Hätten, haben sie aber irgendwie nicht.

Und jetzt sind halt so relationale Datenbanken das, was alle irgendwie verwenden.

Aber es ist auch gar nicht so ein schlechter Ansatz.

Insofern kann man damit eigentlich ganz gut leben.

Aber nur mal so um...

Der Vollständigkeit halber, ja.

Ja, der Vollständigkeit halber, um mal zu sagen, was es sonst noch alles gibt.

Es gibt halt Dokumentendatenbanken.

Ja, gibt es auch schon ganz lange.

LotusNotes ist ja so ein Beispiel für...

Populär.

CouchDB, MongoDB, die fallen auch in diesen Dokumentendatenbank-Bereich rein.

Lösen halt so ein bisschen unterschiedliche Probleme.

CouchDB löst so ein bisschen das Problem, dass ich nicht unbedingt in einen zentralen Master immer reinschreiben will.

Weil der halt auch weg sein kann, wenn ich zum Beispiel offline bin oder so.

Dann kann ich halt nicht da reinschreiben.

Sondern muss dann halt eventuell erst lokal schreiben.

Und dann irgendwie die Daten synchronisieren hinterher.

Und das macht CouchDB sehr schlau.

Verwendet tatsächlich auch einen Algorithmus, der aus dem LotusNotes-Dings-Projekt kommt.

Es gibt Key-Value-Stores, wo man einfach nur irgendeinen Hash irgendwie...

Also man kann sich das vorstellen wie ein Python-Dict.

Wo man halt irgendwelche Keys hat.

Und dann hat man irgendwelche Werte, die man dann zurückbekommt, wenn man den Key da hinschickt.

Darunter fallen so Sachen wie Redis oder Memcached.

Oder so oft zum Cache.

Aber manchmal können sie auch kompliziertere Sachen oder weiter strukturierte Daten.

Berkeley-DB war lange ganz groß.

Heute gar nicht mehr so sehr verwendet.

Ja, aber auch sowas wie Amazon Dynamo oder so fällt da auch drunter.

Und dann gibt es halt noch so spaltenorientierte Datenbanken.

Wobei ich auch da sagen würde, es gibt zwei unterschiedliche Arten.

Aber halt sowas wie Bigtable, wo Google einen Index drin speichert.

Oder das entsprechende Hadoop-Äquivalent.

Oder das Äquivalent aus dem Hadoop-Ökosystem Edgebase.

Die Dinger sind halt dafür gedacht, dass man da so ein bisschen mehr Daten hat.

Die Dinger sind halt dafür gedacht, gigantische Datenmengen irgendwie zu speichern.

Und das halt machen sie dann irgendwie eher so spaltbasiert.

Cassandra, Apache Cassandra ist auch so ein Projekt, das das genauso macht.

Dann ein komplett anderes Paradigma sind Grafendatenbanken.

Wo man Daten eben nicht in Tabellen speichert, sondern man speichert eher Knoten und Kanten.

Und die Relationen zwischen den Daten sind halt nicht dadurch dargestellt,

dass man jetzt halt irgendwie Zeilen in einer Tabelle hat.

Und dadurch, dass man halt beliebige Beziehungen im Grunde zwischen Knoten irgendwie hat,

das ist jetzt ein bisschen abstrakt.

Weiß ich auch gar nicht genau, wie ich das erklären kann.

Vielleicht kann man das nachher nochmal im praktischen Beispiel ein bisschen besser erläutern.

Vielleicht kann ich das nachher nochmal im praktischen Beispiel ein bisschen besser erläutern.

Genau.

Aber das ist halt so eine ganz andere Art von Datenbanken.

Da würde ich sagen, das hätte auch sich anstelle von relationalen Datenbanken durchsetzen können.

Ja.

Und genau, auch das, was mit dem Semantik-Web vielleicht haben manche Leute,

davon schon gehört, so RDF, Tuppel-Stores, das ist auch alles im Grunde Grafendatenbanken.

Okay, Semantik-Web, ja, machen wir später.

Genau.

Und dann gibt es natürlich noch so wirklich anwendungsspezifische Datenbanken,

sowas wie Volltext-Suchmaschinen, also Volltext-Indizes oder für Zeitreihen gibt es auch spezialisierte Geschichten,

Influx-DB oder Timescale-DB oder halt sowieso für, du hast halt ein bestimmtes Problem,

wie du möchtest dieses, bei Google sieht man halt, Google-Suggest hieß das Feature,

wenn man Google-Query eingibt, dann werden einem so Vorschläge gemacht.

Dafür braucht man halt spezielle Art, das zu indizieren, das ist Suffix-Trees.

Und das kann ja, ja, dafür gibt es dann auch wieder spezielle Server, mit denen man das machen kann und so.

Und das wäre jetzt etwas, was man sonst halt nicht so braucht.

Es gibt halt für bestimmte Anwendungsfälle gibt es sowas halt, aber ja, ist jetzt manchmal jetzt in solcher Funktion

in so verbreiteteren Datenbanken enthalten, aber es gibt halt auch mal spezialisierte Geschichten dafür.

Ja.

Vielleicht die ganzen Basissachen werden noch komplett nicht kurz erwähnt.

Ah ja, okay.

So, keine Ahnung, MySQL oder Postgres.

Ach so, das sind, ja genau, das sind Beispiele für relationale Datenbanken.

Ja, MySQL, Postgres, das wären jetzt die Open-Source-Vertreter.

Oracle und MSSQL-Server, Sybase, das wären so die kommerziellen.

Ja, Geschichten, DB2 von IBM, ja.

Oder zur Historie, im Grunde die, nachdem dieses Paper irgendwie, das ist übrigens sehr,

das sollte man nicht schon uns packen, das ist sehr empfehlenswert, das sich mal anzulesen von Headcourt.

Der hat damals bei IBM gearbeitet und da ist ein System daraus entstanden, das nennt sich System R.

Das haben irgendwie so ein paar Leute bei IBM geschrieben und daraus ist halt DB2,

auch von IBM entstanden irgendwann, aber halt Oracle bezieht sich auch da drauf, glaube ich.

Ich weiß jetzt aber nicht, wie die Verbindung zu Oracle ist.

Und dann gab es halt auch Leute in Berkeley, die versucht haben, das zu implementieren, das Paper.

Und dabei ist was rausgekommen namens Ingress.

Michael Stonebreaker war das damals und das war am Anfang noch gar keine Datenbank für beliebige Daten,

sondern das war für Bilder irgendwie.

Und dann ist das Ganze zu Postgres geworden.

Und wurde dann zu einer normalen, relationalen Datenbank sozusagen.

Und das ist auch faszinierend, also dieses ganze Postgres-Projekt ist der Wahnsinn eigentlich.

Das hat halt irgendwie Mitte der 80er ist das gestartet oder halt, wenn man Ingress dazu zählt, noch früher.

Und ist jetzt über 30 Jahre wahrscheinlich, hat das auch einen Buckel und ist immer noch top.

State of the Art.

State of the Art immer noch dabei.

Das kommt immer noch.

Tolle Sachen dazu.

Ist wahrscheinlich auch so die, sie nennen sich selber irgendwie die, ich weiß gar nicht, wie ich das übersetzen soll,

die Advanteste, die fortschrittlichste Open-Source-Datenbank.

Gut, Oracle und so hat wahrscheinlich noch ein bisschen mehr Funktionen.

Aber ja, tatsächlich wird meistens aber, wahrscheinlich aus Kostengründen,

tatsächlich jetzt so im Internetumfeld irgendwie dann meistens werden so Open-Source-Datenbanken verwendet.

Ja, ich habe schon mal gesehen, dass Leute Oracle verwenden, aber das ist eher selten.

Jetzt so bei, als Backend für Webseiten verwendet man normalerweise nicht Oracle, das ist halt auch einfach viel zu teuer.

Oder MSSQL-Server, doch, das gibt es tatsächlich Leute, die das als Backend für Webseiten verwenden.

Ein Beispiel einer populären Seite, die halt auf MSSQL-Server läuft, ist Stack Overflow.

Das ist auch faszinierend.

Ja, der war, ich weiß nicht, ob es der Gründer selber war, der war auch Produktmanager bei Microsoft, glaube ich.

Insofern, also die machen viel auf dem Microsoft-Stack und holen da unglaubliche Sachen raus.

Also die haben irgendwie ein halbes Rack oder, also das letzte Mal, gut, das ist jetzt auch schon lange her,

dass ich da irgendwie Artikel zu gelesen habe, aber das letzte Mal, dass ich das gelesen habe,

war Stack Overflow tatsächlich unter den Top Ten der traffic-stärksten Webseiten weltweit.

Und die haben dafür, Hardware war irgendwie so ein halbes Rack oder so.

Und das ist natürlich schon extrem beeindruckend.

Das ist überhaupt sowas, was halt wahrscheinlich viele Leute nicht wissen,

die jetzt wieder nicht so viel Erfahrung haben mit Datenbanken.

Die können echt wahnsinnig viel Dinge tun gleichzeitig und so.

Also man kriegt aus so einer ordentlich konfigurierten und getunten relationalen Datenbank

schon so mindestens ein paar tausend, vielleicht auch ein paar zehntausend Requests oder Statements pro Sekunde raus,

die die halt verarbeiten können.

Und dann kann man natürlich eine Menge machen.

Also vorausgesetzt der ganze Kram passt in den Hauptspeicher.

Aber man macht keine Dinge, die das irgendwie langsam machen.

Also es ist halt auch nicht so einfach, das zu optimieren.

Aber ja, genau.

Und das ist halt auch dieser Bereich der relationalen Datenbank.

Das ist halt der größte Datenbankbereich eigentlich.

Ja, vielleicht kommen wir dann, wollen wir zu dem praktischen Beispiel.

Ja, mit dem Beispiel, genau.

Das wäre super.

Wie macht man das jetzt alles und wie baut man das auf und warum?

Und was kann man damit so schönes machen?

Und was für Probleme könnten wir darüber stolpern und sowas?

Ja, dann...

Nehmen wir doch mal an, wir wollen jetzt Amazon nachbauen.

Wir haben einen kleinen Buchhandel in der Garage.

Ja, und wir überlegen uns jetzt so...

Da liegen jetzt ganz viele Bücher auf dem Boden.

Und dann will irgendjemand bestellen.

Dann muss dann irgendjemand in die Garage laufen, gucken, wie ist denn jetzt der Titel?

Habe ich den?

Dann liegt ein Buch unter dem anderen.

Das wäre natürlich doof, wenn man erstmal alleine suchen muss.

Deswegen haben wir jetzt überlegt, ja, pass auf, wir schreiben das Ganze jetzt in eine Datenbank.

Wie fangen wir jetzt mal an?

Vielleicht reden wir kurz über das Schema, wie man sowas aufbaut.

Nochmal kurz.

Genau.

Also, man würde jetzt zum Beispiel eben die Mitteilinformationen über diese Bücher,

also sowas wie Titel, ISBN-Preis und so...

Autor.

Genau, würde man halt in eine Datenbank schreiben.

Durchschnittliche Anzahl von Buchstaben pro Seite.

Vielleicht, ja.

Was auch immer man da...

Man würde das halt in eine Tabelle schreiben.

Aber man würde jetzt möglicherweise schon nicht den Autor...

Wenn man jetzt den Namen des Autors mit...

in diese Tabelle reinschreibt, dann hat man unter Umständen

ein Problem, nämlich

wenn jetzt halt...

Der Autor sich umbenimmt, weil er heiratet oder so?

Ja, genau. Heiratet oder sonst

irgendwie seinen Namen ändert,

dann müsste man ja,

dann kann man natürlich irgendwie alle

Zeilen, in denen der Name drinsteht,

die ändern,

aber man kann ja auch Pech haben und

wenn das jemand von Hand macht, dann ändert er halt

das nur, weil er davon gehört hat, dass es jetzt

für dieses Buch geändert werden soll, das nur in einer Zeile

und lässt die anderen halt weg und dann hat man halt...

Wir könnten Suche und Ersetze machen und dann machen wir sowas,

dann machen wir für jedes Jahr,

das wir für Bestellung haben oder jeden Monat, eine neue Datenbank,

eine neue Tabelle und dann müssten wir einmal nach

drei Jahren oder sowas 36 verschiedene Dateien öffnen,

immer Suche und Ersetze ausführen und dann den Namen ändern.

Ist doch super, oder nicht?

Ich könnte sagen, dass das nah dran ist

an dem, was viele Leute tatsächlich machen, aber das

kann man auch eleganter tun in der Datenbank

und dann hätte man möglicherweise

nur einen sogenannten Fremdschlüssel

in der Spalte Autor

in der Büchertabelle

und dann würde man den Namen

des Autors halt von der Autotabelle ändern

und dann wäre das

automatisch in allen Zeilen

in allen Bücher

oder allen Zeilen der Büchertabelle, in denen das referenziert wird,

würde das

automatisch geändert werden.

Und dann brauchen wir ja noch eine andere Tabelle

Autorix, wo dann alle Autorinnen

drinstehen.

Ja, wäre auch eine Möglichkeit, genau.

Und

ich überlege gerade,

das ist jetzt natürlich

also Autoren, ein Beispiel,

ein anderes Beispiel wäre User, die jetzt auf der Webseite

irgendwas einkaufen wollen oder so, da gibt es

da würde man in der Bestellung halt auch

nicht den User selber irgendwie in jede Bestellung schreiben,

sondern halt irgendwie die ID

von dem User, der irgendwas

eingekauft hat und

im Grunde

also ja, das heißt Datenbank

Normalisierung, wenn man jetzt dafür sorgt,

erinnert so ein bisschen an

wenn man Software schreibt, nennt sich das Dry,

so Don't Repeat Yourself, also wenn man Software

schreibt, sollte man auch Funktionalität,

die man an mehreren Stellen verwendet, halt nicht an mehreren

Stellen implementiert haben, weil wenn man das an

einer Stelle ändert und fräst es halt an der anderen,

dann hat man halt

ja, einmal ist es dann inkonsistent

das Verhalten und ja,

man hat halt auch die Gefahr, dass

dass man Dinge, die man einmal gefixt hat, halt dann

nochmal auftauchen.

Das ist doch bestimmt schon ein, zwei Mal passiert, oder? Also mir hat das früher ständig passiert

und dann ist mir irgendwann aufgefallen, oh, ich mach

eine Funktion und dann macht man die Funktion und dann macht man einen Test

und dann ist es halt erledigt

sozusagen. Also

sollte man halt möglichst versuchen, Dinge, die man

so logik, die irgendwo ist, halt immer nur einmal

irgendwo stehen zu haben. Ist natürlich manchmal nicht so ganz einfach,

und das ist bei Datenbanken halt auch nicht, weil

das weist sich so ein bisschen mit anderen Anforderungen,

die man hat, wenn es halt schnell sein soll,

dann ist das manchmal etwas schwierig, weil

relationale Datenbanken, dann wenn man

halt viele Tabellen miteinander verknüpft, man nennt das halt

Join, ja, das heißt, man kann halt anhand von

diesen Verzweigungs-,

also Fremdschlüssel-Dingsies

kann man halt Tabellen aneinander

ketten.

Ja, verketten.

Man kann sich das vorstellen, man legt die halt sozusagen

nebeneinander, sodass halt die

Spalte mit dem Schlüssel übereinander liegt, ja,

sozusagen, und wenn man das mit vielen macht, dann werden die Abfragen

langsam. So ein bisschen wie an so einen Spielautomaten,

wenn ihr so einen einahmigen Banditen

habt, dann zieht ihr einmal dran, da sind ja so drei verschiedene,

und wenn ihr dann parallel so ein Alles-Zeit-Gewinn,

dann habt ihr den Schlüssel, den ihr braucht.

Dann hat man

die Zeile anhand von dem Schlüssel irgendwie

zusammengeführt, ja, genau.

Und, äh,

ja, ähm,

also, ähm, also das ist halt auch, wie man

ein Schema designt und so, das ist halt so ein bisschen

Kunst, und man braucht Erfahrung dafür,

ähm,

ähm, aber man kann halt sagen, ja,

man sollte das so ein bisschen normalisieren, also

meistens gibt es dann ganz viele unterschiedliche Normalformen,

und meistens die Formen,

die man dann so hat, ist so irgendwas zwischen dritter

und vierter Normalform, oder so,

zwischen dritter und Boy-Scout-Normalform, oder sowas,

aber ich möchte gar nicht so sehr im Detail darauf eingehen,

was jetzt die Unterschiede zwischen den Normalformen sind,

also irgendwie kann man sich auch durchlesen auf Wikipedia,

oder so, braucht man auch im Alltag eigentlich gar nicht

zu wissen, sondern da hat man dann halt irgendwann

ein Gefühl dafür, wenn

ein Datenbankschema okay aussieht,

und dann macht man das halt so

Das heißt, ich gehe tatsächlich erstmal hin

und nehme ein Whiteboard,

einen Zettel, und schreibe mir auf, wie die Daten

aussehen sollen. Ja, ja, tatsächlich, also

wenn ich irgendwie

einen Datenbank designe für irgendein Projekt, dann

nehme ich mir einen Zettel, und

fange an, Entity-Relationship-Diagramme

zu malen, so nennt man die.

Was passiert denn später, wenn ich während

dem Projekt merke, hey, ich habe aber die und die

Daten vergessen?

Bastel ich da einfach irgendwo rein, ergänze ich dann dieses Schema

einfach, oder? Ja,

das kommt darauf an, was das dann für eine Änderung ist,

also das ist ja auch so ein Problem,

man kann

Datenbanken

nicht so richtig super ändern,

also, relationelle Datenbanken,

das Schema lässt sich schon ändern,

aber das ist halt so ein bisschen

knifflig, und wenn man das tut, muss man halt

irgendwie aufpassen.

Dass alte Datenbanken noch kompatibel sind, oder sowas?

Ja, dass

man das so ändert, dass nicht

irgendwelche Inkonsistenzen entstehen, und auch

das halt... Wie wäre das jetzt bei unserem

Beispiel, beispielsweise?

Also, wenn ich mir jetzt überlege, ich brauche

jetzt eine neue Spalte in dieser Büchertabelle,

ja, weiß ich nicht, es gibt jetzt nicht nur

die ESPN...

Jemand, oder das Genre, oder sowas,

jemand sammelt Seefahrerbücher.

Eine Kategorie, da würde ich halt tatsächlich, also

das, was man sich zuerst überlegen könnte, ist, man macht

einfach ein Textfeld

oder Charfield,

das halt den Kategorienamen

enthält,

und dann hat man halt das Problem, okay,

dann stellt man fest,

oder am besten noch, okay, fangen wir so

an.

Man schreibt halt, man nimmt Text

statt Kategorie

und sagt jetzt,

okay, alle Texts, also weiß ich nicht,

Politistik,

Seephara-Roman, oder

schreibt man jetzt, Komma separiert

halt in eine Spalte rein,

dann hat man damit die erste Normalform verletzt.

Und man muss sich dann im nächsten

Schritt, wenn man das halt weiter normalisiert, überlegen,

okay, nee, das geht nicht, darf ich so nicht machen?

Also der eigentliche Grund,

warum man das nicht so machen sollte, ist halt, dass es die

Anfragen halt schwierig macht und dass man

es auch sehr schlecht ändern kann und dass, wenn man

was ändert, kann man Sachen kaputt machen,

weil

Inkonsistenzen entstehen können und so.

Dann zieht man erst mal diese Dinge

auseinander und sagt halt, okay, nicht in

einer Spalte

mehrere Texts reinschreiben, sondern

dann hätte man sozusagen eine

N-zu-M-Relation, also nicht nur, wo ein

Fremdschlüssel in der einen Tabelle zu einem Fremdschlüssel in der anderen Tabelle

passt, sondern man hat dazwischen den Link,

man hat jetzt einmal Text als Relation

und einmal halt die Bücher als Relation

oder als Tabellen halt und

dazwischen hat man jetzt noch eine Link-Tabelle

oder eine Link-Relation zwischen

Büchern und Text, sodass man

mehrere, also für jedes Tag hätte man dann sozusagen

einen Eintrag in der Link-Tabelle,

wo dann drin steht,

ID von diesem Buch, ID von

diesem Tag, ja, und das ist dann halt sozusagen

die Verbindung

zwischen den beiden Tabellen, sondern halt

eine Tabelle mit allen Texten, die ist möglicherweise gar nicht

so lang, es gibt vielleicht nur 1000 Texte oder so,

und

vielleicht ein paar Millionen Bücher und

jetzt hat man halt eine Link-Tabelle, die

wahrscheinlich dann irgendwie ein paar 10 Millionen Bücher

oder ein paar 10 Millionen

Zeilen oder so lang ist, wo halt

jedem Buch ein paar Texte

zugewiesen werden. Und dann

ist es alles wieder schön in einer Normalform und

das kann man dann auch wieder nett abfragen.

Ja,

wenn man dann aber

quasi diesen Text halt,

wenn man diese Texte jetzt aber betrachtet

als Blätter in einem Kategorienbaum oder

so, dann wird es wieder so ein bisschen schwierig,

weil dann versucht man etwas in einer relationalen Datenbank

abzuspeichern, was gar nicht so gut geht, nämlich

irgendwie so Baumstrukturen oder

Grafenstrukturen.

Das kann man dann auch machen, und wenn es

nicht viele Texte oder Kategorien sind,

dann würde man versuchen, das wahrscheinlich in erste Z

nehmen.

Das ist, kann man sich mal angucken,

wenn einen das interessiert, wie das, dann kann man

dann halt auch per SQL Abfragen machen, wie

ja, welche Bücher liegen denn jetzt

unterhalb von dieser Kategorie.

Was man macht ist, man schreibt dann jede,

man hat so eine Kategorie in Baum und man schreibt

dann an jede, jedes

Element in dieser hierarchischen

Struktur, den travisiert man einmal

First Order, ich weiß

gar nicht genau.

Und also beim

Durchlaufen nummeriert man jeden Knoten,

an dem man vorbeiläuft, durch

und man hat eine Spalte links und

eine Spalte rechts und links,

wenn man links an den Sachen vorbeiläuft

in den Baum, schreibt man halt die

Nummern links rein und dann rechts, wenn man

rechts dran vorbeiläuft und dann kann man so Sachen

Range-Abfragen dazwischen machen

und magischerweise führt das dann dazu, dass man

so Subbäume rausselekten kann und so.

Aber das ist dann halt schon so wirklich fortgeschritten.

Und im Endeffekt,

wenn man jetzt große

Grafenstrukturen hat oder Bäume,

dann wäre es wahrscheinlich besser, das gar nicht mehr in der

Relationalen Datenbank zu machen, sondern das irgendwie

in einen anderen Service zu packen.

Ja, und da sind wir schon,

boah, das ging aber schnell, da sind wir schon an Grenzen,

wenn man das in der Relationalen Datenbank gut machen kann.

Ja, also das Dorfschachtrekarat ist mittlerweile

rausgewachsen, also wir können die ganzen Bücher dann

in der Garage nicht mehr lagern.

Nee, nee, nee, Moment, Moment, wir sind noch nicht, also was eigentlich auch,

nee, wir sind noch nicht

so weit, wir sind noch immer bei der ganz normalen, einfachen

Datenbank, würde ich sagen.

Ja, also das,

wofür wir die nämlich auch brauchen, die Datenbank,

ist halt so Transaktionen-Prozessen,

wenn jemand was kauft zum Beispiel. Oh, jemand hat bei uns

eine E-Mail geschickt, hat gesagt, hey, habt ihr das Buch da?

Und wir gucken nach, sagen ja,

können wir dir schicken. Dann, ja,

bitte an die und die Adresse und so, dann machen wir so ein Paket,

machen da so ein Stempel drauf und sagen, hey,

hier bitte dein Buch.

Ja, und dafür, dass das gut

funktioniert, dann müssen halt auch einige Sachen

für gewährleistet sein und

das ist halt zum Beispiel so etwas wie,

naja, wenn ich halt ein Buch kaufe, dann muss ich irgendwie

sicherstellen, dass das im Lager ist. Das heißt, wenn

jetzt ich ein

Buch verschicke, dann sage ich meiner

Datenbank irgendwie so, okay, jetzt

ist davon eins weniger da im Lager.

Aber wenn jetzt auf der Webseite jemand sagt, ich würde

dieses Buch einkaufen, dann muss halt gewährleistet

sein, dass das halt noch da ist. Das heißt,

ich brauche halt eine zentrale

Stelle, in der die Wahrheit... Ihr fällt direkt

wieder eines der Probleme ein.

Zwei Leute wollen das gleiche Buch haben,

was nur noch einmal da ist und die wollen gleichzeitig eins

kaufen. Genau, das ist halt

eine problematische Geschichte.

Aber wenn man jetzt eine Datenbank hat,

die

sozusagen Wahrheit kennt und alle

nur auf die zugreifen, dann

kann im Grunde nichts passieren. Also da können

keine Konflikte auftreten,

weil in dem Moment, wo jemand auf kaufen klickt

auf der Webseite und es noch ein Buch da

war...

Die Frage ist halt jetzt, was

man macht, wenn viele Kunden sich immer so ein Buch

angucken, das in ihren Warenkorb reintun,

weil sie es kaufen wollen, aber 90%

dieser Kunden einfach gar nicht am Ende kaufen,

sondern irgendwie wieder abspringen, weil die dann sagen, naja, doch nicht.

Und dann hätten

jetzt ja alle sich bei sich in den Warenkorb reingelegt und

wenn nur noch eins da ist, vielleicht hätte

der Zweite direkt angezeigt bekommen, gibt gar nichts, der ihn wirklich

gekauft hätte.

Also was natürlich passieren kann, ist, dass dir angezeigt wird,

es gibt noch ein Buch, obwohl es keins mehr gibt.

Weil du sitzt

halt vor der Webseite und

machst nichts.

Oh, leider war jemand schneller und hat vor zwei Sekunden...

Genau, du kannst, sobald du draufdrückst, in dem Moment,

wo sozusagen diese

Bestelltransaktion gestartet wird und dann

in der Datenbank aber die Bedingungen,

es muss mindestens eins im Lager sein, damit

die Bestellung ausgeführt werden kann, nicht mehr erfüllt ist

und diese Constraint wird verletzt,

dann sagt die Datenbank so, geht

nicht. Und dann kann man ihm so eine

Fehlanwendung anzeigen und sagen so, oh ja, tut uns leid,

das hat nicht geklappt, kein

Buch mehr auf Lager.

Das ist ja im Grunde okay.

Ja, gerade so.

Ja, also was halt

blöd wäre, ist, wenn man dem User sagt,

okay, du hast das jetzt bestellt,

und dann sagt er am Schluss so,

äh, du kriegst doch kein Buch, weil

war keins mehr da. Das ist dann halt so ein bisschen blöder.

Ist aber eine Situation, die dann später, wenn wir halt

nicht mehr auf einer Datenbank bleiben können,

weil das einfach

von der Skalierung her

nicht mehr klappen kann irgendwann,

dann kommen wir in solche Situationen rein

und da müssen wir uns dann überlegen, wie wir damit umgehen.

Aber solange das alles auf einer Datenbank läuft,

ist das

im Grunde kein Problem, kann man das sauber lösen.

Ich hatte ja, so mal es war,

ich hatte das vielleicht schon mal kurz erwähnt, bei einer Bank.

Ich habe eine Transaktion gemacht, da hat dann

die Bank gesagt, ja, ist wunderbar, dein Überweisung wurde

vernünftig ausgeführt, und dann

zwei Wochen später

kriegte ich dann so eine Mahnung, und dann habe ich noch mal

aufs Konto geguckt, und die Transaktion war weg.

War nicht da. Was war, habe ich dann da angerufen,

haben gesagt, oh, ja, also in irgendeiner Logfile

stand das dann wohl noch drin, dass ich so eine Transaktion eigentlich

gemacht hatte, die aber nicht ausgeführt worden war.

Das war ein bisschen blöd dann für mich, aber

ja, scheint wohl auch mal so

ein, ja, also

möglicherweise war das eben eine Bank,

und das ist tatsächlich bis, ich weiß nicht,

vor gar nicht allzu langer Zeit

tatsächlich üblich gewesen, wo dann

die Transaktionen nicht

in einer relationalen Datenbank

direkt ausgeführt werden, sondern

wo es dann Batch-Prozessen gibt,

nachts. Also die Sparkassen haben das

lange gemacht.

Man schmeißt dann manuell die ausgedruckten

Briefchen ins Überweisungs...

Lochkarten. Fährt jemand mit den

Lochkarten dahin, und dann kommen die in so einen Laser, und dann werden

die da durch, und vielleicht, wenn dann eine Lochkarte rausfällt,

dann ist halt eine Transaktion weg. Nicht so gut.

Ja, aber kann, sowas kann tatsächlich

passieren, und das ist natürlich etwas,

was ja gerade bei der Bank eigentlich, wenn man sich

denkt, na, sollte eigentlich nicht. Aber, ja,

aber wenn man

ein sauberes, relationales Datenbanksystem

verwendet, dann

kann das

eigentlich nicht, oder sagen wir so, das bietet einem

Lösungen für dieses Problem, und

im Grunde, wenn

das Ding sagt, ja, die Transaktion ist durch, dann

hat das auch funktioniert. Man kann sich auch darauf verlassen.

Ja, und auch

davon an, welche Daten man verwendet.

Es gibt halt welche, die nicht so richtig

alle Features unterstützen, die man dafür braucht.

Also, zum Beispiel,

was man eigentlich dafür braucht, damit das ordentlich

funktioniert, ist,

man braucht halt Isolation

zwischen unterschiedlichen

Transaktionen. Also, Transaktion heißt eigentlich

nur,

dass man mehrere Schritte,

die man ausführt,

irgendwie zusammenbündelt,

und dann halt entweder alle

funktionieren, oder keiner.

Ja, und das wäre halt

genauso ein Fall, wie, ich kaufe

ein Buch, ist halt ein Ding, in der Datenbank

müssen jetzt mehrere Sachen passieren. Da muss halt

irgendwie,

diese Bestellung muss erzeugt werden, dann muss

irgendwie aus dem Lagerstand

irgendwie

rausgelöscht, muss halt

der Lagerbestand um eins reduziert werden,

und so, und das sind halt

mehrere Statements, die ausgeführt werden.

Und jetzt müsste halt,

wenn

jemand anders in der Zeit

das gekauft hat, und es

dieser Bücher mehr auf Lager gibt,

müsste halt dann

nachdem

der eine Teil der Transaktion, nämlich

das Reduzieren

des Lagerbestandes

von diesem Buch nicht mehr funktioniert,

müsste halt auch das andere, nämlich das Erzeugen der Bestellung,

auch fehlschlagen, und dann halt eine Fehlermeldung

zurückkommen. Und dann ist es halt sauber.

Wenn ich jetzt ein System habe,

das das nicht macht, und ich

erzeuge die Bestellung, habe jetzt in meiner Bestellung

eine Tabelle, das Ding erzeugt,

sag jetzt in der

Lagerstandstabelle

dieses Buch eins weniger, und dann sagt das,

hier habe ich eigentlich von Strand auf, es darf nicht

weniger als null werden, also minus eins Bücher

ist schwer, das funktioniert irgendwie

nicht so richtig, dann sollte

und es dann knallt,

dann kann das natürlich,

wenn ich jetzt ein System habe, das keine Transaktion kann,

dann hätte ich jetzt die Bestellung zwar immer noch da,

aber...

Was ist denn jetzt als Beispiel, wenn ich jetzt sowas habe wie minus ein Buch,

und ich möchte jetzt einfach, dass wenn

minus ein Buch ist, dass das nachbestellt wird von

dem Händler um die Ecke, also

der hat noch eine Garage nebenan, ist noch ein Händler,

der hat auch so Bücher, und vielleicht hat der eins

da, und dann sage ich einfach, ja, ich muss das irgendwo anders herbekommen.

Könnte ich ja auch wollen.

Kann man auch machen,

müsste dann, ja, das hängt dann vom System ab,

was die Logik dann macht. Man könnte ja sagen,

okay, die Bestellung wird trotzdem ausgeführt, dafür wird dann aber

das... Oder das Buch wird gedruckt oder sowas, ne?

Ziel, wann das... Ja, genau,

wenn normal produziert,

aber dann verändert sich möglicherweise das Ziel dafür, wann es halt

ausgeliefert wird, oder so, ne?

Und das ist halt dann, je nachdem, wie das System

funktioniert, kann man das machen.

Okay, also ich habe am Anfang mir so ein Schema ausgedacht, wo dann halt drinsteht,

was ich überhaupt alles machen will, machen kann,

und wenn mir irgendwelche neuen Dinge einfallen,

oder so, dann muss ich kurz

überlegen, was

nicht an meinem Schema endet, aber

am besten mache ich das Schema am Anfang schon so

fertig, vollständig, dass das

unproblematischer geht. Das ist halt,

das ist ein bisschen ein Problem, man sollte ein Schema

schon von Anfang an halbwegs so designen,

dass es halt passt, das ist

später nicht mehr so ganz einfach, das zu ändern,

man kann das natürlich ändern, aber

das ist auf jeden Fall...

Ja, aber das hängt ja ein bisschen vom Geschäftsmodell ab, ne?

Wenn ich jetzt auf einmal merke, so, oh, ich verkaufe

jetzt vielleicht gar keine Bücher mehr, sondern,

weiß nicht, kompliziertere Produkte, oder so was,

die noch einen anderen Aufwand haben, die jetzt nicht nur getaggt

werden sollen, sondern wo noch mehr

Metainformationen drin sind, irgendwelche

anderen Snippets, also der Buchtext vielleicht

noch, oder andere

Informationen, die dazugehören, oder so,

dann wäre das ja notwendig.

Ich kann ja nicht jedes Mal einen Neudankmann anfangen, sondern ich muss ja auch

gucken, dass die irgendwie mit skaliert.

Aber das sind wirklich schwierige Probleme,

das ist ein bisschen unintuitiv,

dass das so knifflig ist,

aber es ist leider so. Ein wirklich

lustiges Beispiel aus der Praxis,

das zeigt, dass

es halt nicht so einfach ist, möglicherweise

ist, finde ich, iTunes,

der App Store,

und der App Store war am Anfang,

man hat den nicht neu entwickelt, sondern das war,

man hat den, also über iTunes

konnte Apple ja schon immer irgendwie so Musik verkaufen,

das hat auch recht gut funktioniert,

oder halt deutlich früher,

als es jetzt das iPhone gab und

den App Store, und dann

sollte es halt dieses App Store Feature geben,

und dann haben sie halt einfach ihr

iTunes-Song-Verkauf-Ding genommen,

und das halt einfach nur gesagt,

okay, das sind jetzt keine Songs, sondern das sind Apps.

Was halt dazu führt, dass bis heute,

und jetzt sind wir mehr als 10 Jahre später,

bis heute

haben halt irgendwie Apps einen Titel

und eine Länge, Songlänge oder sowas,

was halt totaler Quatsch ist, das passt ja überhaupt

nicht zusammen, aber es ist halt sehr, sehr

schwer, das zu ändern, weil,

ja, das würde so viel Logik

irgendwie brechen,

dass in anderen Systemen,

das ist halt extrem, also

du kannst halt, ja,

also eine solche Migration durchzuführen, ist halt hinterher

sehr, sehr schwer, und

also quasi die ganzen Daten einmal anfassen und

abgleichen und bereinigen und schrubben und putzen.

Die Daten sind gar nicht so sehr das Problem,

das Problem sind die anderen Systeme,

die es auch alle drumherum gibt, die sich verlassen,

dass die Datenbanken so aussehen, wie sie aussehen.

Also wenn ich jetzt, also die Daten selber zu ändern,

ist, glaube ich, wäre nicht so das Problem,

weil ich muss jeden Prozess bei jedem Nutzer dieser Datenbank

darüber informieren, dass er sich das Schema...

Und der muss damit klarkommen, und das

ist halt möglicherweise Legacy-Code,

der letzte, der sich damit auskannte,

vor fünf Jahren gegangen ist, aber

das System macht irgendwas Vitales, was irgendwie

total wichtig ist für das

Business, und, tja, dann

wird es halt richtig schwer, und wenn du dann nicht nur

ein solches System hast, sondern zig,

dann kann es sein, dass du halt zehn Jahre lang das nicht mehr ändern kannst.

Manchmal

sieht man dann so ein bisschen lächerlich aus, aber

wie jetzt in dem Apple-Fall,

wenn man keine Songlänge hat,

ja, aber

es ist halt, das zeigt halt so ein bisschen,

wie knifflig das dann werden kann,

wenn man Pech hat.

Ja,

und das ist auch so ein Problem bei

relationalen Datenbanken insgesamt,

möglicherweise, würde ich sagen, also

gerade der E-Commerce-Fall oder der Amazon-Fall

funktioniert eigentlich ganz gut,

zunächst, also später wird das dann halt auch

nochmal ein bisschen problematischer, aber weil

physische Dinge

halt

relativ stabil sind, was irgendwie so ihre

Eigenschaften angeht. Also, da funktionieren

relationale Datenbanken halt besonders gut.

Unwahrscheinlich, dass so ein Buch noch ein anderes

Kappa enthält, oder sowas.

Also, dass sich Bücher jetzt irgendwie,

dass die plötzlich ein Attribut bekommen, was

es halt vorher nicht gab. Die wachsen Flügel.

Die haben halt irgendwie Titel, Seitenanzahlen, oder sowas,

aber dass jetzt plötzlich irgendwie, keine Ahnung,

ich weiß nicht, was man sich da

vorstellen könnte, man müsste jetzt irgendwie

Bücher...

Jedes Buch enthält einen Geist,

Bücher haben Flügel,

ja, keine Ahnung,

Bücher kann man jetzt essen, oder so, haben einen bestimmten Geschmack.

Das ist sehr unwahrscheinlich, dass das passiert, weil

das würde bedeuten, dass sich die physikalische

Realität irgendwie ändert, was sie ja

natürlich auch tut.

Aber das tut sie relativ langsam.

Und das ist gut,

weil das können relativ,

wenn man jetzt sozusagen diese

physischen Dinge in der Datenbank beschrieben hat, die kann sich

auch nur langsam ändern. Und das passt dann so ein bisschen

zueinander. Also, das ist halt, wenn man

jetzt die Eigenschaften von einem Buch erstmal erfasst hat, dann ändert sich

da wahrscheinlich nichts.

Da ist wahrscheinlich in den nächsten 20 Jahren nicht mehr so wahnsinnig viel dran.

Und da muss man auch in der Datenbank nicht so wahnsinnig viel ändern.

Wenn man jetzt ein anderes

Problem hat, und man jetzt

zum Beispiel in der Datenbank nicht Daten

über physikalische Objekte hält,

sondern Daten über Daten.

Oh, Metadaten.

Metadaten.

Die können sich dummerweise

unter Umständen, je nachdem wie...

Daten über Daten über Daten.

Ja, da kann plötzlich die

Geschwindigkeit, mit der sich die Strukturen da ändern

müssen, deutlich schneller

werden. Und dann wird es schwierig. Dann sind relationale

Datenbanken auch so, das ist dann ein Problem.

Das ist auch möglicherweise einer der Gründe dafür,

warum jetzt in letzter Zeit halt immer mehr so

NoSQL oder

Dokumentdatenbanken

oder

wenn man das, manche nennen das auch

Schema-less, warum die halt

populärer werden, weil man damit

halt möglicherweise auf diese geänderten Anforderungen

halt besser reagieren kann, dass man

ja, möglicherweise ad hoc

das Schema irgendwie ändern muss und das halt

in der relationalen Datenbank nicht so ganz einfach ist.

So absolut kann man das auch nicht sagen. Also es gibt

da diverse Möglichkeiten, wie man die

Geschichten miteinander verbinden kann und

ja,

wenn Schema-less ist, halt auch nicht

Schema-less, sondern das bedeutet halt mehr oder

weniger nur, dass das Schema jetzt implizit

in deiner Applikation ist und du halt

immer aufpassen musst, wenn du deine Applikation änderst, dass du

da das Schema nicht kaputt machst oder änderst oder so

und das überlegen sich viele Leute

dann nicht so richtig und dann ändern sie irgendwas. Dann passieren

furchtbare Dinge und

dann fällt ihnen auf, dass sie doch ein Schema haben.

Und ja, dass sie dieses Problem halt doch nicht

losgeworden sind. Also

es ist leider alles nicht so einfach und

das ist

tatsächlich so, dass man bei

Datenbanken halt im Design

am Anfang ein bisschen mehr Arbeit hat, aber dafür

hat man auch dann einen lustigen Vorteil,

nämlich, ja, es ist immer so schön, irgendwie

Daten

altern wie Wein, ja, also wenn man halt

viele gute Daten hat, das ist super und wenn

das mehr werden, das ist immer schön und das altert auch

gut, ja, das wird immer besser mit der Zeit.

Man kann immer mehr Wissen daraus generieren,

man kann immer mehr Fragen beantworten oder so,

das ist eine sehr schöne Sache und

Applikationscode,

Altert wie Fisch,

ja, also das ist

nicht gut, wenn immer Features drankommen

oder Sachen geändert werden, also das wird immer

schlimmer mit der Zeit. Das ist eigentlich selten

so, dass man irgendwie jetzt mehrere Jahre

irgendwie ein Projekt entwickelt und die Codequalität

wird immer besser. Das ist irgendwie

nicht so, sondern es wird immer,

es wird irgendwie, und daher ist halt

noch ein Frickel da, noch ein Frickel dort,

kleines Modülchen an der Seite,

und auch das Problem ist halt, die Anforderungen

verschieben sich halt irgendwie

oder, sagen wir mal so, die Realität

ändert sich und dann ist halt

der ursprüngliche Plan oder die

ursprüngliche Architektur der Applikation ist halt

nicht mehr darauf angepasst und so

und da hat man

dann halt, ja, genau

dieses Problem,

dass, wenn man jetzt das Schema verlagert

in die Applikation und die Applikation aber

altert wie Fisch, dann halt man halt auch, ja,

dann altern auch die Daten nicht gut und

deswegen ist es eigentlich schon sinnvoll, eine Trennlinie zu haben,

um zu sagen, okay, selbst wenn wir die

Applikation irgendwann wegschmeißen müssen,

neu schreiben müssen oder so, dann haben wir immer noch

die Daten und die sind halt sauber

strukturiert und das sieht alles gut aus

und das kann eine sehr wertvolle

Sache sein, wenn man das richtig macht

und, ja,

genau,

deswegen ist diese Trennung,

wo man halt irgendwie strikte,

ein striktes Schema hat und das

auch diverse Constraints,

die halt irgendwie, also dass man halt solche Sachen drin hat,

wie es kann nicht im Lager

Sachen geben,

mit einem Lagerstand von Minus irgendwas,

das darf halt nicht sein, da ist ein Fehler passiert

und kann die Datenbank schon dafür sorgen,

dass das halt nicht da reingeschrieben

wird, weil die sagt halt so, nee, so nicht,

man muss halt bloß dieses Constraint definieren und sagen, so,

auf dieser Spalte, da dürfen keine negativen Werte

auftauchen oder eben sowas wie ein Gehalt,

das darf auch nicht negativ werden oder

das halt

bestimmte Datumsinformationen halt nicht

so und so sein können,

ja,

oder

dass man halt,

tatsächlich, auch

was man mit Postgres machen kann, Postgres ist halt

wirklich eine schöne Wahl für, wenn man jetzt mit so einer

Geschichte anfängt,

das kann so tolle Sachen wie,

wenn wir jetzt,

um in diesem Buchhandelsbeispiel zu bleiben,

du hast jetzt eine Büchertabelle,

da sind natürlich auch alte Bücher drin, weil die werden ja auch

möglicherweise referenziert

von Bestellungen, die

lange

zurückliegen oder so, du möchtest aber,

wenn du jetzt eine Suche irgendwie auf der

Website hast oder du hast halt irgendwie

so eine Facette Navigation, wo

du nach Kategorien einschränken kannst

und da klickt jetzt ein User drauf

und sagt, okay, ich hätte jetzt da gerne

Romane oder Seefahrer-Romane,

dann

gibt es einen Index, der das halt schnell macht,

diese Abfrage und du willst jetzt

aber Sachen von diesem Index ausschließen,

zum Beispiel Bücher, die es gar nicht mehr gibt,

die nicht mehr produziert werden, die vor Jahren

irgendwie nicht mehr, seit Jahren nicht mehr gedruckt

werden und das kann man mit Postgres tun, man kann

dann sagen so, also

ich brauche diese Einträge,

in der Buchtabelle noch, um halt,

damit die referenzielle Integrität, so nennt man das

halt, von alten Bestellungen nicht bricht,

die ja brechen würde, wenn ich

zu einfach löschen würde, dann hätte ich

halt einen Pointer in der Bestellungstabelle,

der halt auch etwas zeigt, was es nicht mehr gibt,

das wäre schlecht, weil ich dann gar nicht mehr

weiß, was es sein soll und so,

aber trotzdem werden diese Dinger

nicht mehr in den Index geschrieben, also

ich kann halt den Index so definieren, dass er nur

Sachen,

Bücher mit reinnimmt,

die halt auch tatsächlich noch verkauft werden,

und das heißt, das ist nicht so,

und an solchen Stellen ist Postgres halt sehr schön,

hat sehr viele Features,

zum Beispiel jetzt im Unterschied zu MySQL, wo das

halt so, solche Sachen gehen da gar nicht, also das

halt, und da hast du dann halt ein Problem, wenn du ganz,

bei Büchern ist es jetzt nicht so schlimm, also

so viele Bücher gibt es nicht und

so viele, die dann halt nicht mehr

verkauft werden, auch nicht, aber man könnte sich

vorstellen, es gibt durchaus Anwendungen, wo man dieses

Problem ganz massiv bekommt, dass man halt

eine Menge gelöschte Geschichten in der Tabelle hat,

die man aber nicht wirklich löschen kann, sondern nur als gelöscht markiert,

und dann der Index aber,

immer größer wird und langsamer wird, weil

ja, man halt nicht so einen partiellen

Index über Sachen haben kann.

Ja, überhaupt, Postgres kann

halt auch noch diverse andere Geschichten, damit könnte man halt auch so Sachen

lösen, wie, welche Pakete kriege ich

eigentlich in so einen Lieferwagen rein und so, weil

der kann halt, das Ding kann halt nicht nur

so B-Trees, die man

jetzt für

Textabfragen,

Indexabfragen benutzt, also dass man sagt,

welche

Kategorie beginnt jetzt mit folgenden drei Buchstaben

oder so, da nimmt man B-Tree, aber

es kann halt auch solche Sachen wie Polygone,

Abmessungen,

überdeckt das eine das andere,

es kann halt so

A-Trees, die man halt für diese ganzen

räumlichen Datengeschichten braucht,

aber es kann nicht nur das, sondern es kann auch so Sachen wie,

welche Sachen liegen nah an anderen, so

KD-Trees, Brawl-Trees,

es kann sogar Suffix-Trees, also

Postgres kann da eine ganze Menge unterschiedlicher

Abfragen und Indizes,

die man, also

Aber ich glaube, die lohnen sich jetzt noch nicht bei unserem

kleinen Laden, wir sind ja glaube ich noch,

Doch, doch,

Ja, ja, wenn du

deine Lagerhaltung,

das möchtest du im gleichen System machen, damit

du nicht das Problem kriegst,

dass du den Start-State zwischen

unterschiedlichen Systemen synchronisieren musst, also wenn du

jetzt deine Lagerhaltung in einem System machst und

machst dann deine Webseite

oder die Datenbank, die die Webseite

betreibt,

sozusagen, über die du

Bücher verkaufst, wenn das unterschiedliche Systeme sind,

dann musst du den State zwischen diesen Systemen ja

irgendwie synchronisieren.

Was

schlecht ist, würde ich zum Beispiel sagen,

das ist halt am Anfang

sehr, sehr hilfreich, wenn das alles ein System ist,

weil man dann eben

tatsächlich eben die referenzielle Integrität,

Constraints, über alle Daten

hinweg machen kann und dann von der

Datenbank sicherstellen lassen kann schon, dass

bestimmte Sachen nicht gehen und dass bestimmte

Sachen immer erfüllt sein müssen.

Das heißt, unser Schema setzt das dann tatsächlich fest und das

kommt dann sonst direkt ein Fehler aus der Datenbank, hey,

nur dürfen wir nicht, geht nicht und wir haben das Schema

dabei erarbeitet in unseren kleinen Laden und so sollten wir dann

Und dann kann dann die Applikation oder die Programmierer

die jetzt vielleicht gar nicht,

die Leute, die die Webseite bauen, die haben jetzt

vielleicht gar nicht so viel Ahnung von Lagerhaltung,

die können aber, egal was sie auf der Datenbank machen, sie können nichts

kaputt machen, weil wenn sie etwas

tun, was eigentlich nicht geht, wie zum Beispiel

einen Lagerstand von hoch auf minus eins setzen,

dann sagt ihnen die Datenbank, ne, mach ich nicht.

Und dann kriegen sie halt einen Fehler. Und das ist

halt sauber, weil wenn du jetzt zwei Systeme hättest

und musst jetzt da synchronisieren

und jetzt ist aber schon irgendwie was Blödes passiert.

Der Datenbank steht jetzt minus zwei Bücher und dann

sagt die eine Datenbank, du sagst aber eigentlich nicht, dann sagt die

eine Datenbank, ja, hab ich aber. Und dann, ja, okay.

Da kommst du halt in Teufels Küche.

Also man könnte sich vorstellen, dass das eine gute Idee wäre,

weil das macht, dann wird man halt relativ schnell feststellen,

ist keine gute Idee, ist doof.

Das ist auch vielleicht ein bisschen unintuitiv,

aber ja. Und natürlich,

nachher muss man Sachen funktionierender

rausnehmen und man muss dann das

in mehrere Systeme aufkleinern. Man sollte so lange wie möglich

versuchen zu verhindern, dass das passiert, weil

das macht alles viel, viel schwerer.

Ja.

Genau.

Also wo sind wir jetzt eigentlich genau?

Klein und niedlich, wir haben

Postgres, machen alles

über Postgres, wir haben noch ein bisschen JavaScript

auf der Client-Seite, ansonsten

nehmen wir, sagen wir mal, Django oder so

als Web-Framework.

Also genau, jetzt kommen wir erstmal zu

wie machen wir jetzt Python?

Genau, da brauchen

wir halt irgendeine Art, wie wir auf die Datenbank

zugreifen.

Üblicherweise, wie man

Statements oder Abfragen an eine Datenbank formuliert, ist halt

SQL, heutzutage halt so der Standard

für solche Systeme.

Aber das ist halt immer ein bisschen Fremdkörper.

Code schreiben und dann hat man jetzt so ein

SQL-Statement. Das passt von der Syntax her

überhaupt nicht in Python rein. Da muss man einen langen String

machen, der irgendwie vernünftig aussieht und

da muss dann alles stehen, was mit der Datenbank reden kann.

Genau, und das ist halt irgendwie

nicht so schön. Also das gibt dann unterschiedliche

Methoden. Wenn man jetzt

tatsächlich mit den rohen Statements arbeitet, es gibt Leute,

die packen halt alle Statements in

ein File und packen dann

Funktionen drum und dann ruft man halt diese Funktionen auf.

Das kann man machen, das hat so

Vor- und Nachteile. Dann kann man aber auch sagen,

okay, das ist aber schlecht, eigentlich möchte ich

in dem Moment, wo ich mit den Daten arbeite, das Statement

auch sehen und auch ändern können. Dann

packt man halt sozusagen die Statements

immer an die Stelle, wo man halt

tatsächlich mit den Daten arbeitet. Das hat

auch wiederum Vor- und Nachteile. Das hat den Vorteil, dass man halt

Sachen leicht ändern kann. Das hat den Nachteil,

dass man unter Umständen mehrere Statements,

die sehr ähnlich oder gleich sind, an

unterschiedlichen Stellen hat.

Alles nicht so total toll.

Auch nicht so ein einfaches Problem.

Und eine

ganz gute Lösung für dieses Problem

sind so

objektrelationale Mapper

oder ORMs.

In Django ist einer eingebaut.

Der Django ORM.

Ja, genau. Wo man dann halt

gar nicht wirklich mitkriegt,

dass das SQL unten drunter ist, sondern

man schreibt halt ganz normale

Python-Code.

Man definiert

die Daten, die man in der Datenbank stehen haben

möchte, einfach nur als Klassen.

Das heißt, das Schema wird nochmal

als Klasse eingebaut, oder?

Das Schema entsteht dadurch,

dass man unterschiedliche Klassen

hat, die irgendwie in Beziehung zueinander stehen.

Also, was aufeinander neppt,

ist halt Klasse und Tabelle.

Also, ich hätte dann, wenn ich Bücher kaufen möchte, halt eine

Klasse Book.

Und dann hätte ich halt vielleicht eine Klasse

Tag. Und

wir hatten das ja eben mit dem Beispiel, ich habe eine

N-zu-M-Beziehung zwischen Tags und

Büchern. Und dann würde man

entweder in Tags oder in Büchern irgendwo

definieren. Also, das hier ist

dieses Feld

Tags ist halt ein

wie heißt

das in Django?

Weiß jetzt irgendwie

irgendwas, Foreign Key Field

irgendwas, aber man sagt halt, das ist halt

Many-to-Many-Relation irgendwas.

Weiß ich nicht, muss ich nachgucken. Aber auf jeden Fall definiert man

das halt wie eine Spalte in der

Tabelle. Also, Attribute

der Klasse sind halt Spalten in der Tabelle.

Und sagt man halt, das hier ist ein Many-to-Many-Beziehung

zu der Relation

Tags. Und dann hat man

die Link-Tabelle wird automatisch erzeugt. Man kriegt

das gar nicht mit.

Und im Code

hat man halt nur Bücher und Tags und halt

dann diese Beziehungen dazwischen. Und dann

ja, wenn man

sich das halt so hindefiniert hat

und dann halt alle Klassen, die man so braucht, beziehungsweise

alle Tabellen, die man halt irgendwie in der Datenbank haben möchte,

definiert hat mit den Spalten

und den Typen der Spalten und den

entsprechenden Constraints und den Indices und den ganzen

Kladderadatsch, die man auch sonst noch so braucht,

dann sagt man

Migrate

und dann werden die ganzen

Tabellen in der Datenbank

tatsächlich angelegt.

Oder

Make Migrations

ruft man halt zuerst auf und damit

werden halt so Migrationsskripte in Django

angelegt. Das sind auch einfach

nur Python-Files, in denen drinsteht, was

diese Migrationen tun sollen. Nämlich zum Beispiel irgendwie

Tabellen anlegen,

Indizes anlegen oder sonst irgendwas.

In die kann man auch beliebige andere Dinge

reinschreiben. Also man kann halt auch selber Migrationen

einfach so von Hand schreiben.

Wenn man zum Beispiel jetzt sowas wie, es gibt so

Datenbank-Trigger. Also man kann halt

sowas...

Ja, man könnte halt, also wenn

zum Beispiel

Nutzer taggen selber

und erfinden eine neue Kategorie.

Ja.

Ich überlege gerade,

mir fällt ehrlich gesagt jetzt gerade nicht so ein

tolles Beispiel ein, aber im Grunde, was das tut,

ist, wenn sich halt in einer

bestimmten Spalte irgendwas ändert,

dass dann automatisch andere Aktionen passieren.

Innerhalb der Datenbank.

Und das kann man halt

festlegen, haben auch einen SQL-Syntax

und man schreibt das halt einfach in eine Migration rein.

Ja, oder man kann auch sogar Sort-Procedures,

die halt dann irgendwie eine komplizierte Geschichte, die dann

irgendwie ausgeführt wird, wenn ein neuer Autor

angelegt wird oder sonst irgendwas.

Dann müssen vielleicht noch diverse andere Geschichten gemacht werden.

Das kann man

ganz normal in diese

Django-Migration auch reinschreiben. Man kann da die

SQL reinschreiben und

die werden dann mit ausgeführt und dann werden halt diese

Sort-Procedures oder Trigger in die Datenbank mit reingeschrieben.

Und sind dann halt da.

Und

was im Schema passiert

oder was da drin ist, das wird halt dann von

diesem Django-Migrationssystem verwaltet und

alle Migrationen, die ausgeführt worden sind,

werden halt auch wieder

in derselben Datenbank halt gehalten

von Django selbst. Da gibt es dann halt auch Tabellen zu.

Und man kann jetzt Sachen auch wieder zurückrollen. Also man kann

zum Beispiel sagen, wenn man eine Änderung gemacht hat

und feststellt, oh, die war nicht so toll, dann sagt man

halt einfach so migrate und dann gibt man die

Nummer der Migration an

davor und dann rollt sich die Datenbank in den

Zustand davor zurück.

Und dann

löscht man einfach die Migration und dann war's das.

Also das macht es halt sehr angenehm

damit zu arbeiten und sowas braucht man auf jeden Fall.

Also selbst wenn man jetzt sowas nicht wie Django verwendet,

sondern das alles von Hand macht, dann braucht

man auch irgendeine Art, wie man damit umgeht und das

war teilweise früher ziemlich übel. Also

keine so gute Unterstützung in den Frameworks für sowas

gab. Da hat man das halt irgendwie von Hand gemacht

und da passieren dann immer wieder Unfälle.

Man hat halt irgendeine

Datenbank vergessen oder

wenn man jetzt halt mehrere Datenbanken hat

oder

es geht irgendwie sowas verloren, man weiß nicht genau

in welchem Zustand die Datenbank ist, weil

irgendwie man meint, man hätte die ausgeführt, aber

dann ist es irgendwie doch nicht passiert

oder weil eben nirgendwo

drinsteht, in welchem Zustand die Datenbank ist,

sondern man nur Leute fragt

irgendwie so, also hast du die Migration jetzt eigentlich auf der

Produktionsdatenbank schon ausgeführt oder nicht?

Ja, ja, hab ich gemacht.

Das ist vielleicht auch nicht passiert.

Also es wäre schön, wenn das halt irgendwie selbst

auch in der Datenbank festgehalten wird,

in welchem Zustand man ist.

Ja, und das, jetzt so ein

Framework wie Django bietet einem dafür halt

kommen so wirklich relativ vollständige

Wir merken wieder, du bist ein Django-Fan.

Ja, ja, Art damit umzugehen.

Ja, kann man Flask, wenn man jetzt das andere

große Web

ja, Framework kann man jetzt

nicht da so wirklich zu sagen, aber die andere Paradigmen,

wie man Web-Anwendungen

in Python entwickelt,

wenn man das in Flask macht, hat man das

auch alles, ja, da gibt es dann SQL-Alchemy

als ORM

und halt, ich weiß jetzt nicht, das hat

einen Namen, die Migrationslösung

dafür, den entdecke ich mir jetzt gerade

nicht erinnern, und da geht das

alles auch. SQL-Alchemy ist sogar deutlich mächtiger

als der Django-ORM,

aber ist halt nicht integriert.

Und, ja, also

Flask ist auch super,

der Trade-Off ist halt so ein bisschen,

was einen Django so abnimmt,

ist halt, dass man

sich halt um viele Abhängigkeiten nicht kümmern muss,

weil man installiert halt Django und dann hat man halt einen Großteil

von dem, was man so braucht.

Und das wird halt dafür,

dass das alles konsistent bleibt und man upgraden kann

und so, dafür wird gesorgt, da muss man selber sich nicht drum kümmern.

Wenn man jetzt Flask macht und dann halt ganz viele

unterschiedliche Teile

hat und die ihre Versionen

ändern und so, dann muss man selber am Ball bleiben

und auch Konflikte halt selber auflösen.

Das heißt, man hat so langfristig mehr zu tun damit.

Aber dafür ist man halt auch

flexibler und kann halt, wenn einem

eine bestimmte Art von ORM besser gefällt, den halt

verwenden. Es gibt halt auch zum Beispiel irgendwie

neuere, also SQL-Alchemy ist sehr alt,

Django-ORM ist relativ alt.

Es gibt Peewee,

und Pony-ORM oder so

sind jetzt modernere Geschichten,

sieht besser aus, macht unten drunter

irgendwie was sehr ähnliches, aber

ja, genau.

Also ein Teil davon ist halt immer, wie man die

Relationen und Tabellen definieren kann.

Das sind meistens Klassen, die man dann halt aufschreibt.

Und dann erzeugt man daraus halt die Datenbankstruktur.

Und der andere Teil vom ORM

ist halt, wie man Abfragen auf die Datenbank halt

abfeuert. Und

das, was man eigentlich

fast bei allen ORMs dann so macht, ist

man

macht so Method-Chaining.

Ich weiß nicht, sagt dir das was?

Bis jetzt nicht.

Ja, gibt's auch so oft in

Data Science, also Pandas oder so, da macht man das auch.

Also man kann in Python,

ja, man kann ja irgendwas sagen, so man hat ein Objekt, Punkt,

Methodenaufruf,

oder Punkt Attribut, Punkt,

wieder noch was anderes, Punkt, wieder noch was anderes.

Wenn zum Beispiel eine Methode

ja ein Objekt zurückgibt, dann kann man auf diesem

Objekt wieder was anderes aufrufen.

Wenn ich das alles in eine Teile schreibe, wird das irgendwann relativ

lang. Aber wenn ich jetzt ein Statement

modellieren möchte, das halt viele Where-Bedingungen

hat, die Art, in Django

ORM das hinzuschreiben, wäre halt zu sagen, Filter

irgendeine Spalte

gleich

irgendeinen Wert oder sowas.

Aber dann hab ich noch ein zweites, dann sag ich Punkt, Filter,

nächste Spalte, wieder ein anderer Wert oder so.

Und das

wird halt relativ länglich. Daraus wird dann halt ein

Statement generiert, aber was ich

halt tun kann, ist zu sagen,

Klammer auf, und dann halt Query-Set, Punkt,

Filter,

Punkt, Annotate,

und dann Dinge

gruppieren oder so, oder neue Spalte

hinzufügen.

Und ich mach hinten noch eine weitere Klammer drumrum,

dann kann ich das halt auch einrücken. Und dann

rück ich das so ein, dass alle Punkte untereinander stehen.

Und dann hab ich halt so ein mehrzeiliges

Dings, was so ein bisschen

eine Zwischenform ist zwischen SQL und

Python-Code.

Ja, aber ich

spare mir dadurch sozusagen, dass

jedes Mal irgendeine Zwischenvariable zuweisen zu müssen.

Ansonsten könnte ich ja

natürlich sagen, Query-Set gleich, Query-Set, Punkt, Filter,

irgendwas. Und dann sag ich in der nächsten Zeile,

Query-Set gleich, Query-Set, Punkt,

Filter, noch irgendwie eine andere Spalte,

where, irgendwas.

Ich kann das aber auch alles in

ein einziges Dings reinschreiben.

Und man nennt das

Message-Chaining.

Ja, und das ist halt irgendwie

das, bei

Pandas ist es halt genauso, da hat man Data-Frames, auf denen man

Sachen macht, und die geben dann auch immer

wieder ein Data-Frame zurück, die Fehler der Methoden.

Und die kann man halt auch so chainen. Und dann hat man da oft

so mehrzeitige Dinge, wo halt die Punkte untereinander stehen.

Also wenn man nicht weiß, was das ist, das ist Message-Chaining.

Und das ist halt so eine Methode, um

Dinge halt in eine

State zu... Irgendwie schon mal ein bisschen gesehen, aber so wirklich

wissen, was das Message-Chaining heißt, ist natürlich...

Ja, genau. Und

im Grunde ist es halt dann, wenn man

OEMs, wenn man Queries in OEMs so macht,

ist es halt so ein bisschen, ist es so ein Zwischending

zwischen

SQL und Python, aber das funktioniert

dann halt so halbwegs gut, und das

ist dann halt sehr angenehm.

Und dann ist es nicht mehr ein Problem, wenn man jetzt

sozusagen diese Art von Logik an unterschiedlichen Stellen

im Code stehen hat, weil

die Statements, die rausfallen, sind halt alle gleich.

Und wenn ich jetzt irgendwie, keine Ahnung,

mir überlege, dass ich

eine bestimmte Art von Optimierung

machen möchte an den Statements,

dann wäre die halt

auch immer gleich.

Das heißt, dann habe ich halt dieses Problem,

dass ich sonst hätte, wenn ich das alles in einen

File schreiben würde, oder wenn ich

fast gleiche Statements in unterschiedliche

Files schreiben würde, wenn ich die

Statements beim Code haben will, das habe

ich damit dann nicht mehr. Und das ist natürlich ein sehr schöner Effekt.

Und das ist halt, ja,

das ist einer der Hauptnutzen von OEMs, also

ein anderer schöner Nutzen ist halt, dass man halt diese

ganze Migrationsgeschichte, wie ändern sich Sachen, halt auch

automatisiert hat, beziehungsweise die ganzen Prozesse drumherum

irgendwie zumindest mal abgebildet hat.

Ja, also sind wir jetzt klein und niedlich,

und das haben wir jetzt gemacht.

Genau, und dann würde man so ein Framework verwenden, OEM,

und dann ist man eigentlich,

ja, das geht alles ins Git,

gibt Versionskontrolle dafür, und dann

das ist eigentlich alles schon relativ komfortabel.

Ähm,

ja.

Ähm,

Ja, was passiert jetzt? Also wir sind klein,

und jetzt haben wir das schon gebaut, aber

ja, wann funktioniert das denn nicht mehr so?

Äh, ja.

Ähm,

genau.

Wir haben als Onlinehandel einen

riesen Vorteil gegenüber

stationärem Buchhandel, weil

das ist auch eine interessante Statistik.

Das kommt, glaube ich, aus diesem,

ähm, Buch-Longtail, irgendwie,

äh, von, wie soll ich sagen, von

Wired-Redaktion, ah, weiß ich, hab den Namen vergessen.

Äh, jedenfalls, ähm,

schreibt er da, dass Amazon

macht die Hälfte des Umsatzes mit

Büchern, die nicht in den Top 300.000 sind.

Mhm.

So, äh, weil eben

Bücher verkaufen, äh,

so ein, so ein,

oder verkaufte Bücher hat so eine Longtail-Verteilung.

Also es gibt halt

äh, sehr, Leute wollen sehr

unterschiedliche Bücher kaufen. Also es

werden viele Bücher verkauft, aber von denen nur ganz

wenige. Und das ist

halt blöd für einen

Laden, der die Bücher halt physisch vorhalten

muss. Weil auch selbst wenn Bücher nicht so groß sind,

ich kann halt in so einem Innenstadt-

Buchladen kann ich halt

irgendwie ein paar tausend Bücher haben.

Äh, und dann ist halt irgendwie Schluss.

Und dann muss ich mir überlegen, welche das sind. Aber wenn jetzt,

also, nehmen wir an, ich hab...

Das hat aber auch ein Zielpublikum. Das heißt, ich weiß genau, hey,

in mir kommen jetzt nur ganz wieder alte, antiquarische,

ähm, interessierte Menschen rein.

Dann sollte ich vielleicht dafür sorgen, dass in meinem

Laden viele antiquarische Bücher sind.

Oder es kommen jetzt noch ganz viele hippe Leute rein,

die wollen alle, was sie bei IT wissen, sollte ich vielleicht in ein IT-Buchladen.

Ja, ja. Aber selbst, selbst wenn du

jetzt, äh, all diese Zielgruppen zusammennimmst

und dann irgendwie das riesige, den riesigsten,

äh, also, das ist halt das Problem. Wenn die

Zielgruppe zu klein ist, dann lohnt sich das

nicht. Äh, aber wenn sie, äh, selbst

wenn du jetzt einen riesigen Buchladen hast, in dem 300.000

Bücher passen, was äh, ziemlich groß sein müsste,

dann machst du

immer nur, äh, trotzdem noch die Hälfte des

Umsatzes von Amazon, weil

Amazon macht halt nochmal so viel Umsatz mit den

ganzen Rest. Das heißt, sie haben dann, sie können

einfach viel besser skalieren,

weil sie einfach viel mehr Bücher verkaufen.

Und, ähm, ja, dagegen,

ich wüsste nicht, dass es da irgendein Mittel gegeben gibt.

Ich fürchte... Was aber auch bedeuten würde, dass Amazon

auch diese Minus-Eins-Bestellung annehmen müsste, weil das

müssen sie auch irgendwo in einem riesigen Lager jedes

Buch liegen haben. Ja, müssen sie tatsächlich wahrscheinlich.

Oder sie müssen es halt on demand irgendwie drucken können

oder so. Gut, klar, sie müssen

damit irgendwie umgehen. Äh, auch der

stationäre Buchhandel geht ja irgendwie dann damit um,

so damit um, dass man dann halt Sachen da bestellt.

Zum Beispiel, äh... Hey, Autor, schreib doch

bitte nochmal eine neue Vorstellung.

So ein paar Bestellungen, ja.

Aber, äh,

ja, ich meine, du hast halt als, äh,

als stationärer Buchhandlung

hast du ja keinen Vorteil mehr, wenn

du dann auch wieder bestellst, weil dann

machst du halt zwei Sachen und die eine, ja,

und dann als Amazon hast du einfach

einen strukturellen Vorteil,

fürchte ich. Äh, und dann kannst du...

Okay, und dann ist es cool, weil dann können wir einfach mit unserer

Postgres-Lösung direkt so unter dem ORM...

Genau. Die interessante...

Also mit 3.000 Millionen, also mit 3.000 Millionen ist das überhaupt kein Problem,

äh, also da könnten wir auch, also ich würde sagen,

so ein Markt wie Deutschland kannst du wahrscheinlich tatsächlich mit

einer Datenbank und mit allen Büchern, die es überhaupt gibt,

locker bedienen. Das ist

kein so großes Problem.

Äh, wenn es jetzt

nur darum geht, die Bücher zu verkaufen.

Aber, äh, wenn wir

jetzt, äh, zum Beispiel eben sowas rauskriegen

wollen, wie, äh,

was sind eigentlich die Top 300.000 Bücher?

Wo kommt denn diese Zahl eigentlich her?

Ja, und, äh,

überhaupt rauszukriegen, okay, wir machen die Hälfte

unseres Umsatzes mit den nicht, mit Büchern, die nicht

in den Top 300.000 sind,

dann, äh, müssen wir, äh, nicht nur

die Bücher speichern, sondern dann müssen wir halt

auch, äh, speichern

zum Beispiel, welche Bücher gekauft worden sind und so

und die, also die Historie aller Bestellungen und so.

Und das ist dann halt unter Umständen

viel, viel mehr.

Und, äh, dann, äh,

wird es allmählich problematisch, weil dann haben wir

unterschiedliche, äh, Use Cases,

äh, oder unterschiedliche Abfragemuster.

Also wir haben zum Beispiel diese

Transaktions, ähm,

äh... Also das Lager, das einfach immer noch

weiß, wie viele Bücher sind da und das schicken wir raus.

Oder wir haben jemanden, der macht Marketing oder sowas.

Das System, das macht halt Bestellungen, oder wir haben halt Anfragen, die

Bestellungen machen oder solche Sachen wie

zeig mir alle Bücher in, äh, Seefacher-Romane

oder so. Äh,

aber die, diese Art von

Anfragen wie, sag mir mal, wie viel Umsatz

ich mit den, äh,

äh, äh, nicht in Top 300.000

enthaltenen Bücher im letzten Jahr gemacht habe.

Das ist eine ganz andere Art

von Anfrage.

Ja, während die, die Anfragen vorher, die machen

immer nur auf kleinen Datenmengen in der Datenbank,

irgendwas, immer zeilenweise meistens.

Und, ähm,

oft ändern sie auch irgendwas oder schreiben

irgendwas. Aber gut, Großteil, wenn man noch die

große Mehrheit wird Read-Anfragen

sein, aber die, äh, beziehen

sich normalerweise nicht auf wahnsinnig viele

Daten, äh, Teilen, sondern immer nur relativ

wenige oder wenige tausend Zeilen.

Und, ähm, ja, eben operieren halt

auch ja zeilenweise während diese andere

Anfrage jetzt dieses, wie viel Umsatz.

Ja, das ist halt dann

nur noch eine Spalte aus den Bestellungen

und dann auch, äh, geht es

wahrscheinlich aber über lange Zeiträume,

über ein Jahr, mehrere Jahre

und dann halt über alle Bücher.

Das ist eine Anfrage,

die geht halt über ganz, ganz, ganz, ganz,

ganz viele Zeilen.

So, und jetzt beißen sich die, diese, diese

Abfrage-Muster beißen sich halt massiv.

Mhm, mhm. Äh, wer, also,

weil, äh, das Problem ist, dass die

Datenbank irgendwie gewährleisten muss, dass die,

deine Sicht auf die Welt, also auf die Datenbank,

konsistent bleibt, während die Anfrage läuft.

Die Anfrage läuft jetzt aber wahrscheinlich relativ lang.

Du musst hier irgendwie alle Daten, die in der Datenbank

liegen, oder einen Großteil davon, musst du dir sicher angucken,

wenn sie dir hinterher so was sagen,

eine Zahl geben will, wie viel Umsatz waren das jetzt so.

Ähm,

und währenddessen werden aber

Bestellungen abgearbeitet oder werden Dinge gemacht,

Sachen an der Datenbank geändert,

die jetzt aber nicht direkt

durchschlagen können auf deine Anfrage, sondern

da werden immer nur Kopien gemacht, oder es,

ja, und sozusagen, es wird dann halt ein Timestamp

mit reingeschrieben, es wird halt, nein, das ist Multiversion

Concurrency Control. Äh,

Multiversen! Ja,

Multiversion Concurrency Control,

das heißt, die Datenbank

ist halt in einem unterschiedlichen Zustand,

je nachdem, wer sie, wer gerade fragt.

Und für die Transaktionen, die eine Bestellung ausführen, ist sie jetzt

in einem anderen Zustand als für dieses langlaufende

Query. Und das Problem ist halt, je länger

diese Query läuft, umso länger muss die Datenbank

jetzt mehrere Versionen ihrer selbst aufrechterhalten.

Was dazu führt, dass du halt auch

mehr Speicher brauchst und was halt eine komplizierte

Geschichte ist. Und das ist halt, ja,

wenn das Problem ist, wahrscheinlich wird man dann halt

irgendwann sehen, man wird so mit einfachen Analysegeschichten

anfragen und irgendwann wird man halt merken, so morgens um neun

wenn dann halt irgendwie die, die, äh,

äh, Business Intelligence

Abteilung irgendwie anfängt, äh, wenn

da die Analysten sitzen und dann irgendwie, ja gut,

ich weiß nicht, am Anfang wird man sowas noch nicht haben, aber

irgendwann wird man das gleich dann, wenn die halt ihre

Analysequeries abschießen, dann

wird plötzlich die Webseite langsam.

Ja, weil halt die Datenbank langsam wird,

weil die Queries werden langsam, weil, äh, plötzlich

äh, muss die, äh, muss die Datenbank

irgendwie mit mehreren, äh,

Zuständen irgendwie rum

jonglieren. Ja.

Das ist blöd. Und dann muss man sich halt, äh,

sowas überlegen. Und, äh,

das ist dann halt so der Moment, äh,

wo man dann sagen muss, okay, wir, wir

können das nicht mehr. Es wäre schön, alles in einer Datenbank

zu haben, aber es geht nicht. Diese beiden Use Cases

sind so unterschiedlich, dass man das leider

nur dadurch ordentlich abgebildet kriegt,

dass man das halt in unterschiedliche Systeme packt.

Und, ähm,

ja, also das eine nennt man,

äh, auch, äh, irgendwie OTP,

ja, Online Transaction Processing.

Das ist halt sozusagen der

Webseite, also Datenbank ist hinter

einer Webseite, die irgendwie Bücher verkauft und, und Prozess

hier Transaktionen, Bestellungen.

Und der andere Teil nennt sich, äh,

OLAP, äh, Online Analytical, äh,

Analytical Processing.

Und, äh, ist halt das so, wenn

man das mal gehört hat, irgendwie, wenn Leute über Data Warehousing

sprechen oder Data Warehouses oder so, das ist halt

das. Ähm,

und, äh,

genau, äh, das sind beides

meistens relationale Datenbanken,

wenn man anfängt jedenfalls.

Äh, aber die sehen

unterschiedlich aus. Äh, also wir haben

unterschiedliche Anfragen werden gestellt.

Ja, Analyseanfragen sind oft, laufen

länger, gucken sich viele,

viele Zeilen an.

Äh, Transaktionsanfragen sind oft

kurz und, ähm, ja, gucken

sich wenige Zeilen an. Und da geht's auch darum,

dass die Latenz relativ kurz ist. Bei vielen Analyseanfragen

ist das gar nicht so wichtig. Äh,

dass die jetzt, ob die jetzt eine Minute oder länger

oder weniger lang laufen, ist gar nicht so, gar nicht so

entscheidend. Und auch die Analyse-Datenbanken

sind oft viel, viel größer, weil man halt historische

Daten mit drin hat. Äh, was

halt für eine Transaktionsdatenbank tödlich wäre, weil

die, bei der es möglichst das

komplette, äh,

Working-Set der Datenbank im Hauptspeicher,

damit das halt alles schnell geht, damit die Latenz

äh, niedrig bleibt,

damit halt die Webseite schön, äh,

sich schön snappy irgendwie anfühlt.

Äh, und

bei, äh, bei den, den Analyse-Datenbanken

ist dabei unter Umständen wichtig, dass ich

halt historische Daten da halt auch mit drin haben kann.

Und die sind, werden dann halt vielleicht so groß,

dass man das halt nicht mehr im Hauptspeicher halten kann.

Ja, aber, äh,

die Queries werden dann halt langsam,

aber das ist halt möglicherweise,

wichtiger, historische Daten zu haben, als dass

Queries halt schnell sind. Und dann, äh,

wenn, wenn sich eine, eine Query

irgendwie ein paar Millionen oder paar Zehn Millionen Zeilen anguckt,

dann ist es eh nicht mehr schnell, selbst wenn es im Hauptspeicher ist.

Und ob es dann jetzt eine Minute oder zwei Minuten dauert,

das hat dann auch irgendwie wurscht.

Ja, äh, genau. Und dann, äh,

hat man eben diese beiden unterschiedlichen Systeme

und dann kriegt man halt aber auch genau diese Probleme,

die man dann hat, wenn man mehrere,

mehrere Sichten auf die Welt,

äh, hat oder einen Status, äh,

irgendwie eines, man hat jetzt keinen gemeinsamen Status

mehr, sondern man hat jetzt, äh,

äh, den Status

des Systems in

unterschiedlicher Form in unterschiedlichen Datenmanken.

Äh, das heißt,

man muss jetzt zum Beispiel die Transaktionen, die irgendwie

in dem einen System aufgelaufen sind, überführen

in das Analyse-System.

Äh, das macht man

üblicherweise bei einem Prozess, der nennt sich, äh,

ETL, äh, Extract, Transform,

Load. Und man halt die, äh,

Daten, die einen interessieren, halt täglich oder so.

Also meistens fängt man so, so was an wie,

ja, das sind halt dann Jobs, die nachts laufen,

äh, wenn halt die Datenmangel sowieso nicht so

unterlasst sind, weil nicht so viele Leute, äh,

äh, einkaufen, äh,

liest man halt irgendwie alles, was einen so

interessiert, dann aus der Transaktionsdatenbank aus.

Dann, ähm, ist der, der

Transformationsprozess halt sowas wie,

ich muss die Daten in ein anderes Schema transformieren.

Und das ist halt so wie so Stern

ist da, äh, Schema, äh, Schema oder

Snowflake-Schema, je nachdem.

Ähm, das ist auch

irgendwie gewisserweise normalisiert oder, man kann auch

sagen, denormalisiert, je nachdem.

Ähm, aber es ist halt auf jeden Fall anders.

Äh, es ist halt davon optimiert, dass ich bestimmte

Daten von Analysen fahren kann.

Und lädt das dann ganz,

lädt das Ganze halt in die, äh,

in, in, in, in, in das

Analyse-Datenbank-System.

Für deine BI. Genau.

Äh, ja.

Und, äh, äh,

ja, das ist,

das ist halt immer so ein bisschen, das ist halt

ein bisschen fies alles. Aber, ja, bleibt dann halt

nichts übrig, muss man irgendwie machen. Wie würden wir es denn

jetzt machen? Wenn wir Python jetzt haben, jetzt haben wir ja irgendwie so

ein neues System und jetzt haben wir eigentlich irgendwie,

das ist unser, äh, OLTP-Datenbank

System, war aufgebaut mit den Transaktionen für unsere

Webseite. Was bauen wir denn da, damit wir

jetzt so ein OLAP-Ding dranhängen können, weil wir

die analytische Abteilung einstellen? Ja, machen wir auch mit, mit

Postgres, äh, so ein Ding, äh,

da. Also eine zweite Postgres-Datenbank, eben die erste

Packung. Ja, genau. Die halt ein bisschen anders aussieht.

Die hat dann vielleicht nicht ganz so viele Hauptspeicher, die hat dann

aber dafür halt irgendwie mehr Plattenplatz

und auch irgendwie Storage

möglicherweise in unterschiedlicher Qualität.

Äh, wenn man sagt, okay, äh, vielleicht

für die letzten, für die letzte Woche haben wir alle Daten

noch im Hauptspeicher, ja, dann aber für den letzten

Monat oder für die letzten sechs Monate haben wir die halt

auf SSDs oder so, auf ein System, was halt

noch schnell, weil, weil der größte

Teil wird, äh, der Queries geht natürlich

auf Daten, die relativ aktuell sind.

Und dann ab einem Jahr oder so, so liegen die Daten

dann vielleicht auf Platten,

äh, die halt dann eher

langsam sind, aber da nur ein kleiner Teil der

Queries halt so lange zurückgeht,

ist es halt nicht so schlimm, wenn das ein bisschen langsamer ist.

Und diese Art von Queries muss dann halt ein bisschen

warten. Ja, äh,

und das ist halt ganz anders beim, äh,

im Vergleich zum OLTP-System,

wo man halt sagt, das muss alles

mehr oder weniger im Hauptspeicher sein. Und, äh,

klar, ist auch wichtig, dass es, dass Sachen schnell geschrieben werden,

deswegen muss das, wo was hingeschrieben wird, muss halt

auch sackschnell sein. Also, da würde man

auch eher lieber dann schnelle SSDs nehmen,

aber es ist halt nicht wichtig,

viel mehr Plattenplatz zu haben,

als man Hauptspeicher hat, weil das will man ja eh nicht.

Mhm, mhm. Ähm,

ja, äh,

und, ähm, genau,

diese LTE, diese LTE-Prozesse sind dann halt

irgendwelche Skripte, die dann halt irgendwie

über irgendeine Task, äh,

ja, Skandalik lösen. Ja, das läuft natürlich dann,

das ist unser Business Intelligence-System, also

jetzt nicht sekundengenau funktioniert.

Ja, genau. Weil wir halt immer wieder diese Jobs

machen müssen. Wenn wir uns jetzt an was

ganz anderes denken, weiß ich nicht, Aktienkursanalyse

oder sowas, wir haben irgendwelche Portfolios, dann

ist das natürlich dann doof, ne, weil

dann das nicht dem echten Stock-Market

entspricht dann, sondern wir müssen das halt

dann jedes Mal eine neue Kopie machen, wenn man diese

Analytics fahren will. Ja, ja, genau.

Also, äh, natürlich, das ist, das ist tatsächlich

ein Problem. Und, ähm,

die, die Lösung

dafür ist, dass man dann halt, äh, irgendwann nicht

mehr so ETL in dem Sinne

macht, dass man das halt irgendwie abends Batch-Processing macht,

äh, sondern dass man halt

irgendwie so Streaming-Geschichten, äh,

verwendet, halt, äh, Apache Kafka

und so ist halt etwas, was häufig verwendet wird.

Aber da kommen wir später zu, weil das ist auch eine

Geschichte, wo man, dann, das wird

halt eh, äh, erst dann relevant,

wenn man, wenn man dann

nochmal ein gutes Stück größer geworden ist und

man, äh, mit den traditionellen Data-Warehouse-Geschichten

auch nicht mehr klarkommt. Und der Weltbeherrschung

ist unikat. Ja, genau,

dazu muss man dann schon mal noch ein bisschen, oder halt

eine andere Art von Daten sammelt, ne.

Ähm, also ich würde sagen, dieser klassische,

äh, Bereich, ja, selbst wenn man halt, äh,

nur tagesaktuelle Daten hat, ist man damit

wahrscheinlich viel besser aufgestellt

als jetzt wahrscheinlich viele stationäre,

äh, Buchhändler oder so, ne. Selbst das, äh,

wird einen schon, äh,

wird einem da schon einen deutlichen Vorteil verschaffen. Und ich denke

mal, am Anfang ist es halt so, dass, das ist halt das, was alle

machen, womit alle irgendwie anfangen, dass sie das halt

tagesweise oder so, äh,

Batch-mäßig, äh, äh, erledigen.

Und, äh,

genau, ja, da ist man halt, äh,

irgendwie so bei diesem Data-Warehousing-Thema. Ich hab da

das mal irgendwann, ähm,

äh,

das ist auch in den Shownotes verlinkt, gibt's einen, äh,

schönen Essay, äh,

äh, der heißt, äh,

Data-Warehousing for Cavemen. Ah, ja, genau.

Das ist von 1997 oder so.

Aber, äh,

das finde ich nach wie vor gut, ist auch relativ humorvoll.

Äh, da geht's darum, äh,

der, der schreibt auch so,

ja, vielleicht interessiert es manche Leute irgendwie, wie man

da einer Dollar die Stunde, äh, verdienen kann, indem

man irgendwie die sensibelsten Daten von irgendwelchen Firmen

massiert. Muss ich sofort wissen, ja.

Genau, weil beim Freelance ist das vielleicht gar nicht

so uninteressant. Ja, und, äh,

also, das ist auch ein Feld, das es schon lange

gibt. Äh, ich hab das am Anfang aber auch nicht,

ähm, ich hab zuerst nur diesen

OTP-Use-Case gekannt und dann hab ich diesen, bin ich

irgendwann auf diesen Essay gestoßen und dachte so, oh, das ist aber interessant.

Und daraufhin halt

dann auch so angefangen, mich so ein bisschen mit Data-Warehousing-Kram

zu beschäftigen. Aber es ist auch ein sehr interessantes Thema.

Also, der, der, der entscheidende Punkt ist im Grunde,

dass man halt solche Abfragen machen

können möchte, wie,

äh, also, wie unterscheidet sich

denn jetzt, äh, keine Ahnung,

das Volumen der verkauften Bücher in einer bestimmten Kategorie,

nachdem ich irgendeine Werbeaktion gemacht habe, ja.

Oder, äh, B-Tests,

ja, ich hab jetzt irgendwie manchen Usern,

mh, bestimmter, äh,

ja, die haben halt ein Design gesehen, das ein bisschen

anders aussah oder halt, äh,

ein bisschen anders. Oder alle Leute, die letzte Woche gekauft

haben für ein bestimmtes Produkt, die bekommen

jetzt einen besonderen Gutschein, der

für drei Tage gültig ist oder sowas. Ja, und,

und, genau, ich möchte hinterher gucken, was ist denn dann

passiert, ja. War das jetzt erfolgreich oder nicht? Oder wie erfolgreich

war denn das? Und, ähm,

ähm,

ähm,

ähm, dafür muss ich halt, äh,

ja, äh, bestimmte

Arten von Anfragen, die ansonsten

keine Rolle spielen können, gut machen können.

Und dafür hab ich halt so eine Struktur. Ich hab eine

Fakten-Tabelle und dann drumherum Dimensionstabellen,

in denen halt solche Sachen drinstehen, wie,

ja, das war jetzt ein User, äh,

für den ich, dem ich diese Version

der Webseite angezeigt habe. Oder das

hier, äh, äh, also man hat zum Beispiel sowas wie,

daran kann man's vielleicht ganz gut

verstehen, ähm,

Time ist halt eine Dimension. Und in der Fakten-Tabelle,

also Fakten wären sowas wie Bestellungen,

äh, ist halt, äh,

sozusagen, Time

nicht etwas, jetzt ein Zeitstempel oder so,

der da reingeschrieben wird, sondern da ist halt, das ist halt eine

ID, ein Fremdschlüssel,

und der zeigt halt in eine Time-Dimension,

und das ist halt eine,

ähm, Dimensionstabelle, in der drinsteht,

was diese Zeit bedeutet, und dann

stehen da eben solche Dinge dran, wie,

naja, also, auch da wiederum,

kann sein, dass dann, also, da steht nicht

weg der Zeitstempel, sondern da steht dann dran, also,

das war ein Werktag. Das war ein

Feiertag in folgenden Bundesländern.

Äh, das war, äh,

keine Ahnung, ähm, das war Sommer.

Ja, sodass ich dann halt solche Abfragen machen kann, wie,

äh, wie ist denn der Verkauf der Bücher

in dieser Kategorie im Sommervergleich

zu Winter? Ja, und dadurch, da ich

diese Information, das ist jetzt Sommer, halt

direkt an dem Zeitdings dran habe, kann ich halt

Abfragen machen, die sehr effizient alles rausfiltern,

was halt irgendwie Sommer ist, und, und so.

Äh,

aber solche Abfragen machen halt in, in dem OTP-Teil,

oder wenn ich jetzt eine Webseite, machen überhaupt

keinen Sinn. Das heißt, ja,

die Schemata sehen dann halt ganz anders aus.

Äh, ja, äh, genau.

Wenn einen interessiert, wie das, wie das wirklich so

ordentlich funktioniert, also ich finde, dieser, dieser

Data Warehousing for Kaverman-Essay ist ein schöner Start.

Äh, aber da gibt's auch jede Menge,

kann man sich, kann man sich durchlesen, wie, wie das so

klappt. Ähm,

ja, äh,

genau.

Ach so.

Äh, richtig, genau. Da haben wir jetzt

schon mal ein bisschen über den Analyse-Teil gesprochen,

aber wir haben natürlich auch ein Problem, wenn

jetzt Leute immer mehr Zeugs kaufen,

ähm, dass irgendwie, äh,

halt unsere, äh, unsere Datenbank

halt vielleicht irgendwann ein bisschen langsamer wird,

nicht mehr, nicht mehr genug Transaktionen prozessen kann.

Ja, was macht man da? Man muss halt optimieren,

das ist auch oft ein wichtiger Teil,

und es ist auch nicht so einfach, ähm,

weil mal so ein, äh,

die einzige Datenbank,

für die ich das wirklich mal gemacht habe,

so, äh, war, war jetzt eigentlich MySQL,

ich verwende heutzutage eher Postgres, aber,

äh, äh, da hab ich dann auch mal so ein, so ein

Optimierungs-, äh, MySQL

Performance-Optimierungskurs besucht,

äh, und,

äh, das, äh, schönes Zitat, also,

äh, Chris Köntrop hat den, den damals

irgendwo in München, äh,

äh, durchgeführt, äh, der damals

hat da bei MySQL gearbeitet, und,

ähm, der, äh,

der Einsatz, der mir auch in Erinnerung

geblieben ist, der meinte so, ja, wenn man Datenbank

Performance optimieren will, ja, so,

OLTP, ähm,

dann gibt es da eigentlich, äh, so im Wesentlichen

drei Sachen, die man tun kann, um eine Datenbank

schnell zu machen, ja, also, das Erste,

was man eigentlich immer machen kann, äh,

das ist, das funktioniert auch fast immer,

äh, das ist, äh,

das ist super, kann einfach mal ein bisschen mehr

Hauptspeicher reinstecken in die Datenbank, ne, das ist schon mal

auf jeden Fall schneller, das, das ist immer gut.

Und das, wenn das

nicht mehr so richtig reicht. Eine zweite

Geschichte, die man auch immer tun kann, auch sehr gut

hilft, ist, man kann einfach noch ein bisschen

mehr Speicher reinstecken in die Datenbank.

Und das dritte Ding ist...

Das dritte Ding ist, wenn man

an eine Grenze gekommen ist,

die dann auch...

Das letzte Mittel, zu dem man greifen kann, wenn das auch nicht

hilft, ist halt, man könnte einfach ein bisschen mehr Hauptspeicher

in die Datenbank reinstecken.

Okay. Wie viel Hauptspeicher

hat denn dann so eine große Datenbank?

Ja, so viel, wie halt geht eigentlich.

Also es kommt darauf an, wie viel du benötigst.

Also wenn du jetzt irgendwie

ein paar tausend Artikel hast,

die du auf einer Webseite verkaufen willst,

dann ist es egal.

Da kommst du halt

mit einem, weiß ich nicht,

mit der Beliebigkeit,

mit einem Raspberry Pi kannst du das machen.

Das ist wurscht. Aber

wenn du jetzt,

sagen wir mal so, wenn dein

Working Set der Datenbank, also die

Menge der Daten, die halt auf der Platte liegen, wenn die Datenbank

runtergefahren ist, wenn das halt

30 Gigabyte hat,

dann sollte deine Datenbank mindestens mal

30 Gigabyte haben, eher so 64 vielleicht.

Hauptspeicher.

Weil es gibt halt auch noch diverse Strukturen, die im Hauptspeicher

gehalten werden, die man halt auch

braucht.

Und dann ist halt

das Limit eigentlich nur, also sagen wir so,

das ist halt viel.

Nehmen wir an, wir haben das, was heute

so ein Sweetspot ist, sind es halt

vielleicht 256 Gigabyte oder so.

Hauptspeicher.

Da geht eine ganze Menge rein.

Also es ist halt,

ist für mich schwer

vorstellbar,

welche Systeme, die Transaction Processing

machen, dann mehr Hauptspeicher benötigen.

Oder mehr Daten haben, die sie jetzt

unbedingt im Hauptspeicher halten müssen. Das gibt es kaum.

Also, ja gut,

es gibt schon, wenn man jetzt an sowas denkt, wie

Google, man indiziert das Web und möchte

halt so ein Echtzeit-Suchabfragen

über alle Webseiten machen, das geht nicht mehr.

Das ist klar.

Aber so

viele...

So groß müsste man werden. Also Amazon,

fällt da bestimmt auch nicht rein. Also Amazon

hat...

Na gut,

Amazons Teil, der einen jetzt mit Produkten

versorgt,

diese Webseite, das wird nicht so groß sein.

Die haben andere Teile, die halt

dann unter Umständen sehr groß geworden sind, aber

ja, das kriegst du eigentlich alles locker

in einer Datenbank unter.

Die haben dann halt ein anderes Problem. Amazon wird das Problem bekommen,

dass die halt mit der Schreiblast nicht mehr klarkommen.

Aber das könntest du

alles irgendwie in den Hauptspeicher

von so einer Datenbank packen.

Also ich würde sagen, für die

fast alle Anwendungsfälle heutzutage

ist das halt groß genug.

Ja, ab

256 Gigabyte wird es ein bisschen schwierig.

Also man

kann auch einen Terabyte Hauptspeicher irgendwie

in den Rechner stecken.

Das kostet irgendwie weniger als 10.000 Euro heutzutage.

Ja, also das geht auch. Es wird dann halt,

wenn man so wirklich so wahnsinnig viel Hauptspeicher drin hat,

dann kriegt man halt ein bisschen Probleme mit der

Architektur, das ist ja so

ein bisschen PC-basiert und

so viel Hauptspeicher-Wandbreite hat man da ja nicht.

Und das wird dann irgendwann,

man muss ja die ganzen Prozessoren auch irgendwie mit Daten

versorgen, ja, und wenn man jetzt da irgendwie,

weiß ich nicht,

da fährt ja kein Bus hin.

32 Prozessoren oder 64 oder sowas.

So irgendwann ist dann halt, also der Sweet Spot ist

würde ich sagen heute eher so bei, weiß ich nicht,

irgendwie 64 Prozessoren oder sowas und 256

Gigabyte Hauptspeicher und so.

Aber das, also egal, also vielleicht geht auch ein Terabyte,

ich hab keine Ahnung.

Für die meisten, aller, aller, aller

Anwendungsfälle reicht das alles vollkommen aus.

Und es ist ein sehr guter Tipp,

zu sagen, also jetzt, wenn du

tatsächlich irgendwie ein Working Set von 30 Gigabyte

hättest, nimm nicht eine Datenbank, die

jetzt 8 Gigabyte hat, dann hast du ein Problem. Dann bist du gleich

mal irgendwie mehrere Größenordnungen

langsamer, als wenn du das in den Hauptspeicher

packen würdest, ja, und kriegst halt einen Haufen Probleme, die

du sonst einfach nicht hättest.

Ja, das war früher alles noch viel schlimmer, als es

einen riesigen Unterschied gab zwischen

sozusagen permanentem Storage,

also

rotierendem Rost,

ja, so alles.

Und Hauptspeicher, ja, da war der

Unterschied so

1 zu 10.000 oder so

Geschwindigkeitsunterschied. Das ist jetzt

nicht mehr ganz so schlimm,

wenn man SSDs hat, aber es ist

immer noch ziemlich schlimm, also es ist immer noch

ein riesen Unterschied, und daher

ja, das

will eigentlich, dass die heißen Daten im Hauptspeicher sind.

Ja,

genau, das ist halt

ein Ansatz, um das zu optimieren, dann hat man oft das

Problem, man hat halt so eine Asymmetrie zwischen

Lese- und Schreibquerys,

und selbst wenn man mit

so einer Datenbank halt irgendwie

ein paar tausend Queries pro Sekunde

abfeiern kann,

irgendwann gerät man in eine

Konkurrenz zwischen Schreibquerys und Lesequerys,

wenn man jetzt nur eine Datenbank verwendet,

und das ist halt irgendwie schlecht, weil

man möchte eigentlich immer in der Lage sein, weil man

braucht ja eine, man darf eigentlich nur eine Datenbank

haben, auf die man schreibt, also

wenn man mehrere Datenbanken hat, von denen man liest, ist nicht so schlimm,

das geht, aber man kann halt nicht

so richtig gut mehrere Datenbanken haben, auf die man

schreibt, weil man ja

diesen zentralen Punkt, an dem der

Status gehalten wird, behalten möchte.

Wenn wir scheinbar auf dieselbe Stelle schreiben, zum Beispiel.

Ja, genau.

Also, was man jetzt machen könnte, wenn man zu viele

Leseanfragen hat, man verteilt die dann

halt auf sogenannte Slave-Datenbanken, das heißt,

man hat halt so eine Master-Slave-Architektur,

und eine Master-Datenbank,

von der man lesen und schreiben kann,

von der man lesen kann und auf die man schreiben kann,

und

es gibt

halt eine Reihe von

Slave-Datenbanken, von denen man nur lesen kann,

auf die man nicht schreiben kann. Wie oft wird denn da geslaved?

Also, wie oft wird dieser Slave denn aktualisiert auf den Master?

Ja, da gibt es dann Mechanismen für,

also der Master schreibt halt irgendwie

einen Log, das Log wird irgendwie an die Slaves übertragen,

und die vollziehen dann sozusagen die Transaktionen,

die der Master gemacht hat, halt nach.

Das ist

meistens wahrscheinlich instantan, mehr oder weniger.

Bei viel Last,

oder wenn halt eine große geografische

Differenz ist, also wenn es halt irgendwie über

den Atlantik oder den Pazifik geht oder so, klar, dann hast du halt

Zeitunterschiede, oder halt auch wenn die Last so groß ist,

dass die Slaves nicht mehr

gut hinterherkommen,

dann hast du natürlich,

dann hast du eventuell so ein bisschen Lack von vielleicht ein paar

Sekunden oder vielleicht auch mal eine Minute oder sowas.

Aber es gibt halt viele Anfragen, für die ist

das egal. Also viele Leseanfragen

ist auch, oft cached man das ja auch

dann nochmal irgendwie im Hauptspeicher

in Redis oder Memcache

oder so, und sagt halt ja,

also dieses Ding hier kannst du fünf Minuten lang

cachen.

Das ist ja dann auch egal, und

bei den Anfragen, die auf Slaves gehen, ist auch so

oft so, es ist halt wurscht, also so oft

ändern sich Dinge halt nicht, wenn irgendein Account nicht so richtig

stimmt oder so. Naja, nicht so

schlimm. Es gibt Dinge, bei denen das schlimm

ist, aber kommen gleich noch zu, da muss man das halt

anders machen, aber bei vielen

Sachen ist es halt nicht so wirklich schlimm

und daher kann man das gut aufteilen.

Man kann halt dann die Leselast auf die

Slaves sozusagen transferieren

und dann gibt es halt bestimmte Abfragen,

also gerade, wenn man jetzt kurz davor ist,

eine Bestellung zu machen oder so, wo man dann schon

im Code weiß, so okay, jetzt gibt's

hier gleich eine Transaktion oder so, und dann

macht man auch die Leseanfragen auf den Master, damit

man da halt eben nicht das Problem hat, dass man

eventuell Daten sieht, die eine Minute alt

sind, aber da das die allermeisten

Anfragen ja gar nicht sind, sondern

die meisten Navigationsanfragen, wenn ich jetzt in Kategorien

rumklicke oder irgendwelche Filter

auswähle oder nach irgendwas suche oder so,

diese ganzen Anfragen beziehen sich auf Daten,

die sich jetzt gar nicht so häufig ändern. Das kann

alles auch eine Minute alt sein, das ist wurscht.

Und erst wenn ich halt

eine Bestellung mache, dann

muss ich halt zusehen, dass ich aktuelle

Daten sehe, wie zum Beispiel ist halt

das Buch noch auf Lager oder so.

Und diese wenigen Anfragen,

die halt dann

aktuell sein sollten, die gehen

dann direkt an den Master. Und das kann man halt im Code sagen.

Man kann ja sagen, okay, an dieser Stelle

bitte eine Verbindung auf den Master und nicht auf den

Slave. Und

die Schreibanfragen müssen dann halt auf den

Master gehen, weil man ja nur an einer

Stelle schreiben will.

Und mit dieser Architektur kommt man relativ weit.

Also das ist eine

Geschichte, das ist auch so klassischer

Lampstack-Architektur, Wikipedia-Seite,

so aufgebaut.

Du hast jetzt gerade noch zwei Sachen gesagt, die vielleicht noch mal kurz von uns

von Redis einmal eben gesprochen und

gerade vom Lampstack. Also einmal vielleicht kurz erklären, was das

drin ist. Ja, Redis ist auch so eine

In-Memory-Datenbank,

eher so ein Key-Value-Store. Hat noch ein paar

Zusatzfunktionen, ist eine Message-Queue drin,

kann teilweise sortierte

Listen und sowas auch halten,

aber kann ein bisschen

mehr als Memcached.

Memcached ist rein so, du hast ein Key und

kriegst halt dann irgendwie Value zurück und wird

im Hauptspeicher gehalten, deswegen ist es schön schnell.

Wurde popularisiert

auch Memcached, vor allen Dingen durch den

Lampstack. Lamp ist einfach Linux, Apache,

MySQL, PHP

und einige

der größten Webseiten, die das halt

benutzt haben

oder ich weiß nicht, ob sie das noch benutzen, keine Ahnung,

ist halt Wikipedia. Wir haben auch immer

schöne

Artikel darüber gehabt, wie sie

ihre Systeme aufbauen. Also ist ja auch Wikipedia

eine der, ich glaube, die sind auch mit Sicherheit immer noch

in den Top 10 der weltweit

teufelstärksten Seiten und

haben halt auch viel dazu veröffentlicht, wie

ihre Architektur aussieht.

Und die haben halt auch genau das, die meisten Sachen sind

Leseranfragen, aber manchmal wird halt auch was geändert

oder geschrieben und die machen das halt mit

MySQL und vielen Slaves und

ja, extensiver

Verwendung von Memcached, die zum

Cachen von irgendwelchen gerenderten Fragmenten und

Daten, für die man jetzt

nicht nochmal eine Query machen möchte.

Was wäre denn jetzt der neueste Stack, würdest du sagen, den man jetzt

verwenden sollte?

Ja, das kommt halt darauf an, wenn man eben

PHP mag.

Ja, kann man das auch

immer noch machen,

wobei ich jetzt nicht genau weiß, ob das alles immer noch so

populär ist. Memcached, glaube ich, ist so ein bisschen auf dem Weg

nach draußen. Wahrscheinlich

würde auch in dem Umfeld eher heutzutage

Redis verwendet.

Aber jetzt

im Python-Umfeld

würde ich sagen, ja, da ist halt

einmal so grob die Wahl zwischen,

es gibt natürlich noch viel mehr und es gibt natürlich auch gute Gründe,

andere Sachen zu verwenden, aber so die populärsten

Geschichten sind halt Django und Flask

und eben als

in Memory Cache

ist bei beiden eigentlich

Redis sozusagen, dass das verwendet wird.

Datenbank, eigentlich würde ich auch sagen,

Postgres wird bei beiden verwendet.

Man kann auch was anderes nehmen natürlich. Ja, es gibt auch Leute, die

Django mit MongoDB verwenden.

Das geht. Es gibt auch sogar valide

Use Cases dafür. Es gibt auch Leute, die

Flask

irgendwie mit, weiß ich nicht,

CouchDB

mit allen

möglichen Dingen verheiraten.

Aber so als, womit ich

anfangen würde, ist auf jeden Fall Postgres

und dann halt eben SQL Alchemy beziehungsweise

Django ORM

und Redis, genau, als

in Memory Cache und

ja, wahrscheinlich braucht man auch noch ein Message

Queue-System.

Ist aber

dann auch schon, also dann gibt es noch so ein paar Sachen, die man

braucht. Was ist denn die Message Queue?

Also man hat oft so Dinge,

wo man dem User möglicherweise

etwas direkt

eine Antwort

geben will, aber

es ist halt ein Job, der dann irgendwie länger

dauert, wie

in unserem Buchstore wäre das

ein Buchstore, sowas wie

jemand fliegt ein neues Buch ein oder so.

Na gut, warte mal, lass mal überlegen.

Das ist kein so gutes Beispiel. End-User, was

könnte der denn tun?

Ja,

zum Beispiel

du verfasst einen Kommentar jetzt

oder eine Bewertung für irgendeinen Artikel

und du möchtest, wenn der jetzt

auf Abschicken drückt, der User, dass er

sofort seinen Kommentar unter dem

Artikel sieht.

Aber in Wirklichkeit

wenn wir den ja vielleicht noch prüfen,

also wenn das jetzt irgendwas Populäres ist.

Sag mal so, du

oder

das könnte jetzt

hässlich geworden sein.

Das tut mir leid, da muss ich mich entschuldigen.

Bisschen erkältet.

Ja,

ähm

ähm

ähm

ähm

ähm

wenn

also eigentlich möchte man halt

wenn jetzt zum Beispiel ein Artikel ist, der häufig

verkauft wird, ja, und dann jemand schreibt irgendwie

der Artikel ist voll scheiße, keine Ahnung

ähm, das hat ja dann unter Umständen direkt

äh, äh, Konsequenzen

oder es macht am besten noch irgendwie ein Mitbewerber

äh, macht irgendwas fieses, äh, irgendwie

ähm, ähm

ja, dann will man das möglicherweise nicht, dass das sofort

allen sichtbar wird, sondern man muss halt

irgendwie erst irgendwie, ja

irgendeine Redaktion drauf gucken oder so

äh, aber das ist halt nicht

etwas, was man dem User anzeigen möchte, also

ähm, man hat dann halt sozusagen etwas

so zwei Prozesse, die voneinander so ein bisschen entkoppelt

sind, so man, man, der User drückt auf Speichern, sieht

seinen Kommentar oder seine Bewertung und

ähm, im Hintergrund gehen aber dann noch

so Tasks los wie, oh, das ist hier

an der Stelle, wo jemand mal drauf gucken sollte

äh, aber das geht halt dann auch nicht in Echtzeit

sondern das wird dann halt irgendwie in so eine

ja, in so eine Queue, in eine Warteschlange

eingereiht, ja, dann gibt's eine Redaktion, die hat dann halt

diese Jobs, muss sich halt irgendwelche Kommentare an

sensitiven Stellen oder so angucken und die

dann abarbeiten, aber

das ist halt sozusagen der, äh,

das, diesen, diesen Job, äh,

in die Warteschlange tun und dieses, dieser, dieser

menschliche Prozess mit menschlicher Interaktion

das ist jetzt nicht mehr Teil von dem Web-Request

das heißt

der Teil muss irgendwie entkoppelt sein

das heißt, der Web-Request

ist ja irgendwie vorbei

aber dieser Web-Request löst dann halt, äh,

irgendwie, schreibt dann halt irgendwie diesen

Job in die Queue, genau, solche Sachen

hat man oft, auch wenn sich, äh, auch

genau, ha, das ist ein gutes Beispiel

das ist mir jetzt eingefallen

äh, vielleicht möchtest du, dass

wenn du jetzt in der Suche, äh,

nach irgendwas suchst, dann

Produkte halt auch vielleicht Bewertungen finden, in denen

jemand über das Produkt gesprochen hat oder so

das heißt, der Text, äh, deiner

Bewertungen muss indiziert werden von der Suchmaschine

äh, aber das geht halt auch nicht

in Echtzeit, sondern das macht die halt vielleicht nur alle

tausend Bewertungen oder so, wird neu indiziert oder so

weil, ja, und

dann wird halt auch so ein Task erzeugt, äh,

für, äh, so, das hier muss

ja noch mitindiziert werden, aber es wird nicht sofort

indiziert, weil das, ähm,

ist halt etwas, was lange, eine Operation

lange dauern kann und man möchte ja nicht, dass der

äh, Web-Request dann

so lange dauert, wie die Operation dauert, sondern

man sagt, okay, man gibt dem Web-Request,

es ist okay, dein Kommentar wurde gespeichert und hat dann aber noch

diesen zusätzlichen Task erzeugt, der dann

irgendwann später ausgeführt werden muss

und dafür braucht man diese Task, Task-Queues

die halt, wenn man ein komplexeres, äh,

Web-System hat, dann braucht man sowas halt,

weil solche Fälle halt immer wieder auftreten

ja, äh, kann man

aber Redis auch für verwenden, äh,

also was für Django ist halt, was häufig

verwendet ist, Salary, kann ich nicht unbedingt

empfehlen, ist irgendwie eher schmerzhaft, ähm,

ja, äh,

die unter, drunter liegenden Geschichten

sind oft sowas wie RabbitMQ oder so

im Allgemeinen ist das Protokoll irgendwie AMQ

psch, irgendwas, weiß nicht genau

ja, aber das ist nochmal ein ganz eigenes, ähm,

äh, Feld mit diesen ganzen Message-Queues

ähm,

ja, äh,

genau

Master-Slaves-Architektur

hatten wir jetzt, äh, ja,

genau, ähm, irgendwann

kann natürlich auch sein, dass das nicht mehr, äh,

dass das nicht mehr reicht

und dann müssen wir halt, äh,

irgendwie die Datenbank auftrennen

also wenn zum Beispiel grad die, äh,

das wird sich, das wird sich nach einem Böden

die Schreiblast groß genug geworden ist

dann, äh, geht das halt alles nicht mehr

äh, und dann kann man halt

äh, die Datenbank muss man dann auftrennen

das ist furchtbar, weil dann verliert man eine ganze

Menge der Vorteile, die man halt, äh,

hat, wenn man eine Datenbank hat, eben referenzielle

Integrität, äh, irgendwie, dass Transaktionen

isoliert sind, diese ganzen Geschichten

das geht alles nicht mehr so wirklich und das muss man dann alles

in der Applikation machen, in der Applikationslogik

und das macht alles Dinge unfassbar

viel komplizierter, deswegen sollte man das möglichst nicht

tun, ja, also, wenn man die mal verkauft, äh,

irgendwie, ja, also,

unser System ist super, weil das schadet

automatisch oder sowas, also das ist nicht etwas, was

man haben will, ja, also wenn das, wenn man

klein genug ist, dass man das nicht braucht

sollte man das nicht machen, weil das bedeutet halt, dass man

diese ganzen Dinge, die einem sonst die Datenbank

quasi schenkt, selber machen muss

in den Applikationscode und das ist halt, äh,

sehr, sehr schwierig

äh, aber manchmal geht's halt leider nicht anders

dann gibt's halt zwei Möglichkeiten, man schadet irgendwie

äh, horizontal, also man sollte

so lange, man nennt das Upscaling

äh, so lange wie möglich die Maschine

größer machen und mehr Hauptspeicher reinstecken

äh, wenn das halt dann irgendwann tatsächlich nicht mehr geht

dann, äh, muss man halt, äh,

entweder horizontal oder vertikal

schaden, äh, und das ist halt

aufzahlen, das heißt, horizontal

äh, man...

Mehrere Maschinen, die die gleiche Datenbank benutzen?

Nee, das, äh, äh, nee, die gleiche

Datenbank würde einem ja nicht helfen, wenn es zu viele

Ja. Ähm, dann muss

die Daten, Datenbank halt irgendwo trennen

und die Frage ist, wo trennt man jetzt auf?

Man kann halt entweder... In Tabellen oder...

Innerhalb von Tabellen die Zeilen auseinander trennen

das wäre eben horizontal skalieren, dass man dann sagt

okay, alle Bücher, die mit Buchstaben A anfangen

kommen jetzt auf die Datenbank, alle Bücher mit Buchstaben

B bis F kommen auf die Datenbank

Mhm.

Ähm... Oder so regional halt Queries trennen

von wo kommt die denn jetzt oder sowas?

Ja, regional kann man natürlich auch trennen

äh, das ist dann nochmal, nochmal eine andere

äh, wäre nochmal eine andere Geschichte, könnte man auch

machen, das heißt aber, das wäre quasi horizontales

Schaden auf den Usern

Mhm. Ja, nach Region eben

Äh, das wird, also, dass man

also meistens würde man auf Usern

schaden irgendwie tatsächlich, ja

Man halt sagt, wo, was ist das für ein User

und dann, ja, entweder regional

oder halt irgendwie

so sonst irgendein Hashwert

oder so, ähm

äh, und vertikal

wäre halt, man trennt

äh, nach Tabellen auf, das heißt

man sagt, okay, wir haben hier ein System, das kümmert

sich um die Bücher, wir haben ein System, das kümmert sich um die User

wir haben ein System, das kümmert sich um

Lagerhaltung, das, das wäre halt

äh, man teilt dann nicht quasi in den Zeilen

sondern man teilt halt an den

Tabellengrenzen

Mhm. Ähm... Ja, macht

natürlich so vollständig, abfragen dann ein bisschen langsamer, oder so

Ja, das Problem ist dann halt, dass man mehrere

äh, Systeme fragen muss, wenn man jetzt

irgendwie was machen, also wenn man jetzt die

Amazon-Seite anzeigen möchte, dann

äh, muss man halt unter Umständen

viele Systeme fragen

Tatsächlich ist es etwas, was Amazon wirklich

passiert ist, irgendwie, ich glaube

2008, 2009 gab es dann auch, äh,

irgendwie haben sie Artikel darüber geschrieben

äh, damals nannte sich

das nicht, also heute läuft das Ganze unter dem Stichwort

irgendwie, Microservices oder so

nennt man das dann, dass man halt, äh

äh, Teile eines Systems

äh, in kleinere Services auslagert

ähm,

damals, äh, nannte sich das

anders, war aber quasi eine gleiche Idee

äh, nannte sich, äh, äh

äh, Service-Oriented

Architecture

äh, und Amazon hatte das Problem, dass sie

auf der Hauptseite, also wenn du einfach nur Amazon.com

eingegeben hast, äh, dann

wurde dir halt das Ding aus, die Seite ausgeliefert

aber damals war es halt

schon so, dass da so viel Zeugs

drin war, also dann werden dir irgendwelche Empfehlungen angezeigt

dann wird dir irgendwas

angezeigt, wo wie viel Zeugs in deinem

Warenkorb ist

und das ist einem zwar nicht so bewusst, aber das ist wirklich

viel Zeug bei Amazon und

sie hatten das Problem, sie machen ungefähr 300

SQL-Statements, wenn du

äh, die Seite

anguckst, oder so ein paar hundert, ja

ähm, da das

irgendwie, ähm

da die irgendwie nur sequentiell ausgeführt

wurden, äh, macht das halt die Latenz hoch, weil

äh, ja, synchron

äh, sequentiell, das heißt

die ganzen Latenzen addieren sich auf

das heißt, allein bis die ganzen

äh, SQL-Statements abgearbeitet sind

vergehen ein paar hundert Millisekunden, äh

und die du einfach warten musst

und das ist halt scheiße, ne, man weiß ungefähr so

weiß ich, pro hundert Millisekunden droppt

dein Conversion 10%

oder so, ich weiß nicht, ne, wahrscheinlich weniger, aber

also, ist halt nicht so gut

das heißt, du kannst ja ausrechnen

wie viel mehr Umsatz du machen würdest, wenn du das

irgendwie schneller ausliefern könntest

joa, äh, und dann haben sie

halt gesagt, okay, das müssen wir irgendwie anders machen

äh, dann haben sie das halt in Services

aufgeteilt, dann haben sie gesagt, okay, wir haben hier den

Recommendation-Service, wo dann die, wo sich die

Webseite per JavaScript irgendwie

macht irgendwie ein XHTTP-Request oder so und holt sich

dann die Recommendations von diesem Service

und dann haben wir den, äh, irgendwie

keine Ahnung, Basket, äh,

Service für deinen Einkaufs, äh,

Korb oder so, äh,

und da ist halt, das Ding holt sich halt, was

für Dinge liegen da momentan grad drin und

äh, ja, ähm

genau, äh, und das

das, äh, das haben die damals so

gemacht, äh, ja, und dann

das geht dann natürlich alles irgendwie mehr oder weniger

auch nicht so total parallel, aber mehr

paralleler als vorher und dann

kann die Webseite insgesamt deutlich schneller sein

ähm, ja

genau, heute, heute würde man sagen, Microservices

du hast halt ein Microservice pro

irgendwie Ding, was du irgendwie da machst

auf der Webseite

und, äh, die komplette Seite

aggregiert nur noch, äh, irgendwie die Daten aus all

diesen Services

äh, ja, das, damit kriegt man das

tatsächlich in den Griff, wenn man so ein riesiges Ding hat

und viele unterschiedliche Sachen und das nicht mehr in eine Datenbank passt

dann kann man das so machen, das ist aber nicht so, dass man das machen sollte

also solange das, solange man das anders

machen kann, solange man das mit einer Datenbank

hinkriegt, sollte man das mit einer Datenbank machen, weil das ist

viel, viel angenehmer

also, äh, Microservices

sind halt dann, man schiebt dann halt einen Haufen

der, äh, äh

der, der, der Komplexität in eine andere

Richtung, man hat dann plötzlich Architekturkomplexität

man hat plötzlich, äh, äh

ja, sozusagen im Ops

äh, Teil von DevOps wird es plötzlich viel schwieriger

man muss halt das alles irgendwie maintainen

man muss halt plötzlich, wenn man jetzt sagt, okay, ich

ähm

äh, ich update jetzt diesen

Service, äh, also dann hängen da halt andere Dinge von

ab unter Umständen

äh, dann

hab ich halt, ich kann, ich kann

ja, sagen wir mal so, wenn man das halt irgendwie so schön

hat, Master-Slave-Architektur, Loadbalancer

davor, vor den Datenbanken, ein paar Frontends

dann, äh, selbst da

ist es schon kompliziert, wenn ich jetzt, äh, irgendwie

äh, äh, zum Beispiel ein Schema

ändern möchte oder so, was ich im Produktivbetrieb

dann vielleicht nicht mehr tun kann, weil die Datenbank viel zu langsam

liefe, weil, wenn ich das Schema

ändere, muss ich bei den Tabellen, die

ich ändere, halt unter Umständen eine Kopie der Tabellen

mehr oder weniger mache, das heißt, ich muss halt

möglicherweise doppelt so viel Daten im Hauptspeicher halten, was

halt vielleicht nicht geht, das heißt

ich muss vielleicht sowas machen wie, ich tausche die Datenbank

aus, ne, ich mach eine Kopie der Datenbank und

äh, die Datenbank mit dem neuen Schema

stell ich dann ins neue Master rein und so

so oft hat man dann so Sachen wie, oder

wenn man die Software updatet, man nimmt halt Sachen

äh, ja

Rechner aus der, aus der Verteilung im Loadbalancer

updatet den, oder die Hälfte

davon, und äh

äh, die andere Hälfte läuft noch auf der alten Software

und dann schaltet man halt um, oder so

ne, solche Sachen kann man machen, und das ist

das geht noch, das ist auch dann schon kompliziert, weil

man muss sich dann halt, äh, Gedanken machen

wie man das tut

und man muss halt irgendein System haben, das unterstützt,

dass man das automatisch machen kann, sodass man halt

nicht jedes Mal, wenn man irgendwie

sowas wie eine Schemaänderung macht, oder wenn man halt

äh, irgendwie eine

komplexere Änderung im Applikationscode

in den Frontends hat, dass man da halt dann irgendwie

jemand setzen muss und das dann von Hand macht, das sollte nicht so sein

sondern man sollte dann auf den Knopf drücken und sagen, okay

jetzt räumen wir das mal aus, und dann passieren diese

Prozesse, die dafür nötig sind, automatisch

wenn man Microservices hat, wird das

Ganze viel schlimmer, das ist halt da nicht so

dann, dann hat man eine viel komplexere Abhängigkeit

zwischen den Geschichten, und dann wird dieses ganze

Ops-Thema halt, äh, richtig, richtig

ätzend, ähm, auch

Skalierung wird richtig ätzend, weil

dann willst du halt, wenn du halt, ja, so

in so einer klassischen Architektur hast du nur

wenige unterschiedliche Arten von

äh, ähm

Maschinen, die halt irgendwas machen, du hast halt Datenbanken, du hast halt

irgendwie Redis oder sowas

äh, du hast halt Frontends, äh, vielleicht

doch vorne irgendwie, äh

äh, Webserver, die SSL

äh, ähm, Terminierung machen

oder so, aber, aber das war's im Grunde, also du hast nicht so

wahnsinnig viele unterschiedliche Dinge, beim Microservice

hast du halt, ja, vielleicht

hundert unterschiedliche Arten von Microservices, die du

unterschiedlich skalieren musst, wo du auch unterschiedliche Sachen

aufpassen musst, das ist alles furchtbar, also

geht, also man kriegt damit halt Sachen

in den Griff, die, äh, dann halt, wenn man

mit, äh, diesem Muster, man hat halt

eine Datenbank, in der die Wahrheit drinsteht, nicht mehr

äh, wenn das nicht mehr ausreicht, kann man

das dann halt so in den Griff kriegen, aber es ist halt

dann schon schlimm, ja

äh, genau

ähm, okay, sind wir schon ganz

groß, das heißt, wir müssen noch ziemlich viel, äh,

Bachtes haben, okay, genau

oh, das hab ich, äh, ja, was haben wir denn

äh

ja

ähm

ich guck gerade in die Liste, was wir jetzt noch

alles haben und was noch nicht, genau

äh

das ist nämlich tatsächlich relativ viel, ja, ja, ja

oh mein Gott, ich weiß nicht, wie lange

wie lange sind wir denn schon dran, ich glaube, wir sind über zwei Stunden

schon, oder, oder nicht ganz, nein, noch nicht ganz, na gut

dann, das ist harmlos, naja

achso, genau

was ich hier noch, ein Punkt war, es können auch

im Analyse-System auch Sachen wieder

zurücklaufen, äh, zum Beispiel gibt es halt diverse

Sachen, die gelockt werden, die dann aber trotzdem für die

Transaktionen wieder eine Rolle spielen

äh, wie so etwas, das hatten wir noch gar nicht

ist auch, äh, die Suche, ja, am Anfang

äh, man braucht ja auf jeden Fall, wenn man irgendwie so

eine E-Commerce-Seite hat, irgendwie eine, eine Suchmaschine

wo man irgendwie nach Büchern suchen kann, oder so

äh, das geht

auch tatsächlich mit Postgres direkt, voll gut

äh, hat eine integrierte, äh

integrierten Volltext-Index, ähm, ja

ja, und

äh, man möchte halt auch so eine Facetten-Navigation

nennt man das, haben, wo man, wenn man jetzt

nach irgendwas gesucht hat,

hat halt eine Ergebnisliste, dann möchte man einschränken

nach Kategorien, oder nach, weiß ich jetzt, wenn

wenn es nicht um Bücher geht, sondern um

Elektronik oder so, kann man vielleicht noch Hauptspeicher

oder, äh,

VHS

oder Betamax, ja, so möchte man vielleicht

auswählen können

und, äh, genau

ähm, das geht mit Postgres

alles sehr schön, auch da kann man

äh, äh, irgendwie

die Counts für die Facetten ganz gut rauskriegen

ansonsten, wenn man das halt über eine eigene

äh, äh, ja,

Spezial-Datenbank sowas wie, äh, Elasticsearch

macht oder Lucille, äh, äh,

beides Lucille-basiert oder, oder Solar oder so

macht, dann hat man das Problem, da hat man auch wieder dieses

wie bei ETL, das Synchronisationsproblem, du hast halt

wenn sich an der Datenbank was ändert, müssen die Änderungen in den

Index rein, da hast du

eine Latenz dazwischen, äh,

wenn du Sachen aus dem Index rausholst, ja,

du, äh, suchen, hast jetzt eine Volltext-Suchanfrage

und kriegst jetzt IDs aus der

Suchmaschine, dann

möchtest du aber vielleicht nach was filtern, was nur in der

Datenbank drinsteht, dann musst du nochmal auf die Datenbank

äh, da alle Daten raus,

äh, ziehen und dann nochmal Counts anders

ausrechnen, ja, vielleicht ein paar der Facetten-Counts

kommen aus der Suchmaschine, ein paar kommen aber aus der

Datenbank, das heißt, du hast nicht nur einen Roundtrip

über die Suchmaschine, du hast auch noch einen Roundtrip über die Datenbank,

wo du halt irgendwie select, äh,

irgendwie diverse Sachen vom Datenbank,

äh, where und dann kommt halt ID in

und dann kommen tausend IDs und so,

äh, das ist alles

kompliziert, wenn das halt ein Statement

ist, was du halt abfeuerst oder halt

vielleicht eins für die Daten selber

und eins für die Counts oder so, ähm,

dann ist das halt deutlich

ist alles irgendwie viel einfacher

und, äh, mit Postgres kriegt man auch das am Anfang

äh, alles hin und, ähm,

ja, das ist eigentlich, äh, eigentlich sehr nett

äh, irgendwann geht das aber wahrscheinlich dann halt

eben auch nicht mehr, dann muss man halt nach und nach

Funktionen in Spezial, äh,

Services halt auslagern, ne, eine der ersten, die man

wahrscheinlich auslagern wird, ist halt Volltext-Suche

möglicherweise, das macht dann halt irgendwann

ein Listing-Search oder, oder

Solar oder so, äh,

aber halt auch, ähm, eben

sowas wie, wenn man jetzt

anfängt eine Query zu schreiben

äh, kennt man eben

Google Suggest, hatte ich eben schon erwähnt, äh

ähm, kriegt man halt so Vorschläge

das, das ist im Grunde, man

macht dann halt, äh, man sucht auf den, auf den

Query, Queries von anderen

Leuten, äh, aber dann hat man halt genau das

Problem, dass halt sozusagen

die History der Queries muss halt

irgendwie aus dem Analyse-Ding wieder zurück ins

OLTP-System oder in irgendeinen anderen Service, der

äh, auf dem man dann per Suffix-Tree

irgendwie nach

Queries, die

möglichst ähnlich sind zu den

drei Buchstaben, die man jetzt schon eingegeben hat oder so

äh, äh, raussuchen

Ja, natürlich, wenn man tippen kann, drei, vier, fünf

Ja, ja, ja, und, äh, also man kann das am Anfang

äh, auch alles über Postgres machen, wenn's dann halt komplizierter

wird, muss man das als ein eigenes Service auslagern

und so weiter und so, dann wird's halt alles, dann wird

das System größer und schwieriger und

ja, äh, genau

und, ähm, ja

und immer die Datenbanken, die man nimmt

werden halt immer spezialisiert, also das würde ich auch empfehlen

also man fängt halt mit Postgres an, macht

mit Postgres einfach alles und wenn man dann halt

irgendwann an Grenzen stößt, dann muss man halt, äh

äh, ja

wo du dir übel, äh, dann Sachen in halt Spezialdatenbanken

auslagern, wo du

äh, und, äh, ja

äh, bezahlt dann halt mit Komplexität

ähm

genau, äh

Ja, jetzt müssen wir nochmal, wie wir das weitermachen

genau, wir nehmen, wir nehmen Redis

zum Cachen, einfach

äh, von, von langlaufenden Queries und von

irgendwie gerenderten Fragmenten, die halt aufwendig

zu rendern sind, äh, also irgendwelche Listen von

von Dingen oder so, die sich aber jetzt nicht

äh, dauernd ändern

äh

ähm

und

genau, ähm

Ja, die Daten werden noch immer

größer und das Problem ist auch, wir sind mittlerweile weltweit

unterwegs, äh, wir verkaufen

nicht nur Bücher, wir verkaufen

alles von A bis Z

die Amazon, das habt ihr ja schon gesehen, habt ihr

den Pfeil von A bis Z

Amazon und, ähm

ja

äh, dann stellt sich ja die Frage, wenn

wir das global machen, wo stellen wir dann die Maßnahmen eigentlich hin?

Das ist halt auch schwierig

ja, äh

Wo wird der entstehen? Also in einem sicheren Land?

Ja

Wir müssen an alle Stellen irgendwie so einen kleinen

Master stellen, wo halt viel, äh, Traffic ist

Kann man den Master mirern, dass man dann tatsächlich

sagt, dass überall derselbe, äh

Ja, es gibt natürlich auch irgendwie für diese, diese Geschichten so Lösungen, dass man halt

dass die Master sich miteinander synchronisieren

das gibt's für Postgres auch, aber das ist alles irgendwie

ich weiß nicht so genau

alles nicht so richtig, das funktioniert alles nicht so richtig

und, äh, ja

da gibt's, es gibt auf jeden Fall keine nette

äh, äh, das ist halt auch ein

mehr oder weniger unlösbares Problem, also

äh, das ist auch theoretisch quasi nicht wirklich in den Griff

zu kriegen. Man kann aber

ähm, Dinge tun, indem man halt auf andere

Architekturen umstellt, man kann halt

äh, ja, also

ich hab jetzt mal hier als Beispiel genommen

diese, du willst halt, dass

manche Sachen immer funktionieren

Ja, eigentlich sollte immer

alle Sachen, möglichen Sachen funktionieren, ja

und manchmal ist dir dann halt irgendwie

die Konsistenz und so egal, ja, also

äh, zum Beispiel für Amazon super wichtig, äh

äh, ist halt der Einkaufswagen, ja

du musst halt immer weiter, das Preis muss fließen

jetzt musst du immer weiter einkaufen können

äh, auch wenn jetzt, äh, daher haben

sie das halt, ich glaub das war auch

Amazon Dynamo basiert

auf einem System, das sie für sich selbst

gebaut haben, eben für genau diesen

Shopping Basket und

der halt genau darauf ausgelegt ist, dass dieses Ding

halt einfach immer funktioniert. Und das ist

mehr oder weniger einfach nur so ein total simpler

Key-Value-Store

und du lebst halt dann damit, dass

das nicht konsistent ist. Oder dass

halt, wenn du was kaufst,

das halt vielleicht nicht mehr im Lager ist. Das kann dann

durchaus passieren, weil dieses Ding ist halt ein eigener Service,

das hat keine Verbindung

zu einer zentralen, das hat schon keine Verbindung,

aber es kann halt nicht den echten Status

abfragen, weil wo ist der? Das ist halt schwer zu sagen.

Und

das, was Amazon dann macht, tatsächlich,

habe ich auch gehört, dass

solche Sachen können dann ja auftreten. Du kaufst ein Buch,

das ist nicht mehr

lieferbar. Und jetzt?

Also das heißt, es fällt erst so fünf Minuten später

bei Amazon auf.

Geht nicht. Wir haben jetzt zwar, hat jemand

was bestellt, wir haben die Bestellung zugesagt, du hast

eine Bestätigungs-Mail bekommen irgendwie

und jetzt fällt aber auf so, fuck, im Lager ist

das nicht mehr drin. Wir können es

dir nicht schicken. Was macht Amazon dann?

Ja, also höchstens entweder nachordern

von irgendeinem Service, wie wir eben das Problem hatten,

oder die sagen dann irgendwann so,

wir schicken dir einen Gutschein raus,

irgendwas gibt es nicht.

Genau, es kommt eine Entschuldigungs-Mail und sie geben dir

einen Gutschein. Da das nicht so

super häufig passiert, ist das halt nicht schlimm.

Das ist halt viel einfacher,

das über Gutschein zu lösen,

als über ein Datenbanksystem,

was das irgendwie handeln kann, weil das gibt es

eben einfach nicht.

Und ja,

einfach kurz den 3D-Drucker anschmeißen,

wird schnell nachproduziert.

Ja, genau, das ist halt

das auch, was dann halt gebrochen wird

in relationalen Datenbanknehmern, das ist oft

Asset, also

Atomicity, Consistency,

Isolation und Durability.

Atomicity ist

eigentlich quasi das, was Transaktionen betrifft,

dass halt entweder alles gut geht oder

alles

fehlschlägt, aber nicht irgendwie Teile einer Transaktion

oder Teile von einer Menge von Dingen,

die man tun will, halt gehen und dann

mancher Sachen nicht gehen, das sollte halt nicht passieren.

Consistency heißt halt,

dass

die ganzen Foreign Key,

dass halt die referenzielle Integrität halt gewahrt

bleibt, dass da Sachen nicht zerbrechen, was halt

dann auch nicht mehr geht, wenn du Sachen über mehrere Datenbanken verteilst,

weil dann hast du halt teilweise

eben keine direkten Verbindungen, sondern du hast halt bloß

wie APIs dazwischen.

Isolation

ist halt die Geschichte, dass du

nicht

Sachen, die andere Transaktionen machen,

in deinen Daten siehst, also das ist halt, man nennt das

Dirty Read, wenn du halt

in deiner Transaktion Dinge

aus anderen Transaktionen siehst, die noch nicht abgeschlossen sind,

sodass du halt, dass du immer,

dass deine Sicht auf die Daten

mal komplett isoliert ist. Es gibt unterschiedliche

Isolationslevel.

Postgres hat per Default den

höchsten, glaube ich,

Serializable ist der höchste, dann gibt es noch

Repeatable Read.

Repeatable Read war

lange, war es glaube ich lange, aber

mittlerweile ist es Serializable.

Kann man auch nachgucken, was das bedeutet.

Es gibt da feine Unterschiede.

Und

genau,

Isolation und Durability ist halt

einfach nur das, wenn eine Transaktion

gesagt hat, okay, ich bin durchgeführt, dass dann halt

auch nichts mehr schief gehen kann.

Was extrem

schwierig ist zu implementieren.

Strom aus.

Genau, Strom aus muss trotzdem, wenn

die Datenbank wieder hochkommt, alles

im richtigen Zustand sein.

Aber das kann man ja oft dann nicht so wirklich

gewährleisten.

Also man kann ja nicht, das ist halt

Der Hauptspeicher ist ja flüchtig und nicht

Der Hauptspeicher ist flüchtig, das heißt, man darf es nicht in den Hauptspeicher

einfach nur schreiben, sondern die Transaktion darf

erst als dann durchgegangen

zurück,

ist durchgegangen, wird zurückgegeben,

wenn das im Ride-Ahead-Log gelandet

ist und das mit F-Sync

irgendwie auf die Platte geschrieben ist.

Ja, und

F-Sync ist halt teurer,

teurer Syscall,

das macht das sehr langsam,

auch diese Isolation

macht es halt langsam, aber das sind auch

alle Sachen, die man halt weiter runterfahren kann.

Du kannst halt zum Beispiel auch,

das machen Leute halt

auch für Postgres zum Beispiel,

du kannst unterschiedlichen Usern

unterschiedliche Isolationslevel geben, und dann kannst du

sagen, wenn jemand Analyse-Querries macht,

oder bestimmte Arten von Queries,

bei denen es völlig egal ist, ob die

super isoliert sind oder nicht, dann kannst du sagen,

dieser User hat halt

ein viel niedrigeres Isolationslevel,

der macht dann halt Dirt-Reads, aber das ist halt

egal für dessen.

So kann man Sachen deutlich beschleunigen.

Dann, was man auch machen kann,

das sollte man halt jetzt nicht tun, wenn man

Bestellungstransaktionen

prozessiert, aber

zum Beispiel, wenn man testet.

Oft hat man ja

viele Tests für eine Applikation

und es dauert lange, bis die durchlaufen,

wenn man jetzt irgendeine Änderung macht,

und man führt die Tests aus und das dauert ein paar Minuten,

das ist halt schlecht, weil es halt diesen,

man ändert was, führt die Tests aus

und hat dann sofort Feedback,

der Cycle irgendwie

kaputt macht, wenn man dann halt

Kaffee trinken gehen muss, und das macht

auch so ein bisschen die Konzentration kaputt.

Daher wäre es

schön, wenn die Tests irgendwie schnell laufen würden,

und da man aber

auch für die Tests, wenn man jetzt

ein Django-Projekt hat, auch die echten Daten, auch

Postgres verwenden will, was viele Leute machen,

früher gemacht haben, ist dann halt ein SQLite

zu verwenden, das nur in Memory ist.

Das geht dann viel schneller, aber das Problem

ist halt, dass SQLite

sich anders verhält als Postgres, und dann laufen die

Tests durch, und man denkt, das ist alles gut, und dann

geht es auf die Datenbank, und dann geht es schief.

Nicht so gut.

Aber was man tatsächlich machen kann, ist

Postgres zu sagen, ja, irgendwie nicht

absinken, macht man nicht.

Und man kann auch die Postgres dann auf eine

In-Memory-Partition

legen, quasi, das geht auch.

Kann man auch irgendwie, per Docker-Argumenten

kann man das irgendwie sagen, und dann sind die Tests halt

viel, viel schneller. Weil für Tests ist es mir egal, ob das

jetzt, wenn der Strom ausgeht, dann ist es mir wurscht.

Ich meine, die Testdatenbank schmeißt

sowieso nach jedem Testlauf wieder weg, quasi.

Also,

ja, aber für die echte Produktionsdatenbank,

die muss halt bei Transaktionen tatsächlich

dafür sorgen, dass das nicht mehr verschwinden kann,

und das heißt, sie muss Absinthe aufrufen, und dann

ist das halt einfach langsam, da kann man auch nichts machen.

Okay, einmal ein bisschen Acid, ne?

Ja, genau, haben wir Acid.

Und dann, ja, also was wir

dann heutzutage oft haben, sehen

bei

Datenbanken,

die das halt, oder Dokumentdatenbanken,

genau, ist halt ein anderes

Party-Management, das nennt sich Base,

also Basic Availability,

Soft-State, Eventual Consistency,

also, wo man halt versucht, die Sachen so

aufzulockern, um halt es möglich zu machen,

dass man zum Beispiel mehrere

Datenbanken

schreiben kann.

Ja.

Ja.

Wir sind jetzt dann ziemlich groß geworden, oder?

Ja, genau,

wir sind jetzt ziemlich groß, und was wir jetzt haben, wenn wir auf

mehrere Sachen

schreiben wollen,

ist halt, genau, das Acid ist halt weg,

Pech gehabt.

Nein, wir haben noch ein anderes Ding,

das ist dann noch

das Cap Theorem,

Consistency, Availability

und Partition Tolerance,

das ist halt auch dieses, wenn man immer, wenn man so Sachen

Pick-Two-out-of-Three-Sachen sieht,

also das Cap Theorem ist halt so das ursprüngliche

Ding dafür, du kannst halt zwei davon

hinkriegen, aber drei nicht, und Partition Tolerance

ist leider nicht optional, das musst du halt

haben, weil dann noch Partition Tolerance,

also was ist, wenn,

wenn Netzwerkverbindung zwischen

zwei deiner Datenbank-Dinger

irgendwie wegfällt, oder so,

das musst du halt leider,

das ist halt mandatory,

sozusagen, und

das heißt, du kannst nur noch zwischen

Consistency und Availability

halt irgendwie wählen.

Und du hast halt, ja,

dann gibt's halt Datenbanken, die dann halt

unterschiedliche Trade-Offs realisieren.

Ja.

Ja.

Genau.

Das ist zum Beispiel, ein interessanter

Fall ist halt sowas wie CouchDB,

die halt,

wo du sogar, wenn du halt offline bist,

immer noch,

wo du immer noch eine Datenbankverbindung

hast, oder immer noch deine Applikation benutzen kannst, und die

schreibt dann halt das in eine lokale

CouchDB-Instanz, auch interessant,

weil es ist halt so ein JavaScript-Ding,

aber

früher hatte man so

jQuery als Abstraktionslevel für

alles, was irgendwie auf diesem

DOM-Modell im Browser irgendwie Dinge tut.

Man möchte es ja vereinheitlichen, alle Browser haben das

unterschiedlich, die haben da unterschiedliche Funktionen gehabt.

Also hatte man jQuery, und wenn man jQuery

konnte, dann war es einem halt quasi egal,

welcher Browser da drunter lag, und bei

CouchDB ist es so, das abstrahiert so ein bisschen

diese Storage-APIs, die Browser haben.

Das ist halt quasi dafür gedacht,

wenn du jetzt eine lokale,

wenn du eine Webseite

auf einem Smartphone

hast, oder so, und du hast halt nicht immer

Verbindungen, du möchtest

aber trotzdem, dass dich deine Webseite

so anfühlt, als hättest du irgendwie

eine Verbindung, so offline

first, oder so, jetzt

im Shopping-Kontext ist das halt nicht so

richtig gut vorstellbar, warum das irgendwie

sinnvoll ist, aber nehmen wir an, du hast jetzt irgendwie sowas wie

Trello, also irgendwie so Tasks

oder so, wo du Sachen machen kannst,

da möchtest du nicht, dass wenn du jetzt durch einen Tunnel fährst,

dann nichts mehr geht, sondern

das geht halt mit CouchDB,

das ist halt sozusagen wie Jackfairy Lea

über dem Storage-API von deinem Browser,

weil die können das ja auch alle mittlerweile, die haben meistens

SQLite oder sonst irgendwas drunter, und dann

halt APIs, mit denen du da irgendwie Dinge drauf tun kannst,

und

was CouchDB jetzt letztendlich

macht, ist da nochmal ein Layer drüber zu liegen, und

so ein Replikationsfeature

zu haben,

in alle möglichen Richtungen, also es sind halt

Master-Master, oder

Datenbank zu Datenbank in alle Richtungen, es ist halt nur so,

dass ab und zu können halt Konflikte auftreten, und die

müssen dann vom User gelöst werden,

das heißt, du wirst halt manchmal gefragt, ist das oder das

richtig, aber

das passiert jetzt auch nicht so super häufig,

und das ist halt schon sehr, sehr nett, also

das ist halt,

also du kannst halt, auch wenn du offline bist,

halt deine Web-Anwendung weiter so benutzen,

als wärst du

online, und das synchronisiert sich halt

in dem Moment, wo du halt wieder Verbindungen hast,

und

ja, das ist halt dann sehr auf der

Availability-Seite, und halt dann auf der Konsistenz-Seite

halt nicht, deswegen musst du halt dann

Sachen auch, Konflikte manuell

unter Umständen lösen.

Genau.

Ja.

So, jetzt haben wir, okay,

jetzt sind wir, glaube ich,

im Grunde

mit dem ganzen traditionellen Kram

mehr oder weniger durch,

wahrscheinlich nicht so wirklich,

wahrscheinlich haben wir es schon ganz lange geschafft,

aber, und jetzt kommt eigentlich nur noch

nur noch ein Teil, und das ist halt

irgendwie so Big Data, oder

Urlaub-Geschichten für

wirklich große Dinge.

Really, really, really big things.

Ja, also, ich meine, Big Data

ist ja so ein bisschen, ich weiß nicht, was

sagt, was

würdest du sagen, ist Big Data, oder

warum wollen Leute das haben, oder?

Ja, also, erstmal hört sich cool an, und also

jede echte Tablette mit mehr als, weiß nicht, tausend Teilen

kann man schon dann irgendwie fick machen, oder sowas.

Also, das kommt halt, glaube ich, ein bisschen auf den Anwendungsfall

an, und jeder hat natürlich gerne Big Data, weil es

natürlich super ist, man ganz viel machen kann,

man kann Analysen mitfahren, und sowas.

Alles, was

halt irgendwie anfällt an Dingen, die man

durch die ganzen modernen Daten irgendwie so jederzeit

bekommt, ist dann irgendwann sehr big.

Fühlt sich einfach groß an, wenn man

ganz viele Sensordaten von verschiedenen

Punkten bekommt, was soll man damit machen, man treibt hier irgendwelche

Excel-Tabellen rein, also

die liegen dann halt auf irgendwelchen

Servern, oder halt auch einfach nur

Rechnern rum, und dann hat man ganz viele

große Informationen, ohne dass man damit was anfangen kann bisher.

Das ist vielleicht schon Big Data, ich weiß

nicht, also, ich glaube, dass überall

Daten vorhanden sind, ist vielleicht das eigentliche

Big Data, aber ob jetzt so im Einzelfall

das wirklich big ist, was sagst du?

Ja, also, genau, ich habe auch,

es gibt dann sehr unterschiedliche

Auffassungen davon,

es gibt dann Leute, die sagen so, ja, was ist nicht mehr in der Excel-Tabelle,

was ist schon so, also, ich würde sagen,

vielleicht etwas halbwegs Vernünftigeres ist halt, was nicht mehr

auf einen Computer passt, aber auch das

greift eigentlich zu kurz, ich habe dann letztens

nochmal irgendwie,

Feines Spiel ist er nun.

Ja, das war irgendein Talk von

Michael Stonebreaker, das ist auch, es gibt so,

das sind immer die gleichen Namen, auf die man irgendwie in dieser Datenmark-Welt

stößt, das sind halt so, Michael Stonebreaker,

Jim Ray,

Taccott, weiß ich nicht,

Ducatting,

das ist auch

der, der hat auch so einen

ja, der hat Postgres mitgegründet

oder Ingress vorher und dann Postgres

und auch

viele der noch moderne, der heute

jetzt ganz modernen Geschichten, wie

Column Stores, also C-Store, Papers von

ihm, Volt, wie für so

In-Memory-Datenbanken-Geschichten,

ja, der definiert

das so, der sagt halt, naja, es gibt eigentlich nur noch drei

Arten, wie Data-Big sein kann, nämlich

irgendwie, ja, es ist einfach

zu viel, ja, du hast, und der sagt halt

nicht irgendwas Konkretes, sondern halt,

du hast halt Probleme mit der Datenmenge, ja, also

es ist halt, wenn du wirklich Schwierigkeiten damit hast

und damit nicht fertig wärst, dann hast du halt

ein Problem mit der Datenmenge und dann hast du halt

Big Data, weil es halt für dich schwierig ist,

mit dieser Menge klarzukommen, aber

was halt auch sein kann, ist, und dann hast du halt

auch ein Big Data-Problem, auch wenn es

jetzt nicht unbedingt eins ist, das

das mit der Datenmenge zu tun hat, wenn

die Daten zu schnell kommen, also du könntest mit der Datenmenge

vielleicht klarkommen, aber sie kommen so schnell, dass du irgendwie

nicht fertig wirst.

Ja, dann hast du auch ein Big Data-Problem,

aber halt eine andere Art von Big Data-Problem,

es gibt dann noch eins, das ist halt, wenn

Daten aus ganz vielen, sehr unterschiedlichen

Quellen und sehr unterschiedlicher Art kommen,

sind es vielleicht gar nicht so viele und sie kommen auch nicht so schnell,

aber du kriegst sie nicht schnell genug integriert

oder kriegst es halt nicht in den Griff. Da hast du auch wieder

ein Big Data-Problem, was auch wieder leicht anders ist, und diese

drei Dinger sind halt eigentlich alle irgendwie so ein bisschen

unterschiedlich, und

ja,

oft

wird es nicht so richtig klar, und oft ist es,

ich würde auch sagen, Big Data ist so ein gehyptes Ding,

und

ja, irgendwie, es gibt

ganz viele Hadoop-Cluster verkauft.

Was ist ein Hadoop-Cluster?

Ja, es ist,

Hadoop ist irgendwie so ein,

das Start ist ein

Apache-Projekt,

das irgendwie mal gestartet ist als so

Implementierung eines

Konzepts, nennt sich MapReduce,

das ist ein Paper, das hat Google mal veröffentlicht,

Jeff Dean und noch ein paar andere

haben das veröffentlicht, 2004

glaube ich, und das

ist halt eine Art, mit großen

Datenmengen umzugehen, und die halt so

horizontal irgendwie auf ganz viele Maschinen

zu skalieren. Das funktioniert

im Grunde so, dass es halt auch genau dafür gedacht ist,

wenn man jetzt einen großen Suchindex, wie man

bei Google zum Beispiel hat, irgendwie bauen

möchte über das gesamte Web, dann

kann man das halt eben nicht auf einer Maschine tun, das ist halt

völlig ausgeschlossen,

und man möchte das halt irgendwie

ja, auf möglichst viele

Maschinen, so eine halbe Million, eine Million oder so, skalieren.

Wie macht man das? Und

das Konzept, das sich dafür überlegt haben, nennt sich halt

MapReduce, und ist auch eigentlich

nicht wirklich was Neues, früher gab es da

auch schon ein ähnliches Konzept, wie nennt man sich

ScalaGather oder sowas, und

im Distributed Computing Teil

gibt es auch diverse Geschichten, die so ähnlich sind,

aber so auf der Skala und so, und

die Art, wie sie das konkret machen, ist halt schon, war schon

irgendwie was Neues, und auch ein sehr, sehr, sehr

cooler Ansatz, und zwar machen sie das halt

so, dass, also im Grunde kann man sich das vorstellen,

wenn man jetzt eine Webseite hat,

viele Rechner, die halt Webseiten

crawlen, nimmt man den Text, zerlegt den halt

in Worte, und man

spuckt jetzt sozusagen für jedes Wort

einmal das Wort, oder für die Webseite

die Worte aus, aus denen die

Webseite besteht, plus die Anzahl, wie oft das

vorkommt. Das ist halt sozusagen

die Map-Phase, und das machst du jetzt auf allen

Maschinen,

und dann führst du das halt irgendwann wieder zusammen

in einem Reducer,

und, also

was du bauen möchtest, ist sozusagen so

ein Index,

das ist halt

wie ein Index in einem

Buch,

wo halt steht, welches Wort kommt auf welcher

Seite vor, ja, und du musst,

musst halt für so ein Webseiten-Internet, musst du halt sagen, welches Wort

kommt auf welcher Webseite

vor,

das ist halt das, was du hinterher haben willst.

Und die sortiert man dann

nach der Reihenfolge, wie oft das immer vorkommt, oder so

ungefähr. Genau, man muss halt auch wissen, wie oft das

vorkommt, weil man halt bestimmte

Geschichten nutzt, man, ja.

Wir stehen am Anfang von der Liste, wie oft das

vorkommt. Ja, man rechnet so

TF-IDF-Scores aus, und dafür brauchen wir halt die

Term-Frequenz. So, bitte, was? TF-IDF-Scores?

Ja, Term-Frequenz mal

Inverse Document Frequency.

Das ist halt sozusagen ein wichtiger Wert dafür, wie

wichtig jetzt

ein Wort

ist in einem, in einer

Webseite oder in einem Dokument.

Und dafür muss man halt zählen, wie oft ein Wort vorkommt.

Ja, aber man muss

halt auch zählen,

wie oft das Wort überhaupt vorkommt.

Und dann generell das noch mit dem

Kontext und der Wichtigkeit und so im Zusammenhang setzen.

Ja, also in dieser Webphase imitiert man im Grunde

nur, welche Webseite war das, wie

oft ist das Wort da vorgekommen, und dann werden

diese Ströme dann zusammenreduced,

und dann sozusagen

hat man halt irgendwie dann diesen Index,

wo dann zu jedem Wort steht, auf welchen Webseiten es vorkam,

ja, wie oft,

und wie oft es insgesamt vorkam und so.

Und dann kann man irgendwie so Anfragen machen.

Und das kann man halt komplett voneinander trennen,

da halt bestimmte,

da man, da sich diese

Sachen komplett voneinander,

du kannst halt nach Worten auftrennen.

Also, du musst halt

nur dafür sorgen, dass das gleiche Wort immer

auf, dass alle Sachen, die zum

gleichen Wort gehören, zusammengeführt werden.

Aber du kannst halt

ja, für unterschiedliche Worte

unterschiedliche Maschinen benutzen.

Das ist halt gar kein Problem.

Und damit kannst du es quasi beliebig horizontal skalieren.

Auch da wiederum ist es schwer zu erklären,

man kann sich das einfach mal angucken, aber gibt's auch...

Rechenzentrum, da schalte einfach noch eine Maschine ein, wenn du welche brauchst.

Genau, du kannst halt einfach immer mehr

Maschinen dazustellen und

viele Leute haben sich gedacht, oh, das war eine coole

Idee und dann

ja,

einer von denen,

der Namen man immer hört, irgendwie,

der hat damals schon bei Excite

die Suchmaschine gebaut, hat dann später

eine sehr populäre oder immer noch die

populärste Volltext-Suchmaschine, die es

so gibt, Lucine, oder ist die Engine darunter

jedenfalls geschrieben,

auch ein Buch darüber,

das

ja, und irgendwann hat er sich halt diesen

ist er eher so in diesen Big Data

Hadoop-Bereich gegangen, der hat halt ursprünglich auch

irgendwie dieses Hadoop-Projekt dann

losgetreten und dabei ging es halt darum,

ein System wie das, was Google halt

zum Bauen der NDCs verwendet hat,

in Open Source nachzubauen

unter diesem

Apache-Projekt

Schirm und

ja, das hat auch gut funktioniert,

alles

ist ein Riesenprojekt geworden,

es ist auch für manche Sachen halt

total super, ich würde jetzt nur sagen,

es wird heute viele Dinge verwendet, für die es

vielleicht nicht so gut geeignet ist eigentlich

und

ja, also es ist, glaube ich, für viele Firmen

heute so die generische Data-Warehouse-Lösung

geworden,

obwohl es dafür, weiß ich nicht,

also ich würde ja sagen, zum Beispiel

viele Firmen haben eben keinen Big Data,

die haben keines dieser drei Big Data-Probleme,

sondern

du bist eigentlich noch nicht, wie die es machen sollen.

Ja, die haben einfach nur Daten,

und eigentlich passt das an den Hauptspeicher

und die brauchen nichts davon, das ist, die können einfach

die, also

Ja, oder

irgendwie, nicht mal das,

ja, ja,

also

ein Freund von mir sagt dann immer so,

ach, ich hab das,

und ich glaube, ich hab das Twitter gelesen,

Unsinn, also man sollte

irgendwie, ich weiß aber nicht mehr, wer es war,

ich sollte eigentlich mal einen Consulting-Service gründen,

der irgendwie,

den man engagieren

kann,

wenn man vor der Frage steht, ob man sich jetzt

ein Hadoop-Cluster irgendwie kaufen möchte oder nicht,

die Antwort ist immer nein,

gehe ich da hin und sage,

lass mich überlegen, äh, nein.

Deine Daten

fit in den RAM, ja,

no.

Und da einfach jedes Mal

10.000 Dollar für verlangen,

das würde, hätte ich irgendwie

ein nettes Einkommen durch,

und würde den Unternehmen ein Vielfaches davon sparen,

von dem, was sie dann ausgeben, wenn sie

Hadoop-Beratung, das hat der Frühjahrsagent,

ja,

äh, und das ist,

da ist leider vielmehr was dran, also es gibt

wenige, die das wirklich brauchen, äh, viele, äh,

schaffen es sich trotzdem an und haben

dann ein kompliziertes, eine, äh,

komplizierte Lösung für ein Problem, das sie nicht haben.

Ich meine, das ist natürlich für die Leute, die

Geld verdienen. Genau, das Problem, was sie haben,

ist das einfach total kompliziert, äh,

zu benutzen, also Dinge wären

viel einfacher, wenn sie das nicht machen würden, aber,

naja, so ist es halt nun mal,

äh,

und von diesem MapReduce-Ding ist auch,

äh, diese ganze Hadoop-Welt auch schon so ein,

so ein bisschen wieder weg, auch Google macht

nicht mehr wirklich, äh,

äh, MapReduce, also vielleicht, manche Sachen

machen sie möglicherweise noch MapReduce, aber es sind

auch andere Systeme, äh, gegangen, äh,

Pregel, so ein Graph-Processing-Ding,

was sie da machen, was halt relativ viel

tut von dem, was früher MapReduce gemacht hat,

ähm,

und, ähm, auch bei Hadoop ist es

halt so, dass, äh, das, was geblieben

ist, ist irgendwie so ein verteilter Dateisystem-Layer,

so auch Management

von diesen, äh,

Nodes, äh, irgendwie in diesem, in diesem

Pflaster,

ähm, aber, äh,

die, äh, Engines,

die jetzt irgendwie Queries darauf prozessen,

dafür gibt's halt, äh, das nennt sich Hive,

irgendwie, da schreibt man Queries in so einem SQL-ähnlichen,

äh, oder, das ist schon SQL,

man schreibt halt so SQL,

und das wird dann halt in MapReduce-Jobs

verwandelt und wird dann halt auf den,

äh, ja, also im Grunde die Idee

bei dem ganzen, bei der ganzen Geschichte ist, dass man halt

nicht mehr die Daten zu einer Stelle bringt,

wo sie dann processed werden, sondern man bringt

den Algorithmus zu den Daten,

die liegen halt, man kann die Daten nicht mehr an einer Stelle

zusammenführen, weil es sind einfach zu viele, die liegen halt

auf den lokalen Nodes, und man, äh,

trägt jetzt den Algorithmus zu diesen Daten,

und der läuft dann halt lokal

auf den, auf den Clusternodes da drüber, und dann

am Schluss wird das alles wieder zusammengeführt, äh,

zusammenreduced, und dann kriegt man halt das

Ergebnis, ja, und für einen selber sieht das so aus,

man schreibt halt ein SQL-Statement und kriegt halt

ein Ergebnis, äh, und in Wirklichkeit

hat man dann halt irgendwie einen Job gebaut, der

dann halt, äh, 100 Mapper,

100 Reducer angestoßen hat,

und das lief halt über 200 Maschinen, und, ähm,

ja.

Big. Ja, ja, ja.

Hatte vielleicht das Problem nur Big Data dann, also

Big, nicht Data. Ja.

Haha. Aber, ja,

aber es wäre halt, das hat dann vielleicht

eine halbe Stunde gedauert, aber es ist halt auch möglich, dass

wenn man das anders gemacht hätte, hätte

diese ganze Geschichte auch in der Minute durchlaufen können,

ja, und, ja,

es gibt dann auch andere Geschichten, die jetzt auf solchen

Clustern laufen, äh, zum Beispiel

rein in Memory-Geschichten, so was wie Impala,

äh, einer

von, ähm,

äh, den, den PhD,

äh, Studenten von Michael Stonewrecker,

die, äh, damals Postgres mitgeschrieben

haben, äh, ist da irgendwie CTO von

der Firma, die da, ich hab jetzt auch wieder vergessen, welche das ist,

äh, das

macht das halt in Memory, das ist in C geschrieben,

das ist alles schneller, das, äh,

das ist viel angenehmer, wenn man damit arbeitet, aber es ist

auch so ein bisschen komisch, und es ist halt auch nicht so

richtig,

äh, es ist halt nur ein bisschen instabil, ähm,

äh, es gibt,

äh, diverse andere

Geschichten, jetzt gibt's, ach, das war noch ein eigenes Thema,

eigentlich Spark, Spice Spark,

ähm,

äh, was ganz interessant ist, ist,

äh, ja, was man vielleicht,

lass mich überlegen,

also, was, was sehr interessant ist, ist, dass wir

heute, äh, etwas sehen,

äh,

was wir früher eigentlich auch schon gedacht hätten,

dass wir das im relationalen Bereich bekommen, nämlich, äh,

oder MySQL hat damit mal angefangen, so, ähm,

die hatten irgendwie so ein, eines der

coolen Features bei MySQL am Anfang war, dass

die, die Storage Engines pluggable

waren, das heißt, du konntest deine eigene Storage Engine

da reinbauen, hat auch kaum Änder gemacht,

es gab eigentlich nur zwei Relevante,

wie, wie, wie die Daten

tatsächlich auf der Platte liegen, äh, okay, letztlich,

äh, und das ist halt, äh,

es gab MyISAM, äh,

es gab auch eine CSV-Engine für MySQL, da hast du einfach

CSV ausgebaut, aber MyISAM

war so populär, äh, MySQL

hatte aber Probleme, hatte das Problem, dass du, wenn du

geschrieben hast, wurde immer die komplette Table gelockt,

das heißt, also, da lieber nur lesen, nichts reinschreiben, so

reinschreiben, eher doof, ähm,

hat trotzdem, irgendwie haben das

viele lang verwendete Transaktionen, so, das geht alles nicht,

Asset war nicht so richtig bei MySQL am Anfang, und dann,

äh, dann hatten sie eine Storage-Engine, die das dann einfach schon konnte,

die auch so wirklich Multiversion

Concurrency-Control halt richtig konnte, und das war

InnoDB, und, äh,

ja, aber, äh, eigentlich

so, nachdem InnoDB sich durchgesetzt hatte,

oder irgendwie gut genug war,

dann, äh, hat sich dieser

Plugable-Storage-Engine-Geschichte von,

von, äh, MySQL hat sich dann auch wieder

erledigt,

aber, äh, äh, Postgres bekommt

jetzt, glaube ich, mit der Version 12, also, naja, das ist noch nicht sicher,

aber es sieht ein bisschen danach aus, als ob sie die Plugable-Storage-Engines

wieder zurückbekommen,

was interessant, äh,

da ist es dann zum ersten Mal, aber

das Konzept nochmal, äh, irgendwie

doch nochmal angefasst wird, äh,

und interessant ist auch in diesem ganzen, äh,

Analytics-Big-Data-Bereich,

dass wir da auch sowas sehen, wir sehen

halt, äh, es gibt nicht mehr so ein Datenbank-System,

wo halt die Repre, also

wie die Daten gespeichert werden, tatsächlich

an die anderen Teile,

also im Grunde besteht ja so ein Datenbank-System

aus vielen unterschiedlichen Geschichten, es besteht halt aus

so ein, äh, äh, ähm,

System, das irgendwie einfach nur

die Daten managt, äh, irgendwie

und, und Zugriffsrechte verwaltet

und irgendwie, und dann gibt's halt so Dinge,

wie speichert man das auf der Platte, es gibt Indizes,

es gibt so viele unterschiedliche Teile

und, äh,

ja, wir sehen jetzt so ein bisschen, dass das halt, äh,

auch alles wieder so ein bisschen

Plugable wird, gerade auch in diesem Big-Data-Bereich, also,

ah, auch wichtig, äh,

wenn man diese Analyse-Geschichten macht, hat man

im Grunde, äh,

äh, ist die Art, wie, also,

die Daten in relationalen Datenbanken

gespeichert werden, ist, äh,

äh, ist teilenweise, ja, weil,

äh, man oft, weil, weil die

Art von Queries, die man da macht,

oft nur wenige Zeilen betreffen.

Ein paar tausend oder so, aber es sind immer noch sehr wenige.

Daher macht es Sinn, äh,

irgendwie, zeilenweise zu arbeiten,

äh, sozusagen.

Ähm, aber für diese Analyse-Geschichten,

dieses ganze Data-Warehousing-Zeugs, äh, ist das

überhaupt nicht sinnvoll. Dieses

Muster, dass man halt, ähm,

eher Millionen von Zeilen

anguckt, aber nur wenige Spalten, weil man sich nur

für einen bestimmten Aspekt interessiert. Man interessiert sich

oft eben nur für

Umsatz oder Preis oder sowas, oder,

äh, aber man interessiert sich gar nicht

für den Namen des Autors oder so, aber

daher möchte man eigentlich nicht irgendwie

alle Zeilen immer komplett angucken,

weil dann guckt man sich ganz viel Zeugs an,

so die, das, der, das, der

Flaschenhals ist oft, wie,

äh, ist oft die, die

Bandbreite zwischen

Platte und Hauptspeicher, so, man muss das halt

dann irgendwie durch den Prozessor ziehen

und je weniger Daten man dadurch ziehen muss, umso besser.

Und bei einem Zeilen

orientierten Format muss ich, wenn ich die Datei lese

und die Datei, äh, die Datensätze halt zeilenweise

drinstehen, muss ich halt da sequenziell durch die Zeilen

durchgehen. Da hilft's, geht nicht

anders. Und das ist halt total ineffizient,

weil ich, wenn ich halt nur einen kleinen Teil von

diesen Zeilen, nämlich nur eine Spalte, irgendwie überhaupt

lesen möchte. Das heißt,

wenn ich, äh,

so Analyse-Querys auf, äh,

Datenbanken mache, die zeilenbasiert

ihre Daten speichern, dann ist

das super ineffizient und ich hab halt so einen Verlust

von circa, so, man sagt so immer so 5,

Faktor 50 ungefähr, sind die halt

einfach aufgrund dieser Architekturgeschichte

langsamer, und zwar

unoptimierbar langsamer

als, äh, äh, sogenannte Column-Stores,

die halt Daten, äh,

spaltenweise speichern, ne.

Und, ähm,

die, äh, die ersten, äh,

Dateisystem-Formate oder Formate,

in denen die Daten zum Beispiel in Hadoop gespeichert wurden,

äh, Abo ist, glaub ich, so das erste, ich weiß nicht genau,

äh, sind auch alle zeilenbasiert,

weil das war halt so, ne, man hat halt irgendwie

zeilenbasiert Sachen gespeichert, aber

das ist halt eben total ineffizient,

wenn man halt nur bestimmte Spalten

von Datensätzen haben möchte, und dann gibt's halt

neuere File-Formate wie zum Beispiel, äh,

oder Serialisierungsformate,

Parquet, äh, äh,

Dateien zum Beispiel, das ist halt das, was heute

eigentlich immer so verwendet wird, das ist halt dann

spaltenbasiert,

äh, und dann, dann liest man eben

nur die Dateien, oder du, du,

die Spalten, das ist halt in einer Datei

nur eine Spalte, sozusagen,

man liest halt nur die Dateien, die man halt braucht,

ähm,

und das ist komprimierbar, es ist chunk,

sodass ich es auf mehrere Rechner verteilen kann, und so,

und hat halt all diese hübschen Eigenschaften,

ähm,

und ich hab jetzt

diese, diese Parquet-Files, aber das, also das

Format der, der Daten, äh, auf der Platte,

das Serialisierungsformat ist nicht mehr gebunden an die Datenbank,

sondern, äh, als

Layer da drüber, mit dem ich jetzt Abfragen mache,

hab ich jetzt sowas wie Hive, das macht dann MapReduce

Drops draus irgendwie, äh,

ich hab, äh, aber auch sowas

wie Impala, ich hab vielleicht andere

Geschichten, ich hab Spark, und, äh,

das hast du eben noch vergessen, übrigens, äh,

Spark, genau, gut, Spark hat auch irgendwie mit,

ist was mit anderen, was anderen gestartet, die, die,

äh,

äh, hat auch ein eigenes DataFrame-Format,

äh, was, was jetzt nicht Parquet war,

aber, also, worauf es hinausläuft,

ist, äh, im Grunde,

dass ich jetzt, äh, so ein Format

habe wie Parquet, ähm,

in dem die Daten auf der Platte liegen,

und jetzt hab ich halt unterschiedliche

Engines, die jetzt irgendwie, mit denen ich jetzt

Queries verarbeite drauf, ja,

so quasi eine Trennung zwischen,

ähm, dem System, das jetzt

meine Queries irgendwie beantwortet, und dem

Speicherformat, also quasi sowas ähnliches wie

ein Plugable Storage Engine, so, nur

dass halt, der Storage-Format ist halt für alle

unterschiedlichen Engines irgendwie gleich, nämlich Parquet,

aber das, was halt die, äh, Dinge

darauf machen, ist halt unterschiedlich.

Äh, und das ist eine ganz interessante Entwicklung, finde ich, also

das ist halt, äh, das ist schon faszinierend,

und, ähm,

äh,

ja, die, äh,

äh, ja, Column Stores

sind halt sozusagen, das, äh, sind für so Data Warehousing

eigentlich das, das Coole, es gibt all, es sind,

es ist, es hieß da,

Paper ist halt auch eine, äh,

Firma entstanden, Vertica, glaube ich,

äh, äh, die machen halt,

wenn man, wenn man irgendwie ein großes Data Warehouse haben möchte,

dann ist es wahrscheinlich irgendwie so das Beste, wenn man irgendwie

zu so einer Firma geht und das macht,

keine Ahnung, oder es gibt es auch wahrscheinlich

auch noch andere, die sowas ähnliches machen, ne,

aber was halt nicht gut wäre, ist halt, wenn man,

äh, wenn man, wenn man mit so einem Problem zu

Oracle geht, ne, weil Oracle ist halt nicht Column,

äh, ist halt nicht Column-Oriented, sondern die sind halt

zahlenbasiert, egal, was sie dazu sagen, sie versuchen das

mit ihrem Marketing immer zu verschleiern, aber es ist halt,

ja, genau wie MSSQL zwar war und

die ganzen klassischen relationalen

Datenbanken, die sind alle zahlenbasiert und da

gibt es auch nichts, was man tun könnte.

Ja, es sei denn, man tauscht

die Storage-Editen aus, und so, und das ist halt, äh,

bei Postgres wird das nochmal interessant.

So Postgres, da hat man das Problem halt,

wenn man ein Data Warehouse auf Postgres aufbaut, dann

ist man immer dann an die zahlenweise,

äh, äh, Verarbeitung

gebunden, kann halt auch nichts machen.

Ähm. Wenn man das zunächst dann halt mit Parquet

machen könnte, dann... Ja, wenn man irgendwie

Parquet und Postgres irgendwie verheiraten könnte, das

wäre natürlich schon ziemlich cool dann irgendwie.

Ja, äh,

genau. Und das

sind halt so die, ähm,

ja, das sind halt so diese Geschichten beim,

beim, beim Data Warehousing,

äh, genau, so Hadoop, man nennt das auch so,

nicht Data Warehouse, sondern weil man auch alles mögliche andere

darin speichern kann, Data Lake, äh, weiß ich gar nicht,

ob man da so ins Detail gehen muss, aber man hat auch noch Bilder und

sonst wie andere, man kann halt alle möglichen

Arten von unterschiedlichen Daten...

Ja, man kann auch so ein bisschen umkippen,

wenn man das dann Data Swamp...

Äh, ja, ähm,

und, äh, äh,

ja, also,

ich bin nicht, ich bin nicht, ehrlich gesagt, nicht so ein

Riesenfan von Hadoop, muss ich sagen.

So, aber, äh,

auch, ich hab da auch schon, äh,

ein bisschen so schmerzhafte Erfahrungen, äh,

mit, mitgemacht, äh,

weil so Daten rein und rauskriegen ist

irgendwann so ein bisschen hässlich und, ähm,

ja, das ist auch noch alles nicht so weit, also bei, bei so

klassischen Datenbanken ist halt, da merkt man,

so wenn man Postgres gerade verwendet zum Beispiel, merkt man halt so,

das ist halt schon Jahrzehnte, äh,

äh, Erfahrungen

drin und viele der Use Cases, die man

so hat, also wenn man da auf

blöde Probleme stößt, dann ist man wahrscheinlich selber

schuld, also das ist halt,

das ist halt sehr selten, würde ich

jetzt mal so...

Ja, dass man auf etwas stößt

und man hat wirklich ein Problem mit der

Datenbank, sondern man hat ein Problem mit, man hat die

Dokumentation nicht genau genug gelesen oder

man weiß, man hat irgendwie ein Verständnisproblem oder so

und das sind ja alles Sachen, die sich gleich fixen

lassen, da muss man, also es wäre halt

vielleicht schon mal...

Ja, äh, wenn man tatsächlich ein Problem

mit der Datenbank hat, ist natürlich, äh, wäre

natürlich schlecht, weil da kann man nichts machen, ne, außer

Datenbank wechseln oder irgendwie,

äh, selber neu schreiben oder sowas,

nicht gut, ja, äh, und, ähm,

bei Hadoop habe ich so das Gefühl,

es kann auch durchaus sein, dass ich einfach

so blöd weiß, es zu bedienen, aber ich habe so das Gefühl,

viele Dinge, die man da macht, sind nicht

dadurch begrenzt, dass man irgendwie nicht genug weiß oder

nicht genug, das nicht richtig verwendet

oder es falsch rum hält irgendwie, sondern,

äh, bestimmte Sachen

gehen einfach noch nicht oder gehen nicht richtig oder

man hat Use Cases und dann schleppt man so fest so,

ja, hat niemand drüber nachgedacht,

äh, ist nicht so richtig abgebildet, hm,

blöd, und, ähm,

das wird wahrscheinlich alles irgendwie viel besser,

aber momentan ist es noch nicht so,

ne, es ist noch ein bisschen scharf, fühlt sich alles ein wenig scharfkantig an.

Man kann sich überschneiden und wehtun

und aua. Ja, und außerdem, dass es halt alles

auf dieser Java-Geschichte aufsetzt, ist auch sowas,

muss ich auch sagen. Ah,

sind wir wieder bei dem Ding, was wir eigentlich als Running-Gag nehmen wollten,

haben wir es doch dazu verlassen. Ja, Java,

mal wieder, das ist, äh...

Ja, so, nach zweieinhalb Stunden sind wir doch wieder drauf gekommen,

ja. Ja, ähm, und, aber,

aber da ist dann möglicherweise der Ausweg, irgendwie sowas wie

PySpark zu verwenden, das mag auch nochmal,

eigentlich müssen wir da nochmal ein eigenes Thema zu machen,

äh, auch, aber sehr schön, das Ding ist so,

dass man halt, äh, quasi,

äh, Sachen automatisch

verteilen kann, man hat sie lokal,

man kann das mit anfangen, dass man es auf einer Maschine hat

und dann, äh, äh, führt man Sachen

auf einen Cluster aus und das ist wirklich

mehr oder weniger seamless, äh,

äh, das Einzige,

ähm, man hat

sogar einen vollständigen Python-Interpreter, ne, das ist

irgendwie nicht so eine verkrüppelte Version, man kann halt

tatsächlich irgendwie Saiten, äh,

Sachen damit machen, das heißt, man kriegt Sachen auch wirklich,

wirklich schnell, ähm,

ja, im Gegensatz

von, zu Java, Java geht vielleicht auch, ich weiß

es nicht genau, aber ich glaube, es ist ziemlich schwer, äh, Sachen

wirklich optimiert hinzukriegen,

äh, während in Python ist es halt

relativ leicht, äh, irgendwie

mit, mit Saiten halt ein Dialekt von

Python zu schreiben, wo man dann Typ-Annotationen dazu schreibt,

äh, wo dann, die dann halt

zu C kompiliert werden, dann wird das als C-Modul, dann wird's

wieder reimportiert und, äh, das kann man

halt auch auf den Cluster irgendwie

ausrollen, irgendwie über PySpark

und dass man jetzt irgendwie C-Code

irgendwie in Java reinbastelt

und das dann halt über Hadoop, über die MapReduce-Shows

verteilt, weiß ich nicht, kann auch sein, dass das geht, keine Ahnung,

aber das klingt irgendwie nicht so leicht.

Ja, wie auch immer, also,

ähm, Spark ist auf jeden Fall auch

noch eine super interessante Geschichte, vor allen Dingen, wenn es jetzt

darum geht, wenn man jetzt sowas hat wie so ein Data Lake

und so, wie kommen da die Informationen rein,

man möchte eigentlich nicht, ähm,

äh, da so ETL-Jobs

machen, das funktioniert alles nicht mehr, man möchte ja auch echt

Zeit-Dashboards haben, irgendwie.

Äh, und

dann muss man halt auf so eine, oder

sollte man, dann wechselt man halt irgendwann

auf so eine Streaming-Architektur, wo halt, äh,

Dinge auf der Webseite, also auch gerade

wenn man jetzt sowas hat wie, also

auch Amazon wird, selbst wenn man die Bestellungen nimmt

oder so, das ist alles noch nicht Big Data, aber

wenn jetzt zum Beispiel Amazon, und das tun sie

bestimmt, äh, irgendwie jeden Klick den User

macht auf der Webseite, auch, äh,

irgendwo, irgendwo eine, äh,

Fakten-Tabelle, äh,

in ihr Data Warehouse, Data Lake,

Ding reinspeichern möchte,

ja, dann

wird das Big, weil das ist halt schon

viel, dann ist so, so Verhältnis von Bestellungen

zu, Leute machen irgendwie Web-Requests

oder klicken auf der Seite rum, ist halt wahrscheinlich nochmal so

100, Faktor 100 oder mehr.

Und

ja, dann wird es tatsächlich sehr, sehr groß

und man möchte das aber trotzdem

alles in Echtzeit haben. Das heißt,

man macht es nicht so, dass man

diese Geschichten wieder in die

OTP-Datenbank reinschreibt

und dann extrahiert und batchmäßig

jeden Tag ein Analysesystem schreibt,

sondern dann generiert man

halt so Events,

die dann halt über irgendeinen

Streaming

Zeugs halt

Service laufen,

der das dann halt

an unterschiedliche Consumer

irgendwie ausliefert. Und das sind meistens Kafka,

AWS hat noch eine eigene Lösung,

normalerweise auch wieder den Namen vergessen.

Meint aber nicht die Lambda-Service, ist das was anderes?

Nee, nee, das ist was anderes.

Nee, das ist eine eigene, ja, aber

sagen wir mal, Kafka als Beispiel ist auch ein

Apache-Projekt, das das halt sehr schön macht.

Und dann serialisiert man halt

irgendwie die Daten, die man im Event hat,

als Protokoll-Buffers oder sowas.

Und

dann gehen die Dinger halt

auch da wiederum Serialisierungsformate sehr, also

es gibt halt sehr unterschiedliche Protokoll-Buffers

sind super, wenn man Daten übertragen möchte oder auch dieses

Thrift von Facebook.

Super scheiße, wenn man das halt auf die Platte

schreibt. Also es wäre halt dann auch wieder

zeilenbasiert, kann man hinterher nicht mehr gut analysieren. Also

man kann halt nicht einfach irgendwie

die Events, die man generiert als

Protokoll-Buffers irgendwie

in Kafka kippen und dann das

irgendwo auf eine Platte schreiben lassen.

Das reicht halt nicht, sondern man muss

es halt dann doch auch irgendwie wieder

irgendwie so Zwischendinge kippen.

Aber man kann halt auch, man kann halt etwas haben,

was halt teilweise aus

diesen Parquet-Files liest.

Und dann halt die aktuellsten Daten liest es halt aus

einem Log der

der Protokoll-Buffer-Events.

Weil das muss ja dann vielleicht nur für die letzte

halbe Stunde sein oder so. Kommt halt mal drauf an.

Ja, und dann kann man

halt tatsächlich Echtzeit-Daten sehen.

Dann könnte man halt ein Dashboard machen, wo man halt

in Echtzeit sieht, wie sich

die Zugriffsmuster ändern, wenn man jetzt zum Beispiel

für einen bestimmten Teil der User irgendwie die Webseite

ändert oder so. Und das ist natürlich

schon sehr nett. Und wenn man halt irgendwie Preise

erhöht, dann sieht man halt irgendwie in Echtzeit, wie

die Conversion runtergeht.

Ja, und dann kann man halt so

als Manager

vor diesem Dashboard sitzen

und den Köpfen drehen.

Die kommen auch vor die Wand fahren.

Ja, und dann irgendwie Profit

maximieren.

Das ist schon

sehr nett. Ist aber auch halt sehr aufwendig.

Das macht alles nochmal

viel komplizierter.

Ja, und

diese Serialisierungsformat-Geschichte

ist halt sehr wichtig.

Etwas, was mir bei dem

Hadoop-Erfahrung

dann geholfen hat, war

ein Projekt namens

Apache Arrow,

wo es darum geht,

das ist von dem

ursprünglichen Autor von

Pandas, also dieser DataFrame

Library für Python,

und der hat das gestartet,

weil der da halt ein...

Und das ist auch tatsächlich...

Während ich mich halt mit Hadoop gestellt habe,

mich hat es an den gleichen Stellen gejuckt,

sozusagen.

Das hat er zuerst gemacht.

Also ihn hat das wohl auch irgendwie

genervt. Der hat bei Cloudera gearbeitet.

Das ist halt auch so eine von diesen

Firmen, die halt so in diesem

Big Data, Hadoop-Bereich viel unterwegs sind.

Auch da, glaube ich, einer von den

Chefs oder Gründern ist halt einer von den...

Auch ein PhD-Student von

Michael Stonebraker.

Das sind also irgendwie immer die

leitenden Leute.

Und...

Genau. Da ging es darum,

sozusagen ein

Interface zu haben, das genauso ist

wie Pandas, also

DataFrame-API quasi zu haben,

sodass man halt Dinge...

Man hat so das Gefühl, man hat ein DataFrame-Objekt,

macht da irgendwelche Sachen drauf, so als wäre es ein Pandas-DataFrame.

Aber in Wirklichkeit passieren

im Hintergrund Sachen

auf deinem Cluster. Das war eine Bibliothek,

nannte sich Ibis, und das ist halt genauso auch

mein Problem damit, dass halt

ich mache ja eigentlich eher so Machine-Learning

Dinge und

benutze Pandas

eigentlich so zum Daten

aufräumen, Daten transformieren,

bevor ich das dann halt in irgendwie

Machine-Learning-Aggregate und so und Modelle reinfüttere,

die dann aber

selber wieder nur Arrays, NumPy-Arrays

normalerweise nehmen und keine DataFrames.

Aber DataFrames ist halt so ein

Zwischenschritt und man kann halt sehr leicht aus einem DataFrame

irgendwie ein Array machen, indem man einfach sagt

DataFrame.Values, dann hat man die...

Das Array.

Und ich hatte halt immer das Problem,

wenn ich jetzt da mit so Systemen wie

Hive oder Impala draufgegangen bin, dann kriege ich halt

irgendwie eher so ein CSV

oder so ein Result-Set und dann kriege ich

das nicht schnell da raus.

Das ist halt alles ultra langsam.

Ich brauche aber für meine Modelle

doch durchaus große Daten oft.

Das geht alles nicht.

Dann wäre das natürlich viel besser gewesen,

wenn ich einfach nur...

Das, was diese Systeme machen,

ist, man schreibt SQL-Statements und die machen

dann halt irgendwie automatisch...

Machen die halt irgendwelche Aktionen auf dem Cluster.

Wenn das jetzt so gewesen wäre, dass ich das

einfach nur in DataFrame-Syntax, was ich mit den Daten

machen wollte, hätte hinschreiben können,

dann wäre mir ja schon viel geholfen gewesen.

Und genau das hat halt IBIS,

diese Bibliothek, die dann Wes McKenney bei

Cloudera gebaut hat, gemacht.

Man hatte ein Ding, das war wie ein

Pandas-DataFrame, wo man da halt irgendwie

GroupBy gesagt hat und dann hat das

halt nicht

das im Hauptspeicher gemacht wie Pandas, sondern das hat

dann halt SQL-Statements erzeugt,

automatisch, die man aber nicht gesehen hat, und die dann

auf den

Cluster irgendwie losgelassen

und dann

magisch irgendwie mit Ergebnissen

irgendwas gemacht.

Ja, aber das hat halt auch nicht gereicht, weil

auch da wieder das Problem war, wie kriegt man die Daten wieder

raus, wenn man jetzt, man kann eben sowas

nicht sagen, wie wenn man es jetzt richtig transformiert

hat, also da war das schon eine Hilfe, aber

jetzt hätte man gerne die Werte, um sie tatsächlich in

Machine Learning-Algorithmus reinzupumpen,

damit er möchte irgendwie ein Modell

drauf trainieren. Und man kann eben jetzt bei diesem

DataFrame eben nicht sagen,

df.values, das geht halt nicht, weil

die Daten sind halt im Cluster, weil

sie da irgendwie rauskriegen und man kriegt die nicht raus,

das geht nicht. Also der Weg von

ja,

ja, und das war halt dann auch

irgendwie ein Problem, wo dann das IBIS-Projekt

so ein bisschen dann vorbei war

und, weißt du, Kenny hat dann auch

von Cloudera irgendwie weg und hat

dann Apache Arrow gestartet und Apache Arrow

macht halt genau

da weiter und das hat mir dann auch wieder

weitergeholfen, weil

okay, das geht

nicht anders, man muss tatsächlich auf die rohen

Parquet-Files im Cluster irgendwie zugreifen

und

wenn man jetzt irgendwie da drauf was machen möchte,

man braucht irgendwie ein Array-mäßiges

Interface auf diese

Files. Wenn man das hat, dann ist man

eigentlich im Grunde, dann funktioniert alles.

Und das macht Arrow. Arrow

ist halt sozusagen ein In-Memory

Datenstruktur, Array-Datenstruktur,

die halt von

unterschiedlichen, das ist auch das Ziel dabei, ist auch eine

Kollaboration mit irgendwie einem der

wichtigeren Leute, die hinter R,

oder R-Studio

zusammen,

die haben das beide zusammen gemacht, dieses Projekt

und

genau, die Idee

ist sozusagen, du hast halt eine

Abstraktionsschicht, die halt

irgendwie so ein Arrays-Thor im Hauptspeicher hält,

das macht Apache Arrow,

deswegen ist ein C++ geschrieben, aber du kannst

halt von Python aus zugreifen, von R drauf

zugreifen, von Java aus

und du musst es halt nur einmal

im Hauptspeicher halten und du hast

es dann halt in dem Format, in dem du es brauchst, um es

halt in Machine Learning-Modelle reinzupumpen.

Ja, was du halt

diese ganze Loop-Welt,

kannst du dein Machine Learning-Algorithmus ja nicht als

MapReduce, das geht halt nicht, schreiben, weil

wenn du ein neuronales Netz hast, das hat Verbindungen

überall hin, da kannst du es halt nicht

klar horizontal auftreiben in

Mapper und Reducer, das funktioniert einfach nicht, das ist halt Quatsch.

Viele, oder auch

viele Machine Learning-Algorithmen lassen sich nicht

einfach so verteilen. Oder

ja, sie brauchen halt irgendwie

ihre Daten in einem bestimmten Format und das ist halt so ein Array-Format,

weil das ist alles lineare Algebra,

und lineare Algebra funktioniert

mit Vektoren, Matrizen, oder

halt, man nennt die Dinger allgemein

Arrays halt, also

beliebig dimensionale Arrays.

Ja,

und das

geht halt so einfach eigentlich irgendwie nicht.

Und

ja, mit Apache Arrow halt

schon. Und außerdem macht Apache

Arrow dann halt so ein paar Sachen wieder, zieht es wieder gerade,

die halt bei NumPy so ein bisschen kaputt sind.

Unter anderem,

was halt total blöd ist, ist halt, aber das habe ich

auch schon mal erwähnt, dass es halt kein

Kanal für Integer gibt und so,

also mit Missing Values ist halt schwer

bei NumPy Arrays.

Und

ja, es gibt ja noch diverse andere Probleme.

Und ja,

das klingt eigentlich super interessant und ich glaube,

das ist halt auch so ein bisschen der Weg in die Zukunft, weil

dieser ganze

Business Intelligence-Bereich, also ich habe oft irgendwie mit

so Business Intelligence-Abteilungen

auch zu tun gehabt, in denen

dann so, an die wurde dann immer so

Datasites und Machine Learning irgendwie so angedockt. Ja, also das

ist halt, Business Intelligence ist etwas, was halt

große Firmen halt schon lange haben.

Aber die machen

halt sowas wie, ja, also einmal

die Leute, die dann Dinge da machen, sind da so

Analysten.

Oft super schlaue Leute.

Aber

ich überlege gerade, wie man

da hinfühlen kann.

Sagen wir mal so, was die halt tun können.

Nehmen wir an, du bist Walmart und du

interessierst dich jetzt dafür, keine Ahnung,

weißt jetzt, es kommt eine Flut,

die irgendwie deine Stadt

überschwemmen wird und dann

was werden die Leute

dann kaufen oder so.

Für was musst du

irgendwie vorsorgen? Und

bei einem klassischen BI-Ansatz

wäre halt, du guckst dir halt die Icons da an, wo

Städte überflutet worden sind, da gibt es nicht so viele.

Substrahierst

da halt irgendwie so, guckst dir das halt

eine Woche später an

und überlegst dir dann halt irgendwas.

Und das,

und das machst du dann. Und dann machst du

irgendwie gewisse Voraussagen und sagst so,

das könnte ungefähr so und so aussehen.

Das ist halt das, was passiert. Und das ist halt auch das, was

heute noch in BI-Abteilungen hauptsächlich passiert,

dass die Leute halt irgendwie so historische Daten angucken und dann so

überlegen so.

Und ich denke,

das wird alles

so in Zukunft eher Richtung Data Science

laufen.

Damit meine ich, dass

solche Antworten kommen halt dann eher von Systemen,

die Vorhersagen machen.

Und

die werden das deutlich besser können.

Und die werden das halt auch,

also ein Großteil dieser Analysegeschichte

wird man halt automatisieren können.

Und das Problem momentan ist halt so ein bisschen,

dass die Tools,

die man hat, nicht zueinander passen.

Zu dem, die

so Hadoop-Welt

passt eigentlich eher so zu dem klassischen

BI-Ansatz.

Und was auch bei diesem

BI-Ansatz ein Problem ist, ist halt, dass man das nicht wirklich

wieder zurück in Produkte übersetzen kann.

Also das sind auch,

Leute nicht, nicht unbedingt Leute, die halt

dann Produkte bauen können, die halt entwickeln können oder

Services bauen können. Auch mit

diesem ganzen, wie baut man Dinge,

wie macht man Produktentwicklung?

Nicht so, das ist nicht so was, was natürlich

für die ist, sondern das ist halt eher so etwas, was sie dann

halt auch machen müssen vielleicht,

aber wo sie sich halt auch nicht so gut bei fühlen.

Das aber halt

absolut erforderlich ist, weil viele von den Sachen sollen

ja dann automatisch auch Dinge tatsächlich tun.

Ja, so viele Ergebnisse, die dann

halt automatisch generiert werden, sollen halt nicht dazu führen,

dass es halt irgendwie eine nette Präsentation irgendwie

an einen Management-Layer gibt oder so.

Sondern du willst halt, dass dann

da tatsächlich

Entscheidungen auch rausfallen, die irgendwas auf deiner

Webseite verändern oder die irgendwelche Dinge tun.

Und dann musst

du halt Software entwickeln eigentlich. Dann bist du halt

so Teil der Produktentwicklung.

Und ja, das

geht halt auch nicht so richtig gut. Und was

da ein bisschen fehlt, ist halt so ein

ist halt etwas, was halt

Daten in Array-Form im Hauptspeicher hält.

Und das

macht Apache Arrow. Und deswegen finde ich das Projekt so

superinteressant. Es gibt da noch

SciDB oder sowas.

Ob ich die auch sowas ähnliches machen?

Aber da geht's irgendwie hin.

Und ja, es geht Richtung

Streaming. Spark macht ja auch ganz viel mit Streaming.

Wobei mich natürlich besonders

interessiert PySpark, weil Python und so.

Ja.

Haben wir da noch

Irgendwann. Ich wollte schon fragen. Wir haben jetzt

ganz lange schon, also fast drei

Stunden schon über die ganzen Daten gesagt.

Wir merken, der Jochen ist ja sehr tief drin.

Das ist auch ein super breites Thema.

Haben wir tatsächlich die

meisten Sachen schon jetzt durch? Oder hast du noch was,

was du unbedingt da zu dem Thema gespeichert hast?

Genau, genau, genau.

Ach so, ah, genau. Wenn wir jetzt nochmal zurückkommen zu dem

E-Commerce-Ding. Das war jetzt so eine Exkurs Richtung

Big Data. Also wenn wir ganz froh sind.

Das neue Thema. Immer so

Mars oder so. Ja, also das hatten wir

auch vorher schon mal kurz angekündigt.

Relationale Datenbanken oder so. Diese Art

Daten umzugehen ist halt besonders gut.

Und dann, wenn es Daten über

Sachen sind, die nicht Daten sind. Also

physikalische Sachen, die sich nicht so schnell ändern,

bei denen es Sinn macht,

ein festes Schema zu definieren, das dann halt auch über längere

Zeit mehr oder weniger gleich bleiben kann. Man kann natürlich

Sachen ändern, aber Dinge grundsätzlich

ändern, ist dann schwierig.

Und

aber

das ist jetzt tatsächlich Zukunft.

Es ist auch nicht so richtig sinnvoll, diese Amazon

Geschichte, also heute Amazon zu bauen,

ist viel, viel einfacher natürlich. Also ich meine,

das hört sich so an, als wäre es total einfach, Amazon zu

werden. Das ist es

nicht.

Es war auch zu der Zeit, als Amazon

Amazon geworden ist, war es viel schwieriger, weil da

gab es halt keine Tools. So was wie Postgres

gab es, aber es war

nicht in dem

Zustand, wie heute.

Es wäre nicht nutzbar gewesen.

Also es gab damals, als

ich weiß nicht wann die angefangen haben, Anfang der 90er oder

also Amazon hat sehr, sehr früh angefangen,

Mitte der 90er, ich weiß nicht genau.

Da gab es halt nichts. Die mussten

alle selber bauen. Das war, ist natürlich

nochmal ein ganz anderes Problem.

Während heute man wahrscheinlich mit Postgres,

Django, Redis, irgendwie

und ein paar Rechnern wahrscheinlich einen Markt wie

Deutschland mit so einer ähnlichen Seite

wie Amazon versorgen könnte.

Das

ging halt damals nicht und das

macht es heute einem natürlich viel leichter.

Aber heute ist halt das Problem, es gibt Amazon schon.

Man muss mit Amazon konkurrieren und

leider hat man da keine Chance.

Deswegen funktioniert das auch nicht.

Aber was natürlich interessant möglicherweise ist,

ist sich zu überlegen,

okay, was kann Amazon denn mit dem, was sie tun,

nicht machen und wo entwickelt sich das halt in Zukunft hin?

Ich habe

das auch schon wieder zehn Jahre her, unglaublich,

oder noch mehr als zehn Jahre sogar.

Mein Vortrag gehört

von David Weinberger, der ist

ein Philosoph,

auf Internetgeschichten

beschäftigt in Harvard.

Kann man mal gucken, packe ich auch noch in die Shownotes.

Der Vortrag heißt Everything is Miscellaneous.

Da gibt es auch ein Buch zu.

Der Talk bei Google

ist halt eine Vorstellung

von dem Buchinhalt, mehr oder weniger,

wo er darüber spricht,

dass wir

jetzt so

in der Zeit von Internet

und Computern

sich ja Dinge komplett verschieben

im Grunde, oder wir das aber noch

gar nicht so richtig antizipiert haben.

Sein Beispiel

ist halt auch E-Commerce und halt auch

so Faceted Navigation.

Er sagt halt, naja, also in so einem klassischen

Laden, wenn du da reingehst,

muss man sich überlegen, wo man

welche Dinge hinpackt.

Da physikalische Objekte

nur an einem Ort gleichzeitig sein können,

oder überhaupt irgendwo sein müssen,

muss man halt irgendwie das so strukturieren,

dass das der Fall ist, und dann muss man sich überlegen,

okay, wie macht das für die meisten Leute Sinn,

wenn sie reinkommen, ist immer der Salat irgendwie vorne rechts,

oder keine Ahnung.

Und das muss man eigentlich, wenn man jetzt

Daten über Daten hat,

gar nicht mehr so machen.

Das Slicen und Dicen, wie man wollte.

Also man könnte halt sagen, okay, ich bin jemand, der nur

schwarze T-Shirts anzieht, also

alles andere interessiert mich nicht.

Ich brauche jetzt eine Navigation innerhalb

dieser schwarzen T-Shirts, aber alle anderen Sachen kann ich

schon mal so irgendwie wegschneiden.

Das würde für alle anderen vielleicht keinen Sinn machen,

oder für andere Leute, jeder hat vielleicht andere Arten,

was er, aber ich kann

jetzt eine Seite bauen, die

auf die Bedürfnisse von jedem im Grunde zugeschnitten ist,

oder sich leicht so an...

Die eigene Filterbubble immer erzeugt für den jeweiligen...

Elektronisch habe ich das Problem nicht, oder

ich kann für jeden eine eigene

Art von Laden

erzeugen,

oder eine eigene Art von Navigation bauen.

Nur wenn ich denjenigen kenne, natürlich.

Natürlich, oder

wenn er es mir halt irgendwie sagt, indem ich ein Interface habe,

wo man das halt irgendwie einstellen könnte.

Aber das wird kaum

gemacht. Es gibt halt meistens doch wieder einen

Kategorienbaum, der halt

irgendwie... Kategorienbaum

auf einer Seite ist ja im Grunde irgendwie sowas wie

ein Weg durch

einen Laden, der halt vorgegeben ist.

Warum muss das denn so sein?

Das muss ja eigentlich... Also wir adaptieren da

eine Sichtweise aus der

physischen Welt, die

vielleicht insofern hilfreich ist, weil

die Leute kennen das so.

Insofern macht das auch durchaus Sinn, das so zu tun,

aber es müsste eigentlich nicht so sein. Und vielleicht

wäre es, wenn man das anders machen würde, halt viel effizienter.

Genau.

Das ist das Raum für ein Startup da übrigens gerade.

Ja, das Problem ist halt nur,

also ich fand das ja schon vor über 10 Jahren

interessant, aber

in der Richtung hat sich noch nicht so wirklich wahnsinnig viel

getan. Insofern bin ich mir nicht sicher,

ob das eine gute... Also damals war es auch, wenn wir zurückblicken,

kann man jetzt sagen, damals ein Startup in die Richtung

zu starten, wäre keine gute Idee gewesen.

Vielleicht wäre es jetzt eine gute Idee.

Vielleicht ist es aber erst in 5 Jahren eine gute Idee.

Keine Ahnung.

Wenn der Zeitpunkt richtig ist, keine Ahnung.

Man braucht ein Gespür für. Und wenn man das Gespür hat

und dann an der richtigen Stelle ist, dann...

Ja, brauchen wir noch ein bisschen Geld und Geduld.

Ja, aber genau der Punkt, auf den ich eigentlich hinaus will, ist,

was ist eigentlich, Amazon hat das gleiche Interface für alle Arten von Dingen, die sie verkaufen.

Sie haben am Anfang mit Büchern angefangen, weil bei Büchern das Problem,

weil sie da einen ganz klaren Vorteil gegenüber den anderen

Ja, du möchtest ein Framing bauen für den jeweiligen Kunden.

Ja, ich möchte halt zum Beispiel einfach nur so in die Richtung gehen,

warum muss die Navigation immer gleich aussehen.

Das eigene Holodeck, also manchmal geht man im Mittelalterladen einkaufen, mal im Cyberstore.

Genau, je nachdem, was man verkaufen möchte.

Amazon macht jetzt nicht nur Bücher, sondern mittlerweile machen sie,

Bücher ist jetzt wahrscheinlich gar kein großer Anteil mehr an ihrem Geschäft.

Sie verkaufen viel Elektronik und das sieht man der Seite halt auch an.

Also vieles von der Navigation ist darauf optimiert, dass ich halt irgendwie so Elektronik, weiße Ware irgendwie kaufen kann.

So ein bisschen wie Ambilight beim Fernseher.

Ja, aber halt inhaltlich.

Ja, ja.

Und das liegt halt vor allen Dingen, dass die Navigation so aussieht, wie sie aussieht, liegt halt an Datenbankschema.

Weil das lässt halt gar nicht zu, dass ich irgendwie was großartig anderes baue, weil das ist halt mehr oder weniger fix.

Jetzt ist es natürlich schon so, dass unterschiedliche Dinge, also Fahrräder haben halt bestimmte,

das kann ich schon irgendwie, da kann ich ein Schema bauen, das das irgendwie modelliert.

Oder Bücher oder Waschmaschinen.

Aber die Daten über die Daten, die kann ich natürlich irgendwie beliebig modellieren.

Da könnte ich auch beliebige Navigationen drauf bauen.

Und ich könnte auch, also wenn ich jetzt, also der Witz ist, was ich eigentlich eventuell gerne hätte,

dass jetzt, wenn jetzt ein Produktmanager, der für die Kategorie Fahrräder oder sowas zuständig ist,

auf eine irgendwie super Idee kommt, wie man das Navigieren mal macht und die Leute zufriedener zu den Fahrrädern, die sie haben wollen, führen kann,

dann müsste er ja die Navigation umstellen können.

Dafür müsste er das Schema ändern können.

Das heißt, er müsste das Schema live irgendwie ändern.

Was in relationalen Daten, das kannst du vergessen.

Also du kannst, ich meine, du musst eine Migration machen, du musst halt irgendwie, das kannst du alles, das kannst du komplett.

Also sagen wir mal so, es geht technisch, aber das ist auf jeden Fall Entwicklerarbeit.

Das ist halt nicht etwas, was irgendjemand, der auf einer Webseite irgendwas einstellt, irgendwie.

Das geht halt eher nicht.

Aber wenn man jetzt von diesem, sich von diesem relationalen Paradigmen so ein bisschen löst und sagt, okay, ja, dann ginge das eventuell schon.

Also im Grunde, wenn man jetzt nicht.

Daten über physikalische Effekte hat, sondern Daten über Daten und eine Datenbank, die halt nicht mehr so fixe Schema, nicht so ein fixes Schema hat,

dann könnte man eventuell so machen, dass man die Seite live so ändert, wie sie halt eventuell mehr Sinn macht.

Und vielleicht könnten das auch die User tun.

Keine Ahnung.

Es ist halt nur so, es ist halt so eine Idee.

Es ist halt einfach so eine Idee, wie geht es jetzt eigentlich weiter.

Ich meine, Amazon ist im Grunde mehr oder weniger fertig.

Wir haben Amazon nachgebaut und wir hatten auch das Problem, dass unsere Navigation,

egal ob das jetzt Fahrräder, Waschmaschinen oder sonst irgendwas ist, würde halt genau gleich aussehen oder Mode.

Und da könnten wir ja im Grunde nichts machen, weil das Schema halt für Angebote halt immer gleich sein muss, weil die sind ja alle in einem Datenbankschirm.

So, genau.

Aber das könnte halt irgendwie wie etwas anders aussehen.

Und was halt da sehr interessant sein könnte, sind halt Grafen-Datenbanken zum Beispiel, wo man halt eben nicht.

Also ich hatte das ja auch am Anfang schon mal erwähnt.

Es hätten sich auch Grafen-Datenbanken durchsetzen können.

Das ist überhaupt nicht so klar, warum das relational geworden sind.

Gut, die Grafen-Datenbanken waren ein bisschen später dran.

Aber ja, und da gibt es zum Beispiel auch ein super interessantes Projekt, nennt sich D-Graph.

D-Graph.

Ja.

Das ist ein Ex-Mitarbeiter von Google.

Und der hat sich irgendwie getroffen.

Da hat man Google geschaut.

Da hat man halt auch überlegt, was sind denn jetzt die Sachen, die man heutzutage hat, die Probleme, die man hat.

Also es muss halt irgendwie so.

Brides müssen halt auch.

Man darf nicht nur einen Master haben.

Es muss halt irgendwie skalierbar sein.

Es muss halt irgendwie schnell sein.

Und der hat, das hat letztes Mal, als wir über Skalierbarkeit und so, ich glaube, das war in der ersten Folge oder so geredet haben,

habe ich auch gesagt, so Go wäre eventuell ein guter Kandidat, um da drin einen Datenbank zu schreiben.

Also Python halt nicht so.

Das ist halt eines der wenigen Anwendungsfälle, wo ich sagen würde, gut, dafür ist Python.

Python ist gut geeignet, wenn man I.O. multiplexen muss.

Also man macht einfach nur viel Netzwerk in alle möglichen Richtungen.

Das geht.

Da braucht man gar nicht unter Umständen viel CPU für.

Also solange man nicht viel CPU dafür braucht.

Oder es ist gut dafür geeignet, wenn man viel CPU braucht, aber nicht so viel Concurrency hat.

Wenn man beides hat, man hat viel Concurrency und viel CPU, die das braucht, dann ist es halt eher scheiße.

Weil dann erwischt einen halt dieser Global Interpreter-Log.

Und da stößt man an so prinzipielle Grenzen.

Was Kalierbarkeit angeht bei Python.

Aber ich würde sagen, naja, nicht so schlimm.

Ist eigentlich ganz gut, weil diesen Anwendungsfall haben die wenigsten Programmierer.

Und ein Beispiel war halt Datenbanken.

Eventuell so etwas, was halt genau diese Anforderungen hat.

Und was man dann in Python vielleicht doch nicht so gut schreiben könnte.

Und ja, tatsächlich, Ggraph ist in Go geschrieben.

Und mit Graphen-Datenbanken könnte man das halt tun.

Da kann man halt das Schema ändern, live, ohne dass man irgendwie da so...

Weil man kann halt beliebige Beziehungen ziehen, beliebige Kanten.

Man muss nicht unbedingt sozusagen alles in dieser Tabellen...

Man hat ja nicht mehr unbedingt diese Tabellenstruktur.

Und ja, das ist halt schon ziemlich interessant.

Auch wenn man...

Also es gibt ja nochmal bei den Graphen-Datenbanken sowieso Unterschiede.

Es gibt auch diese ganzen ADF-Geschichten.

Da ist es aber so, dass die das nicht...

So optimiert irgendwie auf der Platte speichern.

Das ist halt eher so ein Textformat.

Es gibt ja auch Mikroformate auf Webseiten, wo man das benutzen kann.

Wo man irgendwelche Metadaten über die Seite hinterlegen kann.

Das ist bei uns auch eine vielleicht nicht so doofe Geschichte.

Gerade was Google angeht, Mikroformate.

Dann kann halt Google automatisch eine ganze Menge Informationen aus der Seite ziehen.

Ohne dass sie das halt irgendwie raten müssen.

Das geht auch schon alles so ein bisschen in Richtung Semantik-Web.

Aber das Problem dabei ist, es ist halt nicht optimiert.

Und für Graphenabfragen auch nicht optimiert.

Daher wird es halt immer ziemlich langsam sein.

Und es gibt halt Graphen-Datenbanken, die das halt so optimiert speichern.

Dazu gehört D-Graph auf jeden Fall.

Die älteste und weitestverweitete Datenbank Neo4j macht das auch so.

Aber Neo4j ist halt auch...

Das ist halt Java.

Kann ja schon mal nicht gut sein.

Aber es ist halt auch viel langsamer, muss man sagen, als D-Graph.

Und es ist halt auch...

Es hat eine komische Abfragesprache.

Also Cypher heißt die irgendwie.

Und naja.

Und ob das alles so...

Ist auch Acid und so.

Das ist alles nicht so...

Also es geht in die Richtung, aber es ist nicht so toll.

Irgendwie.

Und bei D-Graph sieht das alles viel besser aus.

Und was auch super cool ist bei D-Graph, ist die Abfragesprache.

Die nehmen einfach GraphQL.

Oder ein Dialekt davon.

Und das ist natürlich auch nochmal sehr interessant.

Weil GraphQL ist natürlich auch momentan ein sehr heißes Thema.

Und möglicherweise, wenn man jetzt ein neues Amazon bauen würde...

Würde man damit anfangen.

Würde man jetzt das vielleicht nicht auf einer relationalen Datenbank aufsetzen,

sondern auf sowas wie D-Graph.

Und dann könnte man das so bauen,

dass sich die Navigation je nachdem, was man da einkauft,

halt ändern lässt.

Auch live.

Und ist ja trotzdem schnell.

Und...

Ja.

Und das wäre so ein bisschen...

Dann könnte die Reise irgendwie gehen.

Ich habe keine Ahnung, ob das passieren wird, aber...

Ja, let's go.

Ja, genau.

Und dann auch, was auch interessant ist,

ist halt noch, dass man irgendwie durchaus

so hybride Formen haben kann

zwischen Dokument-basiert

oder Schema-less

oder nur SQL,

nur NoSQL.

Das steht halt entweder für Not-Only-SQL

oder eben

kein SQL.

Ähm...

Ähm...

Naja...

Äh...

In Toastgres hat man zum Beispiel die Möglichkeit,

das ein bisschen zu kombinieren.

Da gibt es halt ein sehr schönes...

Ähm...

Sehr schönen Spalten-Typ.

Nennt sich...

Äh...

Binary-Jason.

Ja, so muss es auch passen.

Jason gibt es auch.

Ist aber nur so aus Legacy-Gründen noch dabei.

Den nicht nehmen.

Der ist...

Äh...

Der ist alt.

Und nicht so gut.

Aber Binary-Jason ist super,

weil...

Weil, äh...

Da kann man auch Indizes auf Felder

innerhalb von dem Jason machen.

Das heißt, man kann halt die Teile, bei denen man sich nicht sicher ist,

wie das Schema dafür eigentlich aussehen wird,

oder die man, wo man sozusagen die Definition des Schemas

in die Applikation verlagern möchte,

also wo dann ein Applikationsentwickler sagen kann,

okay, an der Stelle speichere ich die Daten jetzt so und so.

Ja, ich möchte aber gar nicht die Datenbank verändern.

Dann kann er das,

wenn er das in eine Spalte schreibt, die halt Binary-Jason ist,

einfach so reinschreiben.

Er kann sogar Sachen da drin indizieren und so.

Und, ähm...

Und das ist halt...

Zack, schnell.

Das ist ähnlich schnell wie MongoDB.

MongoDB macht ja...

MongoDB ist mehr oder weniger nur diese B-Jason-Spalte

aus Postgres.

Das ist halt mehr oder weniger das Gleiche.

Das heißt, wenn ich jetzt...

Ich kann das, was ich mit MongoDB mache,

auch in einer solchen Spalte in Postgres machen.

Ja, gut.

MongoDB ist vielleicht noch ein bisschen schneller,

hat noch ein paar andere Funktionen, aber...

Ja...

Das...

Also...

Ich glaube nicht, dass viele Leute

tatsächlich was anderes brauchen würden.

Ich kann aber auf der anderen Seite bei den Sachen,

bei denen ich...

Wenn ich weiß...

Also, es gibt ja so etablierte Geschichten,

da ist schon klar, wie das funktioniert.

User-Verwaltung,

wenn ich eine Webseite habe,

so, wenn sich User anmelden...

Das ist alles relational,

das ist auch etabliert,

da wird sich jetzt auch nicht so viel dran ändern.

Und dann für die Teile der Applikation,

wo ich mir halt nicht sicher bin,

wo ich nicht weiß, in welche Richtung das geht,

mache ich dann halt...

Schreibe ich das halt als JSON,

irgendwelche Spalten da.

Und wenn das dann halt klar geworden ist,

wie das Schema da aussieht,

dann ziehe ich das dann auch Stück für Stück

in ein relationales Schema.

Sodass ich halt dann Vorteile aus beiden Welten habe.

Und ich würde sagen,

das ist halt momentan auch so ein relativ unschlagbares Feature

von Postgres gegenüber den meisten anderen Datenbanken,

dass man das halt so flexibel miteinander kombinieren kann.

Weil, wenn ich MongoDB habe,

habe ich ja das Problem,

okay, also relational und konsistent und sicher und so,

das geht halt alles nicht so richtig gut.

Ich habe halt nur dieses Ding,

wo ich halt meine...

Ich kann zwar auch ein Schema definieren oder so,

aber...

Ja, das ist alles nicht so weit wie bei Postgres.

Ja.

Ja, also genau,

das wollte ich auch noch erwähnt haben,

dass das halt eine schöne Geschichte ist an Postgres.

Ja, ich glaube, langsam haben wir es, ne?

Ja, und so langsam sind wir dann eigentlich im Grunde...

Ich habe ja wirklich viel durchgehalten heute,

also über drei Stunden,

das war schon die Mammut-Folge hier jetzt, also...

Okay, ja, aber ich bin mal auch gespannt,

wie das so ankommt,

weil das ist ja jetzt immer so ein bisschen...

Das ist ja jetzt nicht so ein Einsteiger oder so,

sondern das ist einfach mal so komplett durch...

Ich habe möglicherweise auch eine Menge Unsinn erzählt,

das kann leider auch sein, weil das ist halt auch so...

Ja, aber man kann sich irgendwann die Folge nochmal anhören,

wenn man so ein bisschen weiter ist in dem Thema,

und dann vielleicht merkt man so,

hey, wow, ja, das waren einige interessante Gedankengründe,

wie sich das so verändert im Laufe der Zeit.

Ja, ach so, PIX, genau.

Ja.

Hast du...

Du machst...

Was machst du mit Datenbanken oder welche Sachen?

Ich bin ja noch gerade am Anfang.

Ich nehme erst mal so ein bisschen SQLite oder sowas,

das ist ganz super, das ist ja direkt dabei,

und dann kann man direkt loslegen

und seine ersten Datenbanken ein bisschen füttern.

Für den Einstieg auch gar nicht so schlecht,

dann kann man erst mal ein paar SQL-Skaten sehen

und vielleicht mit SQL-Alchemy das machen und dann...

Das ist auch interessant.

Ich glaube, SQLite ist eine der Softwaren,

die mit am weitesten...

Die weiteste Deploy-Basis hat irgendwie so.

Ich glaube, das konkurriert noch mit Curl oder so.

Das wird auch fast überall SQL mit drin.

Aber ich glaube, SQLite ist auch ein Kandidat für das.

Das ist fast überall drin.

Das ist auch Core Data,

das ist der Datenabstraktionslayer von iOS.

Da ist auch SQLite drunter.

Das ist in fast allen Browsern drin.

Das heißt, wenn man einen Browser hat, hat man SQLite.

Das ist auf einer Apple Watch.

Das ist eine SQLite-Datenbank und zählt die Schritte.

Das ist ein echter Teil.

Also es skaliert von einer kleinen Uhr

zu, ich glaube, momentan das theoretische Limit für SQLite

sind irgendwie 144 Terabyte oder sowas.

Kriegt man schwer voll.

Ja, und es gibt, glaube ich, große SQLite-Datenbanken

tatsächlich da draußen.

Das ist ein super interessantes Projekt.

Ich glaube, es wurde mal vorgeschlagen,

für Langzeitarchivierung das SQLite-Format zu nehmen,

weil es halt so...

Von irgendeiner Bibliothek.

Weil es halt auch sich seit Jahren nicht mehr geändert hat.

Das ist relativ schnell.

Und ja, SQLite, super cooles Projekt.

Und im Zusammenhang ist auch einer von meinen Pics,

was man sich vielleicht mal angucken kann,

ist ein Projekt namens Datasette.

Datasette.

Die Kassette, also zum Aufrollen noch.

So wie, genau.

Und zwar geht es darum, dass halt für so Datenjournalismus,

es geht darum, dass man...

Datensätze, die irgendwo veröffentlicht wurden,

wie man die jetzt navigierbar macht,

für Leute, die jetzt nicht das in eine Datenbank importieren wollen

und dann selber Statements schreiben.

Und das macht das halt.

Und man kann ja CSV ausnehmen, die da reinwerfen.

Und dann kriegt man halt so auch ein Interface

mit Facetten Navigation, mit Volltextsuche,

weil halt auch SQLite kann halt Volltextsuche.

Und man kann sogar SQL Statements reinschreiben.

Man kann aber auch das irgendwie über eine Webseite navigieren.

Das ist ziemlich cool.

Und ja, das wollte ich auf jeden Fall mal erwähnt haben.

Das kann man sich mal anschauen.

Es gibt dann da so Teile von,

wo man auch CSVs automatisch in SQLite-Datenbanken umwandeln kann.

Auch interessant, dass man da so frei SQL-Statements irgendwie eingeben kann.

Das geht ja auch kaum.

Aber das geht halt deswegen, weil man bei SQLite auch sagen kann,

oh, das ist jetzt ein Read-Only-Datenbank.

Und dann kann man halt mit Statements nichts mehr kaputt machen.

Ja, das ist halt ein sehr schönes Projekt.

Ja.

Dann, genau.

Also, auch wie man auf Datenbank...

Von Python aus zugreift.

Es gibt so Async-PG als asynchroner Datenbank-Client für Python.

Das wird noch sehr interessant.

Also, das ist notar noch ein Problem.

Also, Psycho-PG ist halt so der Standard-Postgres-Datenbank-Client für Python.

Und der kann aber nur Textprotokoll und nicht Binary.

Ist halt schon relativ schnell.

Aber es geht halt mit dem Binärprotokoll halt noch schneller.

Und er ist halt nicht asynchron.

Also, was halt ein Problem ist,

wenn man jetzt zum Beispiel bei Postgres,

macht man jetzt Volltext-Suche und Navigation auf einer Webseite.

Dann hat man, wenn man das mit Django macht,

Django ist auch synchron.

Dann macht man halt einmal,

hat jetzt Facet-Navigation.

Das heißt, man muss halt an den Facetten,

das heißt Text oder Kategorien

oder irgendwelchen anderen Monaten

oder was auch immer man halt navigierbar halten will,

schreibt man halt so Counts dran.

Oder man muss halt überhaupt wissen,

was hat ein Count von größer Null,

damit man diese Facette anzeigt oder nicht anzeigt.

Das sind halt zwei unterschiedliche Statements.

Man kriegt einmal die Suchergebnisse

und dann macht man nochmal ein Statement,

um die Counts zu holen.

Und meistens hat man aber nicht nur diese zwei,

sondern noch ein paar mehr.

Und das ist halt jedes Mal ein Datenbank-Roundtrip.

Das ist jedes Mal, dauert das irgendwie ein paar Millisekunden.

Also bei den Suchanfragen, bei den Counts,

dauert es sogar so irgendwie 30, 40 Millisekunden.

Sodass man halt bei so einer normalen Navigation auf einer Seite

wahrscheinlich schon so 150 Millisekunden nur SQL-Anfragen hat.

Und dann ist man schon bei,

wenn dann das Template gerendert wird,

ist man leicht bei 400, 500 Millisekunden.

Und das ist halt dann schon relativ lang.

Das ist schon viel für eine Webseite.

Eigentlich ein bisschen zu viel.

Und man könnte es leicht deutlich drücken,

wenn jetzt diese Statements,

die ja nicht voneinander abhängen,

sondern die man auch parallel abfeuern könnte,

tatsächlich parallel an die Datenbank gestellt würden.

Und dann hat man nur noch,

ist die Latenz oder die Zeit, die man braucht,

um SQL-Abfragen zu machen in dem Webfrontend,

dauert nur noch so lange wie das längste Statement.

Und alle anderen Sachen,

die sind halt vorher da.

Und das würde halt wahrscheinlich bedeuten,

dass dann ist man runter auf 50 Millisekunden oder so.

Dann hat man 100 Millisekunden gespart.

Das wäre ziemlich cool.

Aber dafür müsste halt Django asynchron sein.

Dafür müsste man halt irgendwie Async-PG verwenden

statt Psycho-PG.

Und das wird alles noch ein bisschen dauern.

Wahrscheinlich Jahre, fürchte ich.

Ist auch so, dass der Autor von Django Channels,

das ist diese Geschichte mit den Web-Sockets,

dass man halt bidirektionale Kommunikation

zwischen Client und Server hat bei Web-Anwendungen.

Der hat jetzt dieses Projekt so ein bisschen aufgegeben

oder ist nicht mehr Maintainer davon.

Und das, was man jetzt macht,

ist jetzt der Versuch, Django Async fähig zu machen.

Ich bin mal gespannt, wie das wird.

Das war ja auch in der Django-Folge,

hatten wir das ja irgendwie kurz,

ob das vielleicht eventuell eine Richtung wäre,

in die sich Django entwickeln könnte.

Und ja, es sieht danach aus,

so ein bisschen als ob es kommen würde.

Und damit sind wir im Grunde durch.

Sind wir durch mit einer Mammut-Folge.

Wenn ihr es bis hierhin geschafft habt, also gut ab.

Es wird jetzt einiges mehr über Datenbanken,

dass man damit alles anstrengen kann.

Ja, schöne Sache.

Super, dass ihr dabei wart.

Und ja, wo ihr auch immer hier seid,

schönen Tag und so weiter.

Wenn ihr Fragen habt, hallo.at.peisenpodcast.de

Ja, dann bis zum nächsten Mal.

Auf Wiedersehen. Tschüss.