Ein Weg wäre die Installation des DuckDB CLI. Lade die passende Version für dich herunter und entpacke sie. Die Datenbankdatei würde ich im Anschluss (der Einfachheit halber) direkt mit in das Verzeichnis kopieren.

Öffne im Anschluss die Kommandozeile deines Betriebssystems (meine folgenden Code-Snippets beziehen sich auf Windows OS) und navigiere zu dem entpackten Ordner, in dem die duckdb.exe liegt.

cd "c:/path/to/duckdb/folder"

Dann kannst du auch schon eine Verbindung herstellen:

duckdb hotelkette.db

Sollte deine Datenbankdatei doch noch in einem anderen Pfad liegen, gib stattdessen den absoluten Dateipfad an. Am besten umklammert von Anführungszeichen, falls einer der Verzeichnisnamen ein Leerzeichen enthalten sollte.

duckdb "c:/path/to/hotelkette.db"

Sobald sich der Client mit der Datenbank verbunden hat, solltest du via SQL Daten auslesen oder schreiben können. Der beste Startpunkt wäre wohl, erst einmal in Erfahrung zu bringen, was für Tabellen überhaupt in der Datenbank liegen und wie sie strukturiert sind.

Die information_schema_tables-View beinhaltet bspw. Informationen über alle verfügbaren Tabellen in der Datenbank:

SELECT table_name FROM information_schema.tables

Die Struktur einer bestimmten Tabelle kannst du in Erfahrung bringen, indem du in der information_schema.columns-View nach der Tabelle suchst:

SELECT * FROM information_schema.columns WHERE table_name = 'name of a table'

Mehr zu den information_schema-Views kannst du in der Dokumentation nachschlagen.

Alternativ zu diesem Weg macht es dir DBeaver an der Stelle natürlich deutlich einfacher. Auf deinem ersten Screenshot hast du die Datenbank ja bereits geöffnet. Wenn du im linken Dialog (Datenbanknavigator) die Knoten von beispielsweise main oder pg_catalog einmal aufklappen würdest, solltest du ebenso die Tabellen finden, die in der Datenbank so vorliegen.

Explizit relevant für dich sind natürlich nur die Tabellen, die irgendetwas mit Hotels zutun haben.

Sollte dir nun aber noch Wissen zu dem Aufbau von Datenbanktabellen fehlen (z.B. Was Constraints oder Datentypen sind), würde ich dir empfehlen, dich dazu erst einmal zu belesen. Hilfreiche Artikel gibt es zum Beispiel auf datenbanken-verstehen.de. Bezüglich der SQL-Syntax solltest du in der DuckDB-Dokumentation nachschlagen.

(...) um an dieser Datei neue Dinge hinzuzufügen (...)

Neue Daten kannst du mittels INSERT INTO zu einer bestehenden Tabelle hinzufügen.

Beispiel:

Angenommen, wir haben eine Tabelle hotelpersonal, die das Hotelpersonal auflisten soll. Es gibt die Spalten vorname (VARCHAR), nachname (VARCHAR), gehalt (DECIMAL) und position (VARCHAR).

Das Hinzufügen eines neuen Datensatzes könnte folgendermaßen aussehen:

INSERT INTO hotelpersonal (vorname, nachname, gehalt, position)
VALUES ('Zéro', 'Moustafa', 2400, 'Page');

Für Weiteres dazu würde ich erneut auf die DuckDB-Dokumentation verweisen.

...zur Antwort

PyCharm verwendet eine eigene Konsolenimplementation, die sich nicht direkt so verhält, wie du es bei der Windows Konsole erwarten könntest. Aufrufe wie cls funktionieren in ihr nicht. Wenn du den Fensterinhalt leeren möchtest, musst du auf die GUI-Funktionalitäten von PyCharm zurückgreifen (z.B. Rechtsklick in das Konsolenfenster > Clear All).

Die IDE stellt allerdings auch eine Einstellung bereit, mit der eine OS-Konsole zumindest emuliert werden kann (siehe: Emulate terminal in output console in den Run/Debug Configurations). Wenn du die aktivierst, sollte ein Aufruf wie

import os
os.system("cls")

