PMG1719/DB Beleg/Lea Sophie

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SQL</language>

== '''Tierheim-Datenbank''' ==

<p style="color:red">'''! ICH BRAUCHE NOCH ZEIT ! (Abgabe bis 30.01.2019, 23:59)'''</p>

== Begründung der Themenwahl ==

Man sagt es nicht umsonst: Der Hund ist der beste Freund des Menschen. Denn die Nachfrage, sich einen Vierbeiner oder ein anderes Haustier anzuschaffen ist hoch. Doch viele Interessierte orientieren sich beim Kauf im Internet oder gehen zu bestimmten Züchtern. Dabei könnte der Traumhund gleich im lokalen Tierheim sitzen!
Das Tierheim bietet die einzigartige Möglichkeit als Vermittler zwischen den Parteien zu agieren. Die Mitarbeiter kennen sowohl ihr Tiere mit ihren guten und schlechten Seiten und bemühen sich die interessierten Käufer zu analysieren. Es werden viele Informationen gesammelt und Schnittstellen gefunden. Wenn der Kunde eine Familie mit kleinen Kindern hat, so ist es von Bedeutung, ob das Tier für Familien geeignet ist. Wenn so viele Daten aufeinander treffen macht es sich gut, diese zu digitalisieren, um sich möglichst schnell einen Überblick verschaffen zu können. 


Nichts liegt da näher als die Erstellung einer benutzerfreundlichen, effizienten und zuverlässigen Datenbank.
Die Interessenten können sich informieren über die Öffnungszeiten oder das Tierheim allgemein, die Mitarbeiter des Tierheims haben eine Übersicht über alle wichtigen Daten der Kunden und Tiere und vor allem die Tiere können schnell in ein schönes neues Zuhause vermittelt werden. 

[[Bild:Lea Sophie_Dog-house.png|100px]]





== Modellierung eines ERM ==

[[Bild:Lea Sophie_ERM_(2).png|1000px]]


 == 1. Allgemeine Struktur ==

Ein ERM ist ein "Entity-Relationship-Modell", welcher der Vereinfachung einer großen Menge dient. Dabei werden diese auf ihre Grundlegendsten Bestandteile und Beziehungen zueinander heruntergebrochen. Man verschafft sich somit einen Überblick über die nötigen Tabellen und den allgemeinen Umfang. Da eine Datenbank später übersichtlich und benutzerfreundlich sein soll ist besonders auf die Anwenderfreundlichkeit zu achten. Um diesen komplexen Sachverhalt nun vereinfacht dazustellen nutzt man in der Modellierung verschiedene geometrische Formen:

  Alle '''Objekte''' (bzw. Entitäten) werden in Rechtecken dargestellt. Sie werden später als Tabellen implementiert.
  Alle '''Eigenschaften''' (bzw. Attribute) der Objekte werden in Ellipsen gefasst und mit dem zugehörigen Objekt verbunden.
  Alle '''Relationen''' (bzw. Relationships) der Objekte werden durch Rhomben verkörpert. Sie müssen nicht immer zu Tabellen werden.

 == 2. Die Kardinalitäten ==

Doch nicht jede Verbindung zwischen den Objekten ist gleich zu werten. Es gibt verschiedene Beziehungstypen - auch Kardinalität genannt.

Die '''1:1 Beziehung''' besagt, dass sich 2 Attribute GENAU einander zuordnen lassen. Somit können sie auch in EINE Tabelle gefasst werden.

Die '''1:n Beziehun'''g besagt, dass der einen Objektklasse viele Objekte zugeschrieben werden können, aber nicht umgekehrt. Ein Beispiel aus diesem Beleg ist, dass ein Interessierter sich für mehrere Hunde interessieren kann aber 
nicht umgekehrt. Der Hund wird später nur an eine Person vermittelt. Diese Beziehungen können hergestellt werden in
dem der Primärschlüssel in Form eines Fremdschlüssels in die andere Tabelle eingesetzt wird. 
An unserem Beispiel kann man dies daran erkennen, dass ein Interessent sich ein Tier reservieren kann ihn dem in der Tabelle `Tiere` der
Fremdschlüssel I_Nr (Interessenten Nummer) einsetzt wird und somit eine eindeutige Beziehung herstellt ist.

Die '''n:m Beziehung''' besagt, dass viele Objekte mit vielen anderen Objekten in Verbindung stehen. So können sich beliebig viele Menschen in beliebig vielen Tierheimen informieren. Diese komplexe 
Art der Beziehung wird in Form von einer Tabelle, welche beide Primärschlüssel enthält umgesetzt. Diese eigenständige Tabelle kann zusätzlich auch eigene Attribute enthalten.


== Erstellen eines RM ==

[[Bild:Lea Sophie_RM(2).png|1000px]]

1. Die Normalisierung:

