Projektübersicht
Beschreibung der Datenbank
Aufgabenstellung
Ein Mobilfunkanbieter benötigt ein relationales Datenbanksystem zur Verwaltung von Kunden, Verträgen, Tarifen und Verbindungsdaten. Die Datenbank soll in der 3. Normalform vorliegen.
Anforderungen
- ▸ Kunden mit Name, Adresse, Ausweisdaten
- ▸ Kunde kann mehrere Verträge abschließen
- ▸ Vertrag hat genau einen Tarif
- ▸ Tarif besteht aus mehreren Tarifbausteinen
- ▸ Vollständige Verbindungsdaten pro Vertrag
Oracle-Datentypen
Tabellenübersicht
ER-Modell
Entity-Relationship-Diagramm in Chen-Notation
Das ER-Diagramm zeigt alle Entitäten, ihre Attribute und die Beziehungen zwischen ihnen mit den jeweiligen Kardinalitäten. Die Notation folgt dem Chen-Standard (Rechtecke = Entitäten, Rauten = Beziehungen, Ellipsen = Attribute).
Relationales Modell
Ableitung des Relationenschemas aus dem ER-Diagramm
Aus dem ER-Modell werden nach den vier Ableitungsregeln folgende Relationen gebildet.
SQL-Skript
Oracle DDL, DML und SELECT-Abfragen
Das vollständige SQL-Skript für Oracle. Es enthält CREATE TABLE Anweisungen (DDL), Beispieldaten (INSERT) und drei aussagekräftige SELECT-Abfragen.
DDL— CREATE TABLE
-- ============================================================
-- DDL: CREATE TABLE Statements (Oracle)
-- ============================================================
CREATE TABLE Kunde (
KundeID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
Vorname VARCHAR2(50) NOT NULL,
Nachname VARCHAR2(50) NOT NULL,
Strasse VARCHAR2(100) NOT NULL,
PLZ VARCHAR2(10) NOT NULL,
Ort VARCHAR2(50) NOT NULL,
Ausweisnummer VARCHAR2(20) NOT NULL UNIQUE
);
CREATE TABLE Tarif (
TarifID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
Tarifbezeichnung VARCHAR2(100) NOT NULL
);
CREATE TABLE Tarifbaustein (
BausteinID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
Bezeichnung VARCHAR2(100) NOT NULL,
Typ VARCHAR2(30) NOT NULL,
Wert NUMBER(10, 2) NOT NULL,
Einheit VARCHAR2(20) NOT NULL
);
-- N:M Beziehungstabelle
CREATE TABLE Tarif_Baustein (
TarifID NUMBER NOT NULL,
BausteinID NUMBER NOT NULL,
CONSTRAINT pk_tarif_baustein PRIMARY KEY (TarifID, BausteinID),
CONSTRAINT fk_tb_tarif FOREIGN KEY (TarifID) REFERENCES Tarif(TarifID),
CONSTRAINT fk_tb_bstein FOREIGN KEY (BausteinID) REFERENCES Tarifbaustein(BausteinID)
);
CREATE TABLE Vertrag (
VertragID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
Abschlussdatum DATE NOT NULL,
KundeID NUMBER NOT NULL,
TarifID NUMBER NOT NULL,
CONSTRAINT fk_vertrag_kunde FOREIGN KEY (KundeID) REFERENCES Kunde(KundeID),
CONSTRAINT fk_vertrag_tarif FOREIGN KEY (TarifID) REFERENCES Tarif(TarifID)
);
CREATE TABLE Verbindung (
VerbindungID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
Startzeit TIMESTAMP NOT NULL,
Endzeit TIMESTAMP NOT NULL,
Partnernummer VARCHAR2(20) NOT NULL,
Richtung VARCHAR2(20) NOT NULL CHECK (Richtung IN ('eingehend', 'ausgehend')),
Art VARCHAR2(10) NOT NULL CHECK (Art IN ('Gespraech', 'SMS')),
VertragID NUMBER NOT NULL,
CONSTRAINT fk_verbindung_vertrag FOREIGN KEY (VertragID) REFERENCES Vertrag(VertragID)
);DML— INSERT INTO
-- ============================================================
-- DML: INSERT Statements (Beispieldaten)
-- ============================================================
-- Kunden
INSERT INTO Kunde (KundeID, Vorname, Nachname, Strasse, PLZ, Ort, Ausweisnummer)
VALUES (1, 'Max', 'Mustermann', 'Hauptstr. 1', '10115', 'Berlin', 'DE123456789');
INSERT INTO Kunde (KundeID, Vorname, Nachname, Strasse, PLZ, Ort, Ausweisnummer)
VALUES (2, 'Anna', 'Schmidt', 'Gartenweg 7', '20095', 'Hamburg', 'DE987654321');
INSERT INTO Kunde (KundeID, Vorname, Nachname, Strasse, PLZ, Ort, Ausweisnummer)
VALUES (3, 'Lukas', 'Weber', 'Roemerstr. 22', '50667', 'Koeln', 'DE111222333');
INSERT INTO Kunde (KundeID, Vorname, Nachname, Strasse, PLZ, Ort, Ausweisnummer)
VALUES (4, 'Sophie', 'Braun', 'Bahnhofstr. 15', '80331', 'Muenchen', 'DE444555666');
-- Tarife
INSERT INTO Tarif (TarifID, Tarifbezeichnung) VALUES (1, 'Basis-Tarif');
INSERT INTO Tarif (TarifID, Tarifbezeichnung) VALUES (2, 'Comfort-Tarif');
INSERT INTO Tarif (TarifID, Tarifbezeichnung) VALUES (3, 'Premium-Flatrate');
-- Tarifbausteine
INSERT INTO Tarifbaustein VALUES (1, 'Freiminuten', 'Freiminuten', 100, 'min');
INSERT INTO Tarifbaustein VALUES (2, 'SMS-Preis', 'SMS-Preis', 0.09, 'EUR');
INSERT INTO Tarifbaustein VALUES (3, 'Daten-Flatrate', 'Flatrate', 0, 'unbegrenzt');
INSERT INTO Tarifbaustein VALUES (4, 'Gespraech-Preis', 'Preis/min', 0.19, 'EUR');
INSERT INTO Tarifbaustein VALUES (5, 'Freiminuten Plus','Freiminuten', 500, 'min');
-- N:M Verknuepfung Tarif <-> Tarifbaustein
INSERT INTO Tarif_Baustein VALUES (1, 1); -- Basis: 100 Freiminuten
INSERT INTO Tarif_Baustein VALUES (1, 2); -- Basis: SMS-Preis
INSERT INTO Tarif_Baustein VALUES (1, 4); -- Basis: Gespraech-Preis
INSERT INTO Tarif_Baustein VALUES (2, 5); -- Comfort: 500 Freiminuten
INSERT INTO Tarif_Baustein VALUES (2, 2); -- Comfort: SMS-Preis
INSERT INTO Tarif_Baustein VALUES (3, 3); -- Premium: Daten-Flatrate
INSERT INTO Tarif_Baustein VALUES (3, 5); -- Premium: 500 Freiminuten
-- Vertraege
INSERT INTO Vertrag VALUES (1, TO_DATE('2024-01-15', 'YYYY-MM-DD'), 1, 1);
INSERT INTO Vertrag VALUES (2, TO_DATE('2024-03-01', 'YYYY-MM-DD'), 1, 3);
INSERT INTO Vertrag VALUES (3, TO_DATE('2024-02-20', 'YYYY-MM-DD'), 2, 2);
INSERT INTO Vertrag VALUES (4, TO_DATE('2024-04-10', 'YYYY-MM-DD'), 3, 3);
INSERT INTO Vertrag VALUES (5, TO_DATE('2024-05-05', 'YYYY-MM-DD'), 4, 1);
-- Verbindungen
INSERT INTO Verbindung VALUES (1, TIMESTAMP '2024-06-01 10:00:00', TIMESTAMP '2024-06-01 10:05:30',
'+491701234567', 'ausgehend', 'Gespraech', 1);
INSERT INTO Verbindung VALUES (2, TIMESTAMP '2024-06-01 14:20:00', TIMESTAMP '2024-06-01 14:20:00',
'+491729876543', 'ausgehend', 'SMS', 1);
INSERT INTO Verbindung VALUES (3, TIMESTAMP '2024-06-02 09:15:00', TIMESTAMP '2024-06-02 09:25:45',
'+491601112233', 'eingehend', 'Gespraech', 2);
INSERT INTO Verbindung VALUES (4, TIMESTAMP '2024-06-02 18:00:00', TIMESTAMP '2024-06-02 18:03:10',
'+491754445566', 'ausgehend', 'Gespraech', 3);
INSERT INTO Verbindung VALUES (5, TIMESTAMP '2024-06-03 07:30:00', TIMESTAMP '2024-06-03 07:30:00',
'+491777778888', 'eingehend', 'SMS', 4);
COMMIT;SELECT— Abfragen
-- ============================================================
-- SELECT-Abfragen
-- ============================================================
-- 1. Alle Vertraege eines Kunden mit Tarifinformation
SELECT
k.Vorname,
k.Nachname,
v.VertragID,
TO_CHAR(v.Abschlussdatum, 'DD.MM.YYYY') AS Abschlussdatum,
t.Tarifbezeichnung
FROM Kunde k
JOIN Vertrag v ON k.KundeID = v.KundeID
JOIN Tarif t ON v.TarifID = t.TarifID
ORDER BY k.Nachname, v.Abschlussdatum;
-- 2. Alle Verbindungen von Kunde 1 (Max Mustermann)
SELECT
k.Vorname,
k.Nachname,
TO_CHAR(vb.Startzeit, 'DD.MM.YYYY HH24:MI:SS') AS Startzeit,
TO_CHAR(vb.Endzeit, 'DD.MM.YYYY HH24:MI:SS') AS Endzeit,
vb.Partnernummer,
vb.Richtung,
vb.Art
FROM Kunde k
JOIN Vertrag v ON k.KundeID = v.KundeID
JOIN Verbindung vb ON v.VertragID = vb.VertragID
WHERE k.KundeID = 1
ORDER BY vb.Startzeit;
-- 3. Tarifbausteine des Premium-Tarifs
SELECT
t.Tarifbezeichnung,
tb.Bezeichnung,
tb.Typ,
tb.Wert,
tb.Einheit
FROM Tarif t
JOIN Tarif_Baustein trb ON t.TarifID = trb.TarifID
JOIN Tarifbaustein tb ON trb.BausteinID = tb.BausteinID
WHERE t.TarifID = 3
ORDER BY tb.Typ;Reflexion
Herausforderungen und Lerneffekte
Herausforderungen beim DB-Design
- ▸Die N:M-Beziehung zwischen Tarif und Tarifbaustein erforderte eine explizite Beziehungstabelle (Tarif_Baustein).
- ▸Die korrekte Reihenfolge beim Erstellen der Tabellen musste wegen Fremdschlüssel-Abhängigkeiten beachtet werden.
- ▸Das Einhalten der 3. Normalform machte mehrere Umstrukturierungen des initialen Entwurfs notwendig.
Herausforderungen bei Oracle
- ▸Oracle unterscheidet sich in Syntax-Details von anderen DBMS: z.B. TIMESTAMP-Literals,
GENERATED BY DEFAULT AS IDENTITYstatt AUTO_INCREMENT. - ▸Das Aufsetzen von Oracle via Docker erforderte die korrekte Konfiguration von Ports, Volumes und dem initialen Passwort-Setup.
- ▸CHECK-Constraints für Richtung und Art stellten die Datenintegrität ohne Boolean-Typ sicher.
Lerneffekte
- ▸Praktisches Verständnis für die Ableitung von Relationen aus ER-Diagrammen nach den vier Regeln.
- ▸Erfahrung mit Oracle-spezifischen Datentypen und Syntax.
- ▸Vertiefung von JOIN-Abfragen über mehrere Tabellen mit aussagekräftigen Ergebnissen.
Docker-Setup
# Oracle Image pullen
docker pull gvenzl/oracle-free
# Container starten
docker run -d \
--name oracle-handytarif \
-p 1521:1521 \
-e ORACLE_PASSWORD=geheim \
gvenzl/oracle-free
Präsentation
5-Minuten Projekt-Walkthrough
Klicke durch alle Abschnitte des Projekts oder nutze die Pfeiltasten zur Navigation. Jede Folie fasst einen Aspekt der Datenbank zusammen.
Einleitung
Datenbankprojekt LF08 · 2025 · Gruppe 6
- ▶Thema: Datenbank für einen Mobilfunkanbieter
- ▶Verwaltung von Kunden, Verträgen, Tarifen und Verbindungsdaten
- ▶Technologie: Oracle Database (bereitgestellt via Docker)
- ▶Ziel: vollständiges DB-Design in der 3. Normalform (3NF)
- ▶Abgabe: ER-Modell, relationales Modell, SQL-Skript (DDL + DML + SELECT)
← → Pfeiltasten zum Navigieren