die Konsole leeren.

Für eine tatsächliche Sicherheit, dass all deine Anweisungen an die Konsole wie erwartet funktionieren, solltest du dein Python-Skript allerdings in der echten Konsole von Windows ausführen.

...zur Antwort

a) Es gibt Dateiversionierungssyteme wie Git oder Mercurial, deren Repository zentral gehostet werden kann (siehe Bitbucket, GitLab, GitHub, Sourceforge). Das Repository beinhaltet all eure Projektdateien und ebenso eine Verlaufsgeschichte über jegliche Änderungen, die in ihm einmal registriert wurden.

Jeder in eurem Team kann sich folgend dieses (Remote) Repository klonen und in diesem seine Änderungen einfügen (Commits). Später werden diese auf das zentrale Repository geschoben. Sollten zwei Personen zeitgleich an einer Datei gearbeitet haben, ist es notwendig, die Änderungen zusammenzuführen (Merge).

Die Arbeit mit solchen Versionierungssystemen ist gängiger Standard in der Industrie.

b) Für einige Entwicklungsumgebungen/Editoren gibt es Kollaborationssoftware, über die man in Echtzeit gemeinsam an einem Projekt arbeiten kann. Für Eclipse gibt es da z.B. das Saros Plugin oder für Visual Studio und VS Code gibt es Live Share.

c) Zu guter Letzt steht euch natürlich noch offen, via Kommunikationssoftware (Microsoft Teams, Skype, o.ä.) Pair Programming zu organisieren.

...zur Antwort

1) Dein HTML ist an verschiedenen Stellen invalid.

  • select-Elemente kennen kein Attribut test
  • Das erste Anführungszeichen muss raus
  • option-Elemente kennen kein Attribut href

2) Bei nur einer Option in der Auswahlbox hat der Nutzer nicht die Möglichkeit, die Auswahl zu ändern (und somit ein change-Event zu triggern).

3) Da dein option-Element kein value-Attribut definiert, wird das Label (in deinem Fall -test) als Wert verwendet.

Eine korrigierte Fassung könnte folgendermaßen aussehen:

<select name="test" onchange="window.open(this.value, '_self'); return false;">
  <option selected disabled>Please choose a target</option>
  <option value="index.html">-test</option>
</select>
...zur Antwort

1) Du setzt mehrmals die Schriftart für Komponenten falsch.

// falsch
entry= tk.Entry(root, width= 20, font("Arial", 20), bd=20, justify= tk.RIGHT)

// richtig
entry= tk.Entry(root, width=20, font="Arial 20", bd=20, justify=tk.RIGHT)

// auch richtig
entry= tk.Entry(root, width=20, font=("Arial", 20), bd=20, justify=tk.RIGHT) 

Bei font handelt es sich um ein keyword argument. Dieses wird mittels Gleichheitszeichen von seinem Wert getrennt.

2) Hinter dem Kopf einer Kontrollstruktur kommt stets ein Doppelpunkt

// falsch
if column_val> 3

// richtig
if column_val > 3:

Es ist für eine bessere Lesbarkeit im Übrigen sinnvoll, Operatoren und Terme via Leerzeichen zu trennen.

3) Die Einrückungen in deiner vorletzten Schleife sind offensichtlich falsch. Wenn du einen neuen Kontext öffnen möchtest (z.B. if-Körper), dann rücke um vier Leerzeichen nach rechts ein. Soll dieser Kontext wieder geschlossen werden, geht es wieder vier Leerzeichen nach links.

4) Der Aufruf von mainloop sollte insgesamt nur einmal erfolgen. Er gehört also nicht in den Schleifenkörper.

5) Bei entry.grid handelt es sich um einen Methodenaufruf. Folglich ist der Zuweisungsoperator vor der Klammer (Argumentenliste) falsch.

6) Es gibt kein Argument stickx für die grid-Methode.

...zur Antwort

1) In der Zeile, in der du das Array initialisierst, fehlt ein Semikolon am Zeilenende.

