# Die Datenbank

Das Rückgrat ist bei manchen Politikern unterentwickelt. Vielleicht weil es so selten benutzt wird.
Margaret »Maggie« Thatcher, erste Premierministerin Großbritanniens (1979–1990)

Nun sollen erst die Datenbankstruktur und die Tabellen geplant werden.

# Datenbankstruktur planen und festlegen

Die Planung der Datenbankstruktur ist recht fix abgeschlossen. Für jede einzelne Rubrik wird einfach eine Tabelle angelegt. Da die Inhalte nur sehr wenig, bis gar keine Relationen umfassen, werden also lediglich vier verschiedene Tabellen benötigt:

  • news
    Tabelle, die die einzelnen News enthält
  • downloads
    Tabelle, die die Downloads bzw. die Pfad- und Dateinamen zu den Dateien enthält
  • links
    Tabelle, die die einzelnen Einträge für die Links enthält
  • articles
    Tabelle, die die Artikel enthält

Nun soll die Datenbank natürlich noch angelegt werden.

Falls Sie im weiteren Verlauf nicht die Muße haben sollten, die Datenbanken und Tabellen von Hand zu definieren, finden Sie auf der beiliegenden CD‑ROM im Verzeichnis x:\misc\project_db.sql eine SQL-Datei, die die Datenbank und Tabellen anlegt und mit ein paar Inhalten füllt.

Die Datenbank soll den Namen project tragen und wird mit der Anweisung

CREATE DATABASE project

erzeugt.

# Tabellenstruktur planen und erzeugen

# Planung

Als Erstes soll nun die Tabelle news geplant und angelegt werden. Zu einer richtigen Nachricht gehören ein Titel, der Text der Nachricht und ein Datum, an dem die Nachricht eingetragen wurde. Zusätzlich sollte natürlich ein Primärschlüssel für die Tabelle definiert werden, damit die einzelnen Nachrichten später auch auseinander gehalten und eindeutig identifiziert werden können. Es kann immer einmal vorkommen, dass eine Nachricht erst später oder nach einer gewissen Zeit gar nicht mehr angezeigt werden soll. Darum sollte eine zusätzliche Spalte definiert werden, mit der genau das festgelegt werden kann. Daraus ergibt sich folgende Struktur:

Feld Typ Optionen
id INT AUTO_INCREMENT PRIMARY KEY
title VARCHAR(64)
message TEXT
datetime TIMESTAMP
visible TINYINT(4)

Tabelle 2.1: Die Tabelle news

Das Feld id bildet den Primärschlüssel der Tabelle. Das Feld title enthält den Titel der Nachricht, wobei eine Zeichenanzahl vom 64 vollkommen ausreichend sein sollte. Die eigentliche Nachricht wird im Feld message gespeichert. Damit die Nachricht auch einmal etwas länger sein darf, wurde dem Feld der Typ TEXT zugewiesen. Das Datum und die Uhrzeit, als die Nachricht eingetragen wurde, wird im Feld TIMESTAMP gespeichert. Schlussendlich wird mit dem Feld visible festgelegt, ob die Nachricht zu sehen sein darf oder nicht. Um dabei für spätere Änderungen flexibel zu bleiben, bedeutet der Wert –1, dass die Nachricht nicht zu sehen ist. Jeder andere Wert, der größer als –1 ist, bedeutet, dass die Nachricht sichtbar ist.

Um die Datenbank nicht allzu stark zu belasten, habe ich mich entschlossen, in der Tabelle downloads den Pfad- und Dateinamen und nicht die Datei selbst zu speichern. Außerdem sollte ein Titel des Downloads und ein Kommentar dazu gespeichert werden, damit der Benutzer vor dem Download ein paar Informationen erhält, was er nun herunterladen will. Natürlich darf der Primärschlüssel nicht fehlen. Außerdem soll wieder festgelegt werden können, ob der Download sichtbar ist oder nicht.

Feld Typ Optionen
id INT AUTO_INCREMENT PRIMARY KEY
title VARCHAR(64)
comment TEXT
path VARCHAR(128)
filename VARCHAR(64)
datetime TIMESTAMP
visible TINYINT(4)

Tabelle 2.2: Die Tabelle downloads

Das Feld id bildet wieder den Primärschlüssel. In title kann ein Titel mit maximal 64 Zeichen hinterlegt werden und in comment eine notfalls auch längere Beschreibung des Downloads. Da die Dateien alle in einem bestimmten Verzeichnis abgelegt werden, werden der Pfadname und der Dateiname einzeln gespeichert. Dies führt zwar zu Redundanz, da der Pfad aber immer der gleiche ist, führt es nicht zwangsläufig zu Inkonsistenz. Für spätere Änderungen der Struktur bietet sich der Aufbau jedoch an. Der Pfadname (Feld path) darf maximal 128 und der Dateiname (Feld filename) maximal 64 Zeichen lang sein. Außerdem wird wieder der Zeitpunkt, an dem der Download hinzugefügt worden ist, in datetime gespeichert, und angegeben, ob der Download sichtbar sein soll oder nicht. Jeder Wert, der größer als –1 ist, bedeutet, dass der Download sichtbar ist.

