$ oracle-db --projekt handytarife --klasse FISI24I --gruppe 6

Handytarif
Datenbank

Oracle-Datenbank für einen Mobilfunkanbieter — Verwaltung von Kunden, Verträgen, Tarifen und Verbindungsdaten.

LF08 · FISI24IOracle SQL6 Tabellen3NFDocker
01

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

ZeichenkettenVARCHAR2
IDs / GanzzahlenNUMBER
DatumDATE
Datum + UhrzeitTIMESTAMP
Boolean (0/1)NUMBER

Tabellenübersicht

R1Kunde(7 Attribute)
R1Tarif(2 Attribute)
R1Tarifbaustein(5 Attribute)
R2Tarif_Baustein(2 Attribute)
R3Vertrag(4 Attribute)
R3Verbindung(7 Attribute)
02

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).

ER-Diagramm: Handytarif-DatenbankChen-Notation — □ Entitäten · ◇ Beziehungen · ○ AttributeKundeIDAusweisnummerVornameNachnameStrassePLZOrtTarifIDTarifbezeichnungBausteinIDBezeichnungTypWertEinheitVertragIDAbschlussdatumVerbindungIDStartzeitEndzeitPartnernummerRichtungArtKUNDEVERTRAGTARIFTARIFBAUSTEINVERBINDUNGhatgehörtzubestehtauserzeugt1N1NNM1NEntitätBeziehungAttributAttribut= Primärschlüssel1 / N / M= Kardinalität
03

Relationales Modell

Ableitung des Relationenschemas aus dem ER-Diagramm

Aus dem ER-Modell werden nach den vier Ableitungsregeln folgende Relationen gebildet.

KundeRegel 1 – Entitätstyp
(KundeID: PK; Vorname; Nachname; Strasse; PLZ; Ort; Ausweisnummer)
TarifRegel 1 – Entitätstyp
(TarifID: PK; Tarifbezeichnung)
TarifbausteinRegel 1 – Entitätstyp
(BausteinID: PK; Bezeichnung; Typ; Wert; Einheit)
Tarif_BausteinRegel 2 – N:M Beziehung
(TarifID: PK, FK; BausteinID: PK, FK)
VertragRegel 3 – 1:N Beziehung
(VertragID: PK; Abschlussdatum; KundeID: FK; TarifID: FK)
VerbindungRegel 3 – 1:N Beziehung
(VerbindungID: PK; Startzeit; Endzeit; Partnernummer; Richtung; Art; VertragID: FK)
Relationales Modell Handytarif
04

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

Projektcode.sql — DDL
-- ============================================================
-- 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

Projektcode.sql — DML
-- ============================================================
-- 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

Projektcode.sql — SELECT
-- ============================================================
-- 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;
05

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 IDENTITY statt 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

06

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

01/5
  • 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)
Zusammenfassung: 5 Entitäten · 4 Beziehungen (1:N, 1:N, N:M, 1:N) · 6 Tabellen

← → Pfeiltasten zum Navigieren