Zum Inhalt
wannacode

Die Bäckerei, Etappe 1: Datenbank und Tabellen

Kurz gesagt: Etappe 1 des Projekts führt von der Beschreibung einer kleinen Bäckerei zum Tabellenplan und zu fünf CREATE-TABLE-Anweisungen mit den Regeln, die die Daten korrekt halten.

Problem

Die Bäckerei an der Ecke

Eine Bäckerei im Viertel möchte Bestellungen online annehmen. Sie verkauft Brot, Teilchen und Getränke. Kunden legen ein Profil mit Name, E-Mail und Stadt an. Eine Bestellung hat ein Datum, einen Status (neu, bezahlt, geliefert, storniert) und ein paar Zeilen: welches Produkt, wie viele Stück und zu welchem Preis. Die Bäckerei will außerdem wissen, wie viel von jedem Produkt auf Lager ist.

In diesem Projekt baust du die ganze Datenbank selbst: von der leeren Datenbank über die Tabellen, die Daten, die Abfragen und die Änderungen bis zur Sicherung und zum DROP am Ende. Jede Etappe beginnt mit dem, was du in den vorigen gebaut hast.

Die Idee

Der Plan

Vor dem ersten CREATE TABLE entscheidest du, welche Dinge es gibt und wie sie zusammenhängen. Hier sind es fünf:

Tabelle Was sie enthält Zeigt auf
categories die Kategorien: Brot, Teilchen, Getränke
products die Produkte mit Preis und Lagerbestand categories
customers die Kunden mit E-Mail und Stadt
orders die Bestellungen mit Datum und Status customers
order_items die Zeilen der Bestellungen orders und products

Jede Tabelle hat id INTEGER PRIMARY KEY, außer order_items: Dort ist der Schlüssel das Paar aus Bestellung und Produkt, denn ein Produkt ist eine Zeile in der Bestellung. Die Tabellen, auf die gezeigt wird, werden zuerst angelegt.

Die Idee

Die leere Datenbank

Auf deinem Computer legst du die Datenbank mit sqlite3 bakery.db an (in PostgreSQL mit CREATE DATABASE bakery; und \c bakery). Die Felder in diesem Projekt beginnen mit einer leeren Datenbank, ohne den Shop aus den anderen Lektionen:

SQLleere Datenbank

Probier es aus

Die Kategorien

Lege die Tabelle categories an: id ist der Primärschlüssel, und name ist Pflicht und darf sich nicht wiederholen (es darf nicht zwei Kategorien „Brot“ geben).

SQLleere Datenbank

Sieh es dir an

Noch einmal

Eine Tabelle mit demselben Namen lässt sich nicht noch einmal anlegen:

SQLleere Datenbank

Ein Skript, das mehr als einmal laufen darf, schreibt IF NOT EXISTS. Dann wird die vorhandene Tabelle nicht angefasst, auch wenn sie andere Spalten hat:

SQLleere Datenbank

Probier es aus

Die Produkte

Füge die Regeln von products hinzu: name ist Pflicht, category_id ist Pflicht und zeigt auf categories, price ist Pflicht und größer als 0, und stock ist Pflicht, standardmäßig 0 und darf nicht unter 0 liegen.

SQLleere Datenbank
Genauer, für Neugierige

Die Preise sind hier REAL, wie im Shop des Kurses. Ein echtes Programm für Geld speichert Cent als ganze Zahl (price_cents INTEGER) oder nutzt in PostgreSQL NUMERIC(10, 2), damit es keine Summen wie 0,1 + 0,2 = 0,30000000000000004 gibt.

Probier es aus

Die Kunden

Füge die Regeln von customers hinzu: name und email sind Pflicht, email darf sich nicht wiederholen, und city darf fehlen.

SQLleere Datenbank

Probier es aus

Die Bestellungen

Füge die Regeln von orders hinzu: customer_id ist Pflicht und zeigt auf customers, ordered_at ist Pflicht, und status ist Pflicht, standardmäßig 'new' und darf nur 'new', 'paid', 'delivered' oder 'cancelled' sein.

SQLleere Datenbank

Übung

Die Zeilen der Bestellung

Füge die Regeln von order_items hinzu: order_id zeigt auf orders, und wird die Bestellung gelöscht, werden ihre Zeilen mitgelöscht; product_id zeigt auf products; quantity ist Pflicht und größer als 0; unit_price ist Pflicht; der Primärschlüssel ist das Paar (order_id, product_id). Alle Spalten sind Pflicht.

SQLleere Datenbank

Die Idee

Die fünf Tabellen

Die Datenbank steht:

SQLleere Datenbank

Jede Regel, die du hinzugefügt hast, ist ein Fehler, den kein Programm mehr schreiben kann: ein Produkt ohne Preis, zwei Kunden mit einer E-Mail, eine Bestellung mit einem Status, den es nicht gibt. Die nächste Etappe füllt die Tabellen.

Test

Teste dich

1. Warum wird categories vor products angelegt?
2. Warum hat order_items ein unit_price, obwohl der Preis in products steht?
3. Was macht ON DELETE CASCADE in order_items?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·