'''Die erste Normalform (1NF)''' verlangt, dass nicht mehrere Informationen in einen Datenfeld geschrieben werden dürfen.
Dieses Problem wurde gelöst.Es gibt kein Feld in dem mehr als eine Information steht.

'''Die zweite Normalform (2NF)''' verlangt, das Änderungen einheitlich vorgenommen werden können.
Dies wird durch Primärschlüssel und die Aufsplatung großer Datensätze in kleinere Tabellen gewährleistet.

'''Die dritte Normalform (3NF)''' verlangt, dass die Primärschlüssel bei komplexen Beziehungen zwischen zwei Daten Typen in
eine extra Tabelle geschrieben werden müssen (in Form von Fremdschlüsseln). 
Auch dies wurde gelöst (Bsp. TH_Nr in Tabelle Tierheim)



== Übertragung in ein Datenbanksystem ==

1. Schritt: Tabellen erstellen

<code id="5c38475e0015d"> 
CREATE TABLE Tierheim (
  TH_Nr INTEGER,
  Name VARCHAR (30),
  Straßenname VARCHAR(25),
  Straßennummer INTEGER,
  PLZ INTEGER,
  PRIMARY KEY(TH_Nr)
);

CREATE TABLE Interessenten (
  I_Nr INTEGER,
  Name VARCHAR(255),
  Vorname VARCHAR(255),
  Familie VARCHAR(5),
  Erfahrung VARCHAR(5),
  Telefon VARCHAR(255),
  PRIMARY KEY(I_Nr)
);

CREATE TABLE Tiere (
  TH_Nr INTEGER,
  T_Nr INTEGER,
  Art VARCHAR(255),
  Name VARCHAR(255),
  Lebensalter INTEGER,
  familienfreundlich VARCHAR(5),
  anfaengergeeignet VARCHAR(5),
  Status VARCHAR(255),
  Interessent INTEGER,
  PRIMARY KEY(T_NR)
);

CREATE TABLE Oeffnungszeiten (
  TH_Nr INTEGER,
  Wochentag VARCHAR(255),
  oeffnet TIME,
  schliesst TIME,
  Status VARCHAR(255)
);

CREATE TABLE infomiert_sich (
  TH_Nr INTEGER,
  I_Nr INTEGER
);
</code>

2. Schritt: Tabellen mit Datensätzen, also "Leben" füllen

<code id="5c4a366dbfcf5">

INSERT INTO Tierheim VALUES
  (1,'Tierheim Sonnenschein', 'Hauptstraße', 32, 12345);
INSERT INTO Tierheim VALUES
  (2,'Tierheim 4 Pfoten','Friedensweg', 4, 34679);


INSERT INTO Interessenten VALUES
   (1, 'Heidelbaum', 'Olivia', 'Nein', 'Ja', 0234680);
INSERT INTO Interessenten VALUES
   (2, 'Schröder', 'Sören', 'Nein','Nein', 03466724);
INSERT INTO Interessenten VALUES
   (3, 'Morgen', 'Magdalena', 'Ja','Ja', 077996112);
INSERT INTO Interessenten VALUES
   (4, 'Husten', 'Holm', 'Nein','Ja', 03466724);
INSERT INTO Interessenten VALUES
   (5, 'von Wiesengrün', 'Walmar', 'Nein','Nein', 06430024);
INSERT INTO Interessenten VALUES
   (6, 'Schröder', 'Sören', 'Nein','Nein', 010045923);
INSERT INTO Interessenten VALUES
   (7, 'Claumann', 'Carla', 'Ja','Nein', 99753424);
INSERT INTO Interessenten VALUES
   (8, 'Engels', 'Eduart', 'Ja','Ja', 03466724);
INSERT INTO Interessenten VALUES
   (9, 'Bahn', 'Uta', 'Ja','Ja', 03466724);


INSERT INTO Tiere VALUES
   (1, 1, 'Hund', 'Bello', 3, 'Nein', 'Ja', 'reserviert',4);
