PMG2426 1/DB Beleg/Emma

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SQL</language>
='''Datenbankprojekt: Tattoostudio'''= 
''➥Was ist im Trend?'' 
====Ziel der Datenbank====
----
Die Datenbank soll zeigen, welche Artists und Tattoo-Motive am beliebtesten sind. Dadurch kann man für die Zukunft besser planen, hinsichtlich Marketing und Künstler-Einsatz.
====Modellierung in einem ERM==== 
----
[[Bild:EmmErdplus.png | 750px ]]

'''Erklärung der Kardinalitäten:'''

Ein Kunde kann mehrere Tattoos bekommen, ein Tattoo gehört genau zu einem Kunden.

Ein Artist sticht viele Tattoos und ein Tattoo wird von genau einem Artist gestochen.

Ein Motiv kann mehrfach gestochen werden, aber ein Tattoo zeigt genau ein Motiv.  

====Transformation in das Relationenmodell====
----
KUNDE (''' Kunde_Nr''', Name_Kun, Geburtsdatum)

ARTIST (''' Artist_Nr''', Name_Art, Erfahrung_Jahre)

MOTIV (''' Motiv_Nr''', Motivname, Kategorie) 

TATTOO (''' Tattoo_Nr''', Datum, Preis, Körperstelle, ''Kunde_Nr, Artist_Nr, Motiv_Nr'')


'''Erklärung der Normalformen:'''

Die Datenbank befindet sich in der ersten Normalform (1NF), da alle Attribute atomar sind und jede Tabelle einen eindeutigen Primärschlüssel besitzt.

Sie erfüllt die zweite Normalform (2NF), weil alle Nicht-Schlüsselattribute vollständig vom Primärschlüssel abhängen und keine partiellen Abhängigkeiten bestehen.

Auch die dritte Normalform (3NF) ist gegeben, da keine transitiven Abhängigkeiten vorliegen und jedes Attribut ausschließlich vom jeweiligen Primärschlüssel abhängt.


====Erstellte Datenbank====
----
<code id="6979ca1e6c24a">

DROP TABLE IF EXISTS Kunde;
CREATE TABLE Kunde (
 Kunde_Nr VARCHAR NOT NULL UNIQUE,
 Name_Kun VARCHAR(50),
 Geburtsdatum DATE,
 PRIMARY KEY (Kunde_Nr)
);

DROP TABLE IF EXISTS Artist;
CREATE TABLE Artist (
 Artist_Nr VARCHAR NOT NULL UNIQUE,
 Name_Art VARCHAR(50),
 Erfahrung_Jahre INT,
 PRIMARY KEY (Artist_Nr) 
);

DROP TABLE IF EXISTS Motiv;
CREATE TABLE Motiv (
 Motiv_Nr VARCHAR NOT NULL UNIQUE,
 Motivname VARCHAR(50),
 Kategorie VARCHAR(30),
 PRIMARY KEY (Motiv_Nr)
);

DROP TABLE IF EXISTS Tattoo;
CREATE TABLE Tattoo (
 Tattoo_Nr VARCHAR NOT NULL UNIQUE,
 Datum DATE,
 PREIS DECIMAL (6,2),
 Koerperstelle VARCHAR(30),
 Kunde_Nr VARCHAR NOT NULL,
 Artist_Nr VARCHAR NOT NULL,
 Motiv_Nr VARCHAR NOT NULL,
 PRIMARY KEY (Tattoo_Nr),
 FOREIGN KEY (Kunde_Nr) REFERENCES Kunde(Kunde_Nr),
 FOREIGN KEY (Artist_Nr) REFERENCES Artist(Artist_Nr),
 FOREIGN KEY (Motiv_Nr) REFERENCES Motiv(Motiv_Nr)
);
 

INSERT INTO Kunde VALUES ('1', 'Lisa Müller', '2003-05-12');
INSERT INTO Kunde VALUES ('2', 'Marielle Pupshaus', '2005-04-08');
INSERT INTO Kunde VALUES ('3', 'Luis Pfeiffer', '2001-09-25');
INSERT INTO Kunde VALUES ('4', 'Erna Heinz', '1967-11-29');

INSERT INTO Artist VALUES ('1', 'Max', 8);
INSERT INTO Artist VALUES ('2', 'Sarah', 6);
INSERT INTO Artist VALUES ('3', 'Unicorn', 7);

INSERT INTO Motiv VALUES ('1', 'Rose', 'Blume');
INSERT INTO Motiv VALUES ('2', 'Löwe', 'Tier');
INSERT INTO Motiv VALUES ('3', 'Dynamo Dresden', 'Vereinslogo');

INSERT INTO Tattoo VALUES ('1', '2025-01-10', 180.00, 'Unterarm', '1','1','1');
INSERT INTO Tattoo VALUES ('2', '2026-01-15', 240.00, 'Bein', '2','3','3');
INSERT INTO Tattoo VALUES ('3', '2025-11-23', 348.00, 'Rücken', '3','1','2');
INSERT INTO Tattoo VALUES ('4', '2025-12-13', 120.00, 'Handgelenk', '4','2','1');