2) Deine Bezeichner würde ich nochmals überarbeiten:

  • Das Array könnte mit einem Namen wie numbers konkreter beschrieben werden.
  • inputs ist eine Pluralform, aber du liest in diesem Schritt nur eine Eingabe
  • Statt snake_style würde ich empfehlen, die übliche PascalCase-Konvention von C# einzuhalten. Aus min_Max_Sum wird demzufolge minMaxSum.
  • Für Zählervariablen wäre es besser, entweder einen passenden, aussagekräftigen Namen zu wählen (z.B. index) oder zumindest einen gängigen Namen wie i (= index/iteration).

3) Wenn wir einmal fest davon ausgehen, dass jede Eingabe ausnahmslos eine valide Ganzzahl ist, dann wäre eine for-Schleife besser geeignet, da dann die Zählervariable nur für den Kontext angelegt werden muss, in dem sie tatsächlich benötigt wird.

for (int index = 0; index < numbers.Length; ++index)
{
  var input = Console.ReadLine();
  numbers[index] = int.Parse(input);
}

In der Praxis ist es aber tatsächlich besser, sich gerade bei Eingaben von außen abzusichern. Bei einer invaliden Eingabe würde die Parse-Methode einen unbehandelten Ausnahmefall auslösen, der zum Programmabsturz führt.

Die TryParse-Methode ist die sichere Option. Wenn sie die Eingabe lesen kann, wird das Resultat in das out-Argument geschrieben und die Methode selbst liefert den Wert true zurück. Bei Misserfolg wäre die Rückgabe false.

Schlussendlich könnte man hier nun gut die do-while-Schleife nutzen:

var index = 0;

do
{
  var input = Console.ReadLine();

  if (int.TryParse(input, out var number))
  {
    numbers[index] = number;
    ++index;
  }
}
while (index < numbers.Length);

Natürlich sind while oder for ebenso möglich:

for (var index = 0; index < numbers.Length;)
{
  var input = Console.ReadLine();

  if (int.TryParse(input, out var number))
  {
    numbers[index] = number;
    ++index;
  }
}

Ich halte in diesem Fall aber die do-while (zumindest im Vergleich zu for) für die bessere Option, denn man kann an ihr schneller die verfolgte Absicht herauslesen.

Die for-Schleife steht üblicherweise für einen kontrollierten Ablauf, bei dem von vornherein klarer definiert ist, wie oft die Schleife ihren Körper wiederholen wird. Bei while/do-while ist das offener, da der Kopf/Fuß nur eine Bedingung aufnimmt.

Das Ergebnis von ReadLine schreibe ich übrigens in eine eigene Variable, damit man bei Bedarf leichter prüfen kann (z.B. via Debugger), was für ein tatsächlicher Wert von der Konsole gelesen wurde.

4) Deine Lösung, via Linq die Extremwerte herauszusuchen, ist natürlich schön kurz und bei den fünf Zahlen absolut kein Problem.

Behalte dennoch im Auge, dass du damit mehrmals über das Array läufst, obwohl du die gesuchten Werte auch schon beim Einlesen ermitteln könntest. Immerhin bräuchtest du lediglich zwei Variablen (min/max) die mit jeder neuen Eingabe verglichen werden. Ist die Eingabe größer/kleiner, dann wird der Wert der jeweiligen Variable überschrieben.

Müsstest du die Werte nicht in einem Array speichern, sollten Minimum und Maximum definitiv in der Eingabeschleife ermittelt werden.

...zur Antwort
JavaScript

Es wäre meiner Meinung nach aufgrund mehrerer Gründe besser, mit JavaScript anzufangen.

  • JavaScript ist weiter verbreitet als TypeScript
  • Es hilft später, bestimmte Verhaltensweisen besser zu verstehen (JS basiert bspw. auf einem prototypbasierten OOP-Modell, auf die nun eine Sprache wie TypeScript versucht, ein klassenbasiertes OOP-Modell draufzustülpen)