Die Tabelle links benötigt als Erstes natürlich einen Primärschlüssel. Ansonsten sollen zu den einzelnen Links ein Titel, eine Beschreibung bzw. ein Kommentar und natürlich die URI gespeichert werden. Hier soll ebenso wieder festgelegt werden, ob der Eintrag sichtbar ist oder nicht.

Feld Typ Optionen
id INT AUTO_INCREMENT PRIMARY KEY
title VARCHAR(64)
uri VARCHAR(255)
comment TEXT
visible TINYINT(4)

Tabelle 2.3: Die Tabelle links

Auch bei dieser Tabelle wird im Feld id der Primärschlüssel gespeichert. Im Feld title wird der Titel des Links gespeichert, der maximal 64 Zeichen lang sein darf. In uri wird die URI gespeichert, die maximal 255 Zeichen lang sein darf. Der hohe Wert wurde gewählt, weil eine URI generell nur maximal 255 Zeichen umfassen darf. Die Beschreibung bzw. der Kommentar zum Link wird in comment gespeichert, und visible definiert wieder, ob der Link sichtbar ist oder nicht.

Wie immer wird ein Primärschlüssel benötigt. Zu jedem Artikel soll außerdem ein Titel und natürlich der Artikel selbst abgelegt werden. Auch der Zeitpunkt der Hinzufügung des Artikels wird gespeichert. Da Artikel jedoch sehr lang werden können, wird zusätzlich ein Feld benötigt, das zu einem weiterführenden Artikel verzweigt. Und – wie soll es anders sein – es soll festgelegt werden können, ob der Artikel sichtbar ist oder nicht.

Feld Typ Optionen
id INT AUTO_INCREMENT PRIMARY KEY
title VARCHAR(64)
content LONGTEXT
datetime TIMESTAMP
nextPageId INT
visible TINYINT(4)

Tabelle 2.4: Die Tabelle articles

Das Feld id nimmt wieder den Primärschlüssel auf. In title darf ein 64 Zeichen langer Titel gespeichert werden. Der eigentliche Artikel wird in content abgelegt. Damit dabei HTML-Formatierungen mit Elementen verwendet werden können und der Artikel auch mal etwas länger sein darf, wurde als Typ LONGTEXT gewählt. In visible darf wieder eine Zahl gespeichert werden, die angibt, ob der Artikel sichtbar ist oder nicht.

# Erzeugen

Die Tabellen werden mit den folgenden SQL-Anweisungen angelegt. Die SQL-Anweisung für die Tabelle news sieht so aus:

CREATE TABLE news (  
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  
  title VARCHAR(64) NOT NULL DEFAULT '',  
  message TEXT NOT NULL DEFAULT '',  
  datetime TIMESTAMP,  
  visible TINYINT(4) NOT NULL DEFAULT '0'  
)

Die SQL-Anweisung für die Tabelle downloads:

CREATE TABLE downloads (  
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  
  title VARCHAR(64) NOT NULL DEFAULT '',  
  comment TEXT NOT NULL DEFAULT '',  
  path VARCHAR(128) NOT NULL DEFAULT '',  
  filename VARCHAR(64) NOT NULL DEFAULT '',  
  datetime TIMESTAMP,  
  visible TINYINT(4) NOT NULL DEFAULT '0'  
)

Die SQL-Anweisung für die Tabelle links:

CREATE TABLE links (  
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  
  title VARCHAR(64) NOT NULL DEFAULT '',  
  uri VARCHAR(255) NOT NULL DEFAULT 'http://',  
  comment TEXT NOT NULL DEFAULT '',  
  visible TINYINT(4) NOT NULL DEFAULT '0'  
)

Die SQL-Anweisung für die Tabelle articles:

CREATE TABLE articles (  
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  
  title VARCHAR(64) NOT NULL DEFAULT '',  
  content LONGTEXT NOT NULL DEFAULT '',  
  datetime TIMESTAMP,  
  visible TINYINT(4) NOT NULL DEFAULT '0'  
)

# Erste Einträge anlegen

Damit später die Funktion des Projekts getestet werden kann, sollten Sie jetzt schon ein paar Einträge anlegen. Wie bereits gesagt: Falls Sie dies nicht alles von Hand vornehmen möchten, können Sie die Datei x:\misc\project_db.sql verwenden.

# Zusammenfassung

  • Es wird eine Datenbank namens project für die Daten verwendet.
  • Es werden vier Tabelle verwendet: news, downloads, links und articles.