</code>



====Verschiedene Abfragen====
----
Welche Informationen gibt es über Artist Nummer 1? 
<run id="69824ce50a1e5">

SELECT * FROM Artist
WHERE Artist_Nr = 1

</run>

Oben ist zusehen, welcher Artist am beliebtesten ist: 
<run id="6979ca1e6c2b8">

SELECT COUNT(*) AS Anzahl, Tattoo.Artist_Nr, Name_Art
FROM Tattoo, Artist
WHERE Tattoo.Artist_Nr = '1' AND Artist.Artist_Nr = Tattoo.Artist_Nr;

SELECT COUNT(*) AS Anzahl, Tattoo.Artist_Nr, Name_Art
FROM Tattoo, Artist
WHERE Tattoo.Artist_Nr = '2' AND Artist.Artist_Nr = Tattoo.Artist_Nr;

SELECT COUNT(*) AS Anzahl, Tattoo.Artist_Nr, Name_Art
FROM Tattoo, Artist 
WHERE Tattoo.Artist_Nr = '3' AND Artist.Artist_Nr = Tattoo.Artist_Nr;



</run>

Oben ist zu sehen, welches Motiv am meisten gestochen wurde:
<run id="69824c7686995">

SELECT COUNT (*) AS Anzahl, Tattoo.Motiv_Nr, Motiv. Motivname 
FROM Tattoo, Motiv
WHERE Tattoo.Motiv_Nr = '1' AND Motiv.Motiv_Nr = Tattoo.Motiv_Nr;

SELECT COUNT (*) AS Anzahl, Tattoo. Motiv_Nr, Motiv. Motivname 
FROM Tattoo, Motiv
WHERE Tattoo.Motiv_Nr = '2' AND Motiv. Motiv_Nr = Tattoo. Motiv_Nr;

SELECT COUNT (*) AS Anzah1, Tattoo. Motiv_Nr, Motiv. Motivname
FROM Tattoo, Motiv
WHERE Tattoo.Motiv_Nr = '3' AND Motiv.Motiv_Nr = Tattoo. Motiv_Nr;

</run>

Zu welcher Kategorie gehört das Motiv Löwe? 
<run id="698306156fe42">
SELECT Kategorie FROM Motiv 
WHERE Motivname = 'Löwe'

</run>

Welche Kunden hatten wann einen Tattoo-Termin? 
<run id="6983067bda5c1">
SELECT Kunde.Name_Kun, Tattoo.Datum
FROM Kunde, Tattoo
WHERE Kunde.Kunde_Nr = Tattoo.Kunde_Nr; 

</run>


====Reflexion====
----
Die Datenbank für das Tattoostudio wurde bewusst einfach und übersichtlich gestaltet, um die grundlegenden Konzepte der relationalen Datenbankmodellierung zu demonstrieren. Jeder Kunde wird dabei nur einmal in der Tabelle Kunde gespeichert, und jedes Tattoo ist genau einem Kunden, einem Artist und einem Motiv zugeordnet. Diese Struktur ist leicht verständlich und sorgt für eine hohe Datenintegrität.

Allerdings ist das System stark monoton und auf eine geringe Komplexität ausgelegt. Erweiterungen wie mehrere gleichzeitige Termine pro Kunde, Wartelisten oder Stornierungen würden das aktuelle Modell schnell an seine Grenzen bringen. Auch umfangreiche Auswertungen oder Analysen zur langfristigen Kundenbindung oder Auslastung der Artists sind mit der jetzigen Struktur nur eingeschränkt möglich.

Die Datenbank entspricht allen Normalformen. Alle Attribute sind atomar, in jeder Tabelle gibt es einen eindeutigen Primärschlüssel, alle Nicht-Schlüsselattribute hängen vollständig vom Primärschlüssel ab, und es bestehen keine transitiven Abhängigkeiten. Dadurch werden Redundanzen vermieden und die Datenintegrität gewährleistet.

Die Wahl der Datentypen und Fremdschlüssel wurde ebenfalls kritisch betrachtet. Die Primär- und Fremdschlüssel wurden ursprünglich als VARCHAR umgesetzt, können aber auch als INT effizienter sein. Durch die Verwendung von NOT NULL bei den Fremdschlüsseln wird sichergestellt, dass jedes Tattoo zwingend einem Kunden, Artist und Motiv zugeordnet ist, was die Konsistenz der Daten weiter erhöht.

Zusammenfassend eignet sich die Datenbank sehr gut für kleine Tattoostudios oder zu Lernzwecken. Bei wachsender Komplexität oder größeren Datenmengen würde das Modell jedoch an seine Grenzen stoßen, und Anpassungen wären erforderlich, um Flexibilität und Performance zu gewährleisten.

====Quellen====
----
https://www.w3schools.com/sql/sql_count.asp
https://erdplus.com/