Bezüglich interessanter Themen für später:

  • Web-APIs (s. bspw. Canvas, DOM, Fetch, File, Intersection Observer, Mutation Observer, Push, WebSockets, Web Storage)
  • Die Features der Webentwicklungstools deines genutzten Browsers (Chrome/Firefox/Safari)
  • JS Design Patterns
  • Adaptive & Responsive Design (Vorgehensweisen, technische Mittel, ...)
  • Node.js, NPM und Bundling Tools (wie Vite, webpack, o.ä.)
  • Es wäre gut, sich in ein/e populäre/s JS-Bibliothek/Framework (z.B. Angular / NextJS / React / Svelte / Vue) schon einmal tiefer eingearbeitet zu haben
  • Das Gleiche gilt für CSS-Frameworks/Toolkits (s. Bootstrap, Tailwind, UIkit, ...)
  • CSS-Erweiterungen (wie LESS oder SCSS)
  • CSS Namenskonventionen (siehe BEM, SMACSS)
  • Storybooks
  • Test-Frameworks (wie Cypress, Jest, Mocha, Playwright, ...)
  • WCAG
  • Auch wenn es nicht mehr direkt in den Bereich Frontend gehört: Einmal mit einem CMS zu arbeiten, wäre nicht schlecht

Auch wenn ich bzgl. Tools oben meist mehrere Optionen nenne, reicht es vollkommen aus, sich jeweils nur eines herauszugreifen, um das darumliegende Konzept kennenzulernen. Sich direkt in alles einarbeiten zu wollen (z.B. alle genannten Testframeworks), wäre übertrieben. Womit du bei einem Arbeitgeber letztendlich tatsächlich einmal konfrontiert wirst, ist nicht absehbar.

(...) z.B. höre ich immer wie wichtig REST-APIs sind (...)

REST gibt Regeln vor, wie eine Schnittstelle aussehen soll, über die ein Client mit einem Server kommuniziert. Webartikel, die diese Architektur genauer beschreiben, gibt es viele (Beispiel). Ein einfaches Einstiegstutorial mit Node.js findest du beispielsweise im Postman Blog (einen Postman-Account benötigst du m.E. nicht; die Anfragen an die API kannst du genauso gut mittels Fetch stellen).

...zur Antwort

Ein Pfeil mit weiß ausgefüllter Spitze zeigt eine Vererbung an. Die Klasse, die mit dem Pfeil auf eine andere Klasse zeigt, erbt deren (für sie sichtbaren) Eigenschaften und Verhaltensweisen.

Bei einer einfachen Pfeilspitze (ohne Dreieckskopf) handelt es sich um eine Assoziation, bei der die Klasse am stumpfen Ende auf die Klasse (bzw. deren Attribute/Methoden) zugreift, auf welche der Pfeil zeigt. Das Kreuz am anderen Ende kann genutzt werden, um deutlich auszuschließen, dass diese Beziehung nicht auch in die andere Richtung gehen könnte.

...zur Antwort

UI bezeichnet allgemein eine Schnittstelle, über die ein Nutzer mit einer Anwendung (bzw. dem Computer) kommunizieren kann.

Beispiele:

  • Eingaben über Touchpad, Fernbedienung, Maus, Tastatur, Joystick, u.ä.
  • Der Computer könnte auf Geräusche/deine Stimme reagieren (siehe Alexa oder Google Mini)
  • Der Computer könnte auf Bewegungen reagieren (Bewegen des Geräts, Bewegung vor einer Kamera)
  • Grafische oder textbasierte Oberflächen (z.B. die Kommandozeile)

Eine grafische Oberfläche (GUI) ist folglich eine konkrete Art an UI. Sie stellt dem Nutzer grafische Komponenten (Buttons, Dropdowns, Eingabefelder, u.ä.) zur Verfügung, über die er mit dem Programm interagieren kann.

Klassische Beispiele dafür findest du hier:

  • Bei Betriebssystemen wie macOS, iOS, Android OS oder Windows OS
  • Auf Webseiten
  • Bei Menüs in Computerspielen
...zur Antwort

Du setzt j nicht zurück, nachdem die innere Schleife einmal durchlaufen wurde. Daher trifft für die Folgeiterationschritte der äußeren Schleife die Bedingung

j < len(L)

nicht mehr zu.

...zur Antwort
(...) und bräuchte dazu ein leichtes Programm

Du kannst IntelliJ IDEA als Entwicklungsumgebung nutzen. Alternativen dazu sind noch Eclipse oder NetBeans IDE. Diese drei Programme sind soweit auch für die professionelle Entwicklung geeignet.

