In der Welt relationaler Datenbanken haben wir es mit Objekten zu tun, die untereinander in Beziehungen stehen und auf der Relationenalgebra beruhen.
In unserem Beispiel wollen wir die Stammdaten unserer Bank (unsere Kunden mit deren Anschrift etc.) von den Bewegungsdaten (Buchungen) trennen. Wir werden also 2 Tabellen anlegen und dabei gleich sagen, daß zu jedem Buchungssatz in der Buchungstabelle zwingend ein Datensatz in der Stammdatentabelle gehören muß. Dies wird als referentielle Integrität bezeichnet und garantiert uns die logische Korrektheit der Daten in unserer Datenbank.
Die Verknüpfung der beiden Tabellen erfolgt in Zeile 27.
001 --
002 -- Die Kontonummern sollen automatisch vergeben werden und ab 100000 anfangen
003 --
004 CREATE SEQUENCE seq_kontonr START WITH 100000 INCREMENT BY 1;
005
006
007 --
008 -- Diese Tabelle enthält unsere Stammdaten, also die Daten der Kontoinhaber
009 --
010
011 CREATE TABLE kunden (
012 kontonr BIGINT NOT NULL
013 PRIMARY KEY
014 DEFAULT NEXTVAL('seq_kontonr'),
015 kundenname VARCHAR NOT NULL,
016 plz CHAR(5) NOT NULL,
017 ort VARCHAR NOT NULL
018 );
019
020
021 --
022 -- Diese Tabelle enthält die einzelnen Buchungen.
023 --
024
025 CREATE TABLE buchungen (
026 kontonr BIGINT NOT NULL
027 REFERENCES kunden(kontonr),
028 ts TIMESTAMPTZ DEFAULT NOW(),
029 typ CHAR(1),
030 wert DECIMAL(10,2),
031 text VARCHAR
032 );
033
034
035 --
036 -- Indexe sind ein wichtiges Mittel zur Leistungssteigerung bei Abfragen der DB
037 -- sie beschleunigen erheblich Such- und Sortierfunktionen
038 --
039
040 CREATE UNIQUE INDEX idx_buchungen ON buchungen(kontonr,ts);
041 CREATE INDEX idx_buchungen_kontonr ON buchungen(kontonr);
042 CREATE INDEX idx_buchungen_ts ON buchungen(ts);
043
044
045 -- Demo Daten:
046 INSERT INTO kunden (kundenname, plz, ort) VALUES ('Kunde 1', 12345, 'Ort 1');
047 INSERT INTO kunden (kundenname, plz, ort) VALUES ('Kunde 2', 23456, 'Ort 2');
048 INSERT INTO kunden (kundenname, plz, ort) VALUES ('Kunde 3', 34567, 'Ort 3');
049 INSERT INTO kunden (kundenname, plz, ort) VALUES ('Kunde 4', 45678, 'Ort 4');
050 INSERT INTO kunden (kundenname, plz, ort) VALUES ('Kunde 5', 56789, 'Ort 5');
Download create.sql
CREATE TABLE CREATE INDEX Foreign keys