INSERT INTO Tiere VALUES
   (1, 2, 'Hund', 'Maxi', 1, 'Nein', 'Nein', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (2, 3, 'Katze', 'Maumau', 2, 'Nein', 'Nein', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (2, 4, 'Wellensittich', 'Snorre', 3, 'Ja', 'Ja', 'reserviert',3);
INSERT INTO Tiere VALUES
   (2, 5, 'Schildkroete', 'Blitz', 107, 'Ja', 'Nein', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (1, 6, 'Hund', 'Doggo', 10, 'Nein', 'Ja', 'reserviert',1);
INSERT INTO Tiere VALUES
   (1, 7, 'Hund', 'Rosso', 1, 'Ja', 'Ja', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (1, 8, 'Hund', 'Wolf', 5, 'Ja', 'Nein', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (1, 9, 'Hund', 'Jumpy', 9, 'Ja', 'Ja', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (1, 10, 'Hund', 'Lexie', 1, 'Nein', 'Ja', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (2, 11, 'Kaninchen', 'Bunny', 1, 'Ja', 'Ja', 'zu vergeben',NULL);
INSERT INTO Tiere VALUES
   (1, 12, 'Hund', 'Hope', 3, 'Nein', 'Ja', 'zu vergeben',NULL);


INSERT INTO Oeffnungszeiten VALUES
(1, 'Montag', '14:00:00', '17:00:00', 'geöffnet'),
(1, 'Dienstag', '14:00:00', '17:00:00', 'geöffnet'),
(1, 'Mittwoch', '00:00:00', '00:00:00', 'geschlossen'),
(1, 'Donnerstag', '15:00:00', '18:00:00', 'geöffnet'),
(1, 'Freitag', '15:00:00', '18:00:00', 'geöffnet'),
(1, 'Samstag', '00:00:00', '00:00:00', 'geschlossen'),
(1, 'Sonntag', '00:00:00', '00:00:00', 'geschlossen'),
(2, 'Montag', '00:00:00', '00:00:00', 'geschlossen'),
(2, 'Dienstag', '12:00:00', '16:00:00', 'geöffnet'),
(2, 'Mittwoch', '12:00:00', '16:00:00', 'geöffnet'),
(2, 'Donnerstag', '12:00:00', '16:00:00', 'geöffnet'),
(2, 'Freitag', '16:00:00', '20:00:00', 'geöffnet'),
(2, 'Samstag', '12:00:00', '14:00:00', 'geöffnet'),
(2, 'Sonntag', '12:00:00', '14:00:00', 'geöffnet');
</code>

<run id="5c4a382642d1c">
</run>

== Abfragen ==

1. Aufgabe: Zeige alle Tiere.
<run id="5c4ab6b1d8731">
SELECT * FROM Tiere;
</run>

'''2.Aufgabe:''' sortiere die Tiere nach ihrem Alter (aufteigend).

<run id="5c4ab6b1d87bc">
SELECT Name, Art, Lebensalter FROM Tiere ORDER BY Lebensalter;
</run>

'''3. Aufgabe:''' Zeige alle Tiere die im Tierheim "4 Pfoten" leben.

<run id="5c4ab1ba9dc5f">
SELECT Tiere.art, Tiere.Name FROM Tiere, Tierheim WHERE Tierheim.Name = 'Tierheim 4 Pfoten' AND 
Tiere.TH_Nr = Tierheim.TH_Nr;
</run>

'''4. Aufgabe:''' Olivia Heidelbaum sucht einen geeigneten Hund für sich, der nicht älter als 2 Jahre ist.

<run id="5c4ab1ba9dc5f">
SELECT Tiere.Art, Tiere.Name, Tiere.familienfreundlich, Tiere.anfaengergeeignet, Tiere.Lebensalter
FROM Tiere, Interessenten
WHERE Tiere.Art = 'Hund' AND Tiere.Lebensalter <= 2 AND Interessenten.Name = 'Heidelbaum' AND Interessenten.Vorname = 'Olivia' 
AND Interessenten.Familie = Tiere.familienfreundlich AND Interessenten.Erfahrung = Tiere.anfaengergeeignet;
</run>

'''5. Aufgabe:''' Reserviere nun einen passenden Hund für Olivia Heidelbaum (I_Nr = 1).

<run id="5c4ab883ac8f9">
UPDATE Tiere set Status = 'reserviert', Interessent = 1 WHERE Name = 'Lexie';
SELECT Status, Interessent FROM Tiere WHERE Name = 'Lexie';
</run>

'''6. Der Wellensittich hat ein neues Zuhause gefunden. Ändere dies in seinem Datensatz (Status).
'''
<run id="5c4ab883ac97d">
UPDATE Tiere set Status = 'schon vermittelt' WHERE Art = 'Wellensittich';
SELECT Status FROM Tiere WHERE Tiere.Art = 'Wellensittich';;
</run>

'''7. Welches Tierheim hat am Mittwoch um 14:00 Uhr offen?'''

<run id="5c4ac004de654">
SELECT Tierheim.Name, Oeffnungszeiten.Wochentag, Oeffnungszeiten.oeffnet, Oeffnungszeiten.schliesst
FROM Tierheim, Oeffnungszeiten
WHERE Oeffnungszeiten.Wochentag = 'Mittwoch' AND Oeffnungszeiten.schliesst >= '14:00:00' AND Tierheim.TH_Nr = Oeffnungszeiten.TH_Nr;
</run>
----

== Kritische Reflektion ==

Ich bin der Meinung, dass diese Datenbank ein guter Beleg dafür ist, wie praktisch die Nutzung in verschiedensten 
Bereichen sein kann.

----