Solltest du nach noch einfacher aufgebauten Anwendungen für einen spielerischeren Einstieg suchen, schau dir Greenfoot an. Greenfoot wird insbesondere in schulischen Einrichtungen genutzt.

Andernfalls würde ich dir für den Anfang speziell Processing empfehlen. Hierbei handelt es sich um eine Programmiersprache mit eigener (gleichnamiger) IDE, die auf Java aufbaut und deren Syntax weitestgehend übernimmt. Allerdings nimmt sie auch an vielen Stellen Komplexität heraus: Codestrukturen, die für einen Anfänger eh noch nicht relevant sind (aber in Java dennoch geschrieben werden müssen, um ein funktionales Programm zu erhalten) und erst bei einem späteren Lernstand tatsächlich gut erklärt werden könnten. Mit Processing kannst du dich also gut auf das Erlernen der ersten Grundlagen fokussieren. Anschließend kannst du mit Java einfach weitermachen.

(...) ich würde mir gerne Java beibringen (...) Hat jemand Empfehlungen (...)

Bezüglich Lernmaterial würde ich auf solche verweisen:

  • Die JetBrains Academy bietet für Java einen ziemlich umfangreichen Kurs an, welcher nach jedem Kapitel mehrere Übungsaufgaben einschließt.
  • Buch: Programmieren lernen mit Java von Habelitz
  • Buch: Java ist auch eine Insel von Ullenboom (gibt es für die 15. Auflage auch als Open Book, also in dem Fall zu Java 14)
  • Buch: Schrödinger programmiert Java von Ackermann
  • Core Java Tutorial (bis Java 11) von Pankai

Abraten würde ich von jeglichen Crashkursen, da diese meist sehr oberflächlich versuchen, Informationen in kurzer Zeit zu vermitteln. Nimm dir stattdessen bewusst die Zeit zum Lernen, die du brauchst. Des Weiteren wäre es gut, mit Material zu starten, welches mindestens Java 9 inkludiert, da ab dieser Version erste größere Umbrüche stattfanden (z.B. die Einführung des Modulsystems). Bei dem hier von anderen Antwortgebern angepriesene W3Schools ist das beispielsweise nicht der Fall.

Wenn du lernst, dann versuche dich auch praktisch an dem Angelesenen. Ganz am Anfang reicht das natürlich noch nicht für richtig sinnvolle Anwendungen, doch nach und nach kannst du deine Kenntnisse kombinieren. Ein paar Seiten, auf denen du Übungsaufgaben finden kannst, wären CodingBat, Edabit, Exercism oder w3resource.

...zur Antwort

Du kannst einen Typ erstellen:

type TMatrix = array[1..8, 1..8] of Integer;

und diesen als Rückgabewert verwenden:

function GetZuege() : TMatrix;

Oder aber du verwendest ein generisches, dynamisches Array:

function GetZuege() : TArray<TArray<Integer>>;
...zur Antwort

Zu diesem Widget gibt es diesen Konfigurator.

https://www.meteoblue.com/en/weather/widget/setupday/san-francisco_united-states_5391959

In dem kannst du ein Theme (Coloured/Monochrome) und sowie gepaart die Hinter- sowie Vordergrundfabe festlegen.

Wenn dir diese Optionen nicht genügen, musst du dir den HTML-Response des Widgets über einen Request innerhalb einer serverseitigen Webanwendung holen, den entsprechenden Container (.picto) extrahieren und in einen eigenen Container auf deiner Seite herausrendern. Dann kannst du auch eigenes CSS hinzufügen (z.B. eine CSS-Regel mit dem Klassenselektor picto, welche eine Hintergrundfarbe setzt).

Voraussetzungen dafür sind: Zugriff auf den Webserver der eigenen Webseite sowie Programmierkenntnisse in der Technologie, die bei dir serverseitig genutzt werden kann (sei es nun PHP, o.ä.).

...zur Antwort
Kann man Pygame auf dem iPhone installieren?

