PMG-Bautzen/Datenbankbeleg/Astrid
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>SQL</language>
== Thema der Datenbank ==
Abgebildet ist die Datenbank eines Besitzer mehrerer Supermärkte, die zu einer Kette gehören, um den Überblick über Personal etc. zu behalten.
== Entity-Relationship-Modell ==
[[Bild:Fastfood.jpeg|Miniatur|750px]]
== Relationenmodell ==
Personal ('''P_Nr''', ''S_Nr'', Name, Vorname, Straße, PLZ, Hausnummer, Lohn)
Standort ('''S_Nr''', ''P_Nr'', Straße, PLZ, Hausnummer)
Produkte ('''Pr-Nr''', Preis, Zusatzstoffe, Produktbeschreibung)
bietet an (<u>'''S_Nr, Pr_Nr'''</u>, Preis)
Zulieferer ('''Z-Nr''', Lieferprodukt, PLZ, Straße, Hausnummer)
liefert an (<u>'''S_Nr, Z-Nr'''</u>, Lieferdatum)
PLZ (<u>'''PLZ, Ort'''</u> )
'''Legende:'''
Fett: Primärschlüssel
kursiv: Fremdschlüssel
unterstrichen: doppelter Primärschlüssel
'''Erste Normalform:''' Nur eine Information pro Feld
'''Zweite Normalform:''' Trennung der Tabellen nach ihren Kardinalitäten (1:1-Beziehung wird in eine Tabelle zusammengeführt) und Einführung von Fremdschlüsseln.
'''Dritte Normalform:''' keine Abhängigkeit einzelner Attribute außer vom Primärschlüssel.
:'''Kardinalitäten''': Sind Beziehungstypen, die die einzelnen Entitys miteinander verbinden.
:1:1-Beziehung: Jedem Attribut der Entitymenge A wird genau ein Attribut der Entitymenge B zugeordnet und andersrum.
:1:n-beziehung: Jedem Attribut der Entitymenge A werden mehrere Attribute der Entitymenge B zugeordnet, umgekehrt jedoch nur 1 aus B zu einem aus A. Beim Überführen in das Relationenmodell wird der Primärschlüssel der ersten Entitymenge als Fremdschlüssel in die zweite Entitymenge eingeführt.
:n:m-Beziehung: Jedem Attribut der Entitymenge A werden mehrere Attribute der Entitymenge B zugeordnet. Beim Überführen in das Relationenmodell entsteht eine neue Tabelle. Diese enthält beide Primärschlüssel der Entitymengen als Fremdschlüssel.
Im Nachhinein ist mir noch eingefallen, dass nach Transformationsregel 1 jede Information in ein extra Feld gehört und die Hausnummer extra aufgeführt werden sollte.
Auch ist die Postleitzahl vom Ort abhängig und sollte in eine extra Tabelle eingefügt werden. Das hab ich leider im ERM nicht berücksichtig und werde erst im Nachhinein eine extra Tabelle für Ort und PLZ anlegen, da sonst die dritte Normalform nicht erfüllt ist.
== Datenbank ==
Damit der Besitzer sehen kann, welcher Angestellte an Standort 100 arbeitet.
<code id="4d2d949fb0746">
DROP TABLE IF EXISTS Personal;
CREATE TABLE Personal (
P_Nr varchar(255),
S_Nr varchar(255),
Name varchar(255),
Vorname varchar(255),
PLZ varchar(255),
Straße varchar(255),
Lohn varchar (255),
Hausnummer varchar (255)
);
INSERT INTO Personal VALUES ('001', '100', 'Franz', 'Werner', '01259', 'Ottostr', '1345,56', '12');
INSERT INTO Personal VALUES ('002', '101', 'Bert', 'Kuni', '02625', 'Bismarkstr', '1754,97', '10');
INSERT INTO Personal VALUES ('003', '100', 'Hummel', 'Elfriede', '02222', 'Nr.', '400,00', '5');
INSERT INTO Personal VALUES ('004', '107', 'Stramm', 'Berta', '01226', 'Heideweg', '954,97', '7');
INSERT INTO Personal VALUES ('010', '101', 'Bunt', 'Sebastian', '02625', 'Reichenstr', '2010,45', '17');
</code>
<code id="4d2d969a658a5">DROP TABLE IF EXISTS Standort;
CREATE TABLE Standort (
S_Nr varchar(255),
PLZ varchar(255),
Straße varchar(255),
Hausnummer varchar (255)
);
INSERT INTO Standort VALUES ('100', '01259', 'Kleinwelkaer Straße', '26');
INSERT INTO Standort VALUES ('101', '02625', 'Neusalzaer Straße', '43');
INSERT INTO Standort VALUES ('107', '02223', 'Baumallee', '5');
</code>
<run id="4d2d949fb086e">
select Name, Vorname from Standort,Personal where Standort.S_Nr=Personal.S_Nr and S_Nr='100' ;
</run>
So sieht der besitzer, was für eine Hausnummer und Personalnummer die Mitarbeiter haben, die an Standort 107 arbeiten.
<run id="4d2d969a659df">
select Hausnummer, P_Nr, S_Nr from Standort,Personal where Standort.S_Nr=Personal.S_Nr and S_Nr='107';
</run>
<code id="4d4003874f61f">DROP TABLE IF EXISTS Produkte;
CREATE TABLE Produkte (
Pr_Nr varchar(255),
Preis varchar(255),
Zusatzstoffe varchar(255),
Produktbeschreibung varchar(255)
);
INSERT INTO Produkte VALUES ('210', '4,40', 'Backtriebmittel', 'Hefekranz');
INSERT INTO Produkte VALUES ('245', '1,00', 'Antioxidationsmittel', 'Dosencocktailfrüchte');
INSERT INTO Produkte VALUES ('207', '3,97', 'Emulgator', 'Milch');
INSERT INTO Produkte VALUES ('253', '5,90', 'Farbstoffe', 'Margarine');
INSERT INTO Produkte VALUES ('266', '2,42', 'Konservierungsstoffe', 'Wurst');</code>
<run id="4d400591768ba"></run>
<code id="4d40059176786">
DROP TABLE IF EXISTS bietet_an;
CREATE TABLE bietet_an (
S_Nr varchar(255),
P_Nr varchar(255),
Preis varchar(255),
);
INSERT INTO bietet_an VALUES ('100', '210', '4,40');
INSERT INTO bietet_an VALUES ('101', '245', '1,00');
INSERT INTO bietet_an VALUES ('107', '207', '3,97');
INSERT INTO bietet_an VALUES ('100', '253', '5,90');
INSERT INTO bietet_an VALUES ('107', '266', '2,42');
</code>
<run id="4d400797d7b58"></run>
<code id="4d4009a924007">DROP TABLE IF EXISTS Zulieferer;
CREATE TABLE Zulieferer (
Z_Nr varchar(255),
Lieferprodukt varchar(255),
PLZ varchar(255),
Straße varchar (255)
);
INSERT INTO Zulieferer VALUES ('301', 'Hefekrank', '01236', 'Seeweg');
INSERT INTO Zulieferer VALUES ('302', 'Müsli', '06521', 'Parkstraße');
INSERT INTO Zulieferer VALUES ('303', 'Schokolade', '07654', 'Schlossallee');
INSERT INTO Zulieferer VALUES ('303', 'Margarine', '09346', 'Turmstraße');
INSERT INTO Zulieferer VALUES ('304', 'Milch', '19485', 'Chausseestraße');</code>
<run id="4d4009a92414b"></run>
<code id="4d400b4fc387b">DROP TABLE IF EXISTS liefert_an;
CREATE TABLE liefert_an (
Z_Nr varchar (255),
S_Nr varchar(255)
);
INSERT INTO liefert_an VALUES ('301', '101');
INSERT INTO liefert_an VALUES ('302', '107');
INSERT INTO liefert_an VALUES ('303', '100');
INSERT INTO liefert_an VALUES ('303', '107');
INSERT INTO liefert_an VALUES ('304', '101');</code>
<run id="4d400b4fc39d6"></run>
So sieht der Besitzer, welche Mitarbeiter aus dem Ort mit der PLZ 02625 kommen und an welchem Standort diese arbeiten.
<code id="4d49340411361">DROP TABLE IF EXISTS PLZ;
CREATE TABLE PLZ (
PLZ varchar (255),
ORT varchar(255)
);
INSERT INTO PLZ VALUES ('01259', 'Dresden');
INSERT INTO PLZ VALUES ('02625', 'Bautzen');
INSERT INTO PLZ VALUES ('02222', 'Doosdorf');
INSERT INTO PLZ VALUES ('01226', 'Dresden');
INSERT INTO PLZ VALUES ('02223', 'Berlin');
INSERT INTO PLZ VALUES ('01236', 'Dresden');
INSERT INTO PLZ VALUES ('06521', 'Köln');
INSERT INTO PLZ VALUES ('07654', 'Leipzig');
INSERT INTO PLZ VALUES ('09346', 'Düsseldorf');
INSERT INTO PLZ VALUES ('19485', 'Kaiserslautern')</code>
<run id="4d493404114ae"> Select Name, Vorname, S_Nr from PLZ, Personal where PLZ.PLZ=Personal.PLZ and PLZ='02625';</run>
----
'''Fazit'''
Ich hätte bei der Erstellung des ERM gründlicher über die Beziehungen und die Abhängigkeiten untereinander nachdenken sollen, dass würde das bestimmt anders aussehen.
Als Erweiterung könnte man noch sowas wie Rabattaktionen einführen oder bisherige Beschwerden von Kunden oder Produkte aufführen, die man auf Grund von Mängeln zurückrufen musste.
Aber im Großen und Ganzen bin ich mit meiner Arbeit nicht gerade unzufrieden.