Man kann PyGame-Spiele auf iOS portieren. Deinem weiteren Text zufolge suchst du aber eigentlich nach einer Python-Entwicklungsumgebung für dein Gerät.

Zwei Optionen wären da replit (in der du auch PyGame installieren kannst) oder Pythonista. Mit letztgenannter App kannst du zwar auch kleine Spiele oder Animationen entwickeln, jedoch nicht mit PyGame.

(...) aber er ist so alt und langsam, das man fast nichts mit ihm anfangen kann (...)

Python/PyGame hat keine hohen Systemanforderungen. Daher wird es da wohl kaum Probleme geben.

...zur Antwort
Weiß jemand wie man das beheben (...)

Mit FreeConsole löst du dich (bzw. den Prozess deines Programms) von der Konsole. Das heißt, du hast auf sie auch keinen Zugriff mehr. Du müsstest dich erst mit AttachConsole oder AllocConsole an eine Konsole binden, um wieder schreiben zu können.

(...) und vlt. auch welche Bedeutung die Rückgabewerte beider Imports haben?

Der Rückgabewert gibt bei beiden Funktionen jeweils an, ob die Aktion erfolgreich war. In dem Fall muss er ungleich 0 sein.

...zur Antwort

Groovy ist ganz nett, da du - so wie man es auch von anderen Skriptsprachen kennt - recht schnell und einfach kleine Anwendungen (z.B. Automatisierungsskripte, Unittests) entwickeln kannst. Im Gegensatz zu Java bietet Groovy mehr syntactic sugar (z.B. implizit generierte Getter/Setter, ein stärker ausgebautes switch-case-Konstrukt, Support für truthy-Werte) und generell kann man die Syntax viel schlanker halten.

Es macht meiner Meinung aber nur Sinn, Groovy als Erweiterung zu Java zu lernen (was es nun ja auch sein soll). Du wirst sie eh meist nur im Java-Umfeld antreffen. Einige Projekte nutzen Groovy direkt im Mix mit der Java-Sprache.

Was einen Umstieg von Java auf Groovy meines Erachtens etwas erschwert, sind Verhaltensunterschiede selbst bei gleichem Code (Beispiele: Der Equality-Operator, String-Literale, Multimethods, Standardsichtbarkeit von Feldern).

...zur Antwort

Bei InOut handelt es sich um eine Klasse, die vom Java Editor vordefiniert wird (siehe hier). Das heißt, in anderen Entwicklungsumgebungen (wie Eclipse, NetBeans, u.ä.) kannst du sie nicht verwenden, sofern du diese Klassendefinition nicht explizit mit in dein Projekt kopierst.

Diese Klasse stellt dir ein paar Methoden zur Verfügung, mit denen du Eingaben vom Konsoleneingabekanal lesen oder Ausgaben in den Konsolenausgabekanal schreiben kannst.

Die Methode readInt gibt zuerst die an sie übergebene Zeichenkette ("Zahl (>=0) : ") in der Konsole aus. Anschließend versucht sie die nächste Eingabe in der Konsole auszulesen und in eine Ganzzahl zu konvertieren. Wenn das klappt, wird die gelesene Zahl in eine Variable namens zahl abgelegt.

...zur Antwort

Beide eignen sich gut für den Fall, wenn man auf schnellem Weg eine einfache grafische Oberfläche (bspw. für Prototypen, Miniutilities/Gadget-Software, u.ä.) zusammenklatschen möchte. Für Entwickler, die noch wenig Erfahrung (vor allem in der Entwicklung von GUIs) haben, sollte ein Einstieg zudem bei beiden nicht schwerfallen.

Im direkten Vergleich ist tkinter besser aufgestellt, wenn es um die Lauffähigkeit auf verschiedenen OS geht. Neben einem nativen Look & Feel kann man auch Themes einsetzen (Standardthemes, eigene Themes oder Themes aus externen Quellen, z.B. ttkthemes).

Windows Forms wiederum bietet im Gegensatz zu tkinter eine größere Auswahl an vorimplementierten Komponenten und du kannst ebenso auf Themes (oder Eigenkreationen) zurückgreifen. Generell ist Windows Forms, aufgrund der zugrundeliegenden .NET-Architektur besser auf die Entwicklung von klassischen Businessanwendungen ausgelegt.

Solltest du Projektideen haben, bei denen die Entwicklung komplexer Oberflächen gefragt ist, die mit einer Vielzahl an Funktionalitäten, evt. etlichen geschachtelten Dialogen oder verschiedenen benutzerdefinierten Komponenten aufwarten (vgl. z.B. mit MS Word), dann würde ich dir empfehlen, eher mit Avalonia UI, MAUI oder WPF zu arbeiten.

Wenn es in Richtung Spieleentwicklung gehen soll (Spiele mit keiner statischen Oberfläche, wie z.B. Schach), wähle wiederum ein Tool, dass sich auf dieses Feld spezialisiert hat (z.B. MonoGame, Panda3D, Unity).

...zur Antwort

Ich würde es zunächst an einem bildlichen Beispiel beschreiben.

Stell dir vor, du bist Kellner in einem Bierzelt. Du könntest hier nun jedes Maß einzeln transportieren, was dich einige Zeit kosten dürfte. Effektiver wäre es, mehrere Krüge auf einem Tablett zu transportieren, welches so weit gefüllt wird, bis seine Belastungsgrenze ausgereizt ist.

Das Commit-Log wäre in diesem Fall die Kundenbestellliste. Sie sichert ab, dass jeder registrierte Kunde seine Bestellung erhält. Das Tablett stellt die MemTable dar. Es ist ein lokaler Zwischenspeicher, der erst einmal so viel aufnimmt, wie ihm möglich ist. Sobald das Tablett voll ist, werden die Krüge (Daten) zum tatsächlichen Zielsystem transportiert (SSTable) und somit die Bestellung abgeschlossen.

Was ist ein In-Memory-System?

Im Grunde ist damit ein Speicherbereich innerhalb des Arbeitsspeichers gemeint. Also Speicherplatz, der dem Programm (Cassandra) zur Programmlaufzeit zur Verfügung steht.

Der Vorteil an so einem System ist, dass die Daten schneller verarbeitet werden können. Der Computer hat einfachere, schnellere Zugriffsmöglichkeiten auf seinen Arbeitsspeicher.

Allerdings ist der Speicherplatz natürlich begrenzt und nicht persistent (bei Programmbeendigung wird der Bereich neu reserviert und die Daten sind weg). Daher müssen die Daten irgendwann in ein persistentes System übertragen (Speicherung auf der Festplatte/SSTable) werden.

Müsste Cassandra auf diesen Zwischenspeicher verzichten und die Daten stattdessen sofort auf der Festplatte speichern, würden die Schreibvorgänge viel länger dauern. Andersherum bietet der Zwischenspeicher den Vorteil, dass du Daten, die erst kürzlich geschrieben (aber noch nicht persistent gespeichert) wurden, schneller abrufen kannst.

Was ist ein MemTable?

MemTable ist einfach nur der Name für so einen Speicherbereich. Da die Daten im Speicher entsprechend formatiert werden (sodass sie später leichter/schneller in das persistente System übertragen werden können), ist das Wort Table in dem Begriff inkludiert.

Cassandra kann übrigens mehrere MemTables anlegen. Zu jeder Datenbanktabelle gibt es maximal eine aktive MemTable (die aktuelle Schreibvorgänge aufnimmt) und dazu kann es noch mehrere inaktive MemTables geben, die noch darauf warten, weiter befüllt oder geleert zu werden.

Was ist mit "die Daten hält, bis sie voll sind" gemeint?

Einfach gesagt, wartet eine MemTable darauf, einen bestimmten Schwellenwert zu erreichen. Ist die Datenbank z.B. so konfiguriert, dass eine Memtable maximal 5 MB fassen darf, würde sie bei Überbieten dieses Werts ihre Daten an die SSTable abgeben.

Es gibt allerdings noch andere Kriterien/Konfigurationsmöglichkeiten, die bestimmen, wann eine MemTable geleert wird. Du könntest eine Zeitperiode vorgeben (z.B. Speichere alle fünf Sekunden die Daten einer MemTable persistent) und es gibt ein Speicherlimit für das Commit-Log.

...zur Antwort