# Entity-Relationship-Modell (ERM) Zum Einstieg werden im Folgenden einige Begriffe rund um das Thema erläutert. [^ERM] [^ERM]: Definition der Grundbegriffe in Anlehnung an den Wikipedia-Artikel [Entity-Relationship-Modell](https://de.wikipedia.org/wiki/Entity-Relationship-Modell) ## Grundbegriffe Entity-Relationship-Modell ~ ist ein Modell zur Darstellung von Objekten (Entitäten) mit Eigenschaften (Attribute) und der Beziehungen (Relationship) zwischen den Objekten. Darstellung der Elemente: ```graphviz graph ERM { layout=neato node [shape=box] Entity [pos="-2,0!"] node [shape=ellipse] attribute [pos="0,0!"] node [shape=diamond fontsize=8] Relationship [pos="2,0!"] } ``` Entität (engl. Entity) ~ individuell identifizierbares Objekt der Wirklichkeit :::info **Beispiel:** Ein Autor, Ein Buch, Ein Verlag ::: ```graphviz graph ER_Entity { layout=neato node [shape=box] Autor [pos="-2,0!"] Verlag [pos="2,0!"] Buch [pos="0,0!"] } ``` Attribut (engl. attribute) ~ Eigenschaften einer Entität (oder Beziehung) :::info **Beispiel:** Alter eines Autors, Name eines Autors, Name eines Buchs ::: ```graphviz graph ERM_attribute { layout=neato node [shape=box] Autor [pos="0,0!"] node [shape=ellipse] Alter [pos="0,1!"] Name [pos="1,1!"] Autor -- {Name , Alter } } ``` Beziehung (engl. Realtionship) ~ Zusammenhang zwischen Entitäten ~ z. B. Ein Buch hat ein Titelbild, Ein Verlag verlegt Bücher Kardinalität ~ beschreibt wie viele Beziehungen zwischen den Entitäten bestehen: * 1:1-Beziehung z. B. Ein Buch hat ein Titelbild ```graphviz graph ERM_Relationship_1_1 { layout=neato node [shape=box] Buch [pos="0,2!"] Titelbild [pos="3,2!"] node [shape=diamond fontsize=8] hat [pos="1.5,2!"] Buch -- hat [label="1"] Titelbild -- hat [label="1"] } ``` * 1:n-Beziehung z. B. Ein Verlag verlegt n Bücher ```graphviz graph ERM_Relationship_1_n { layout=neato node [shape=box] Verlag [pos="0,2!"] Buch [pos="3,2!"] node [shape=diamond fontsize=8] verlegt [pos="1.5,2!"] Verlag -- verlegt [label="1"] Buch -- verlegt [label="n"] } ``` * n:m-Beziehung z. B. Viele (n) Autoren schreiben viele (m) Bücher ```graphviz graph ERM_Relationship_n_m { layout=neato node [shape=box] Autor [pos="0,2!"] Buch [pos="3,2!"] node [shape=diamond fontsize=8] schreibt [pos="1.5,2!"] Autor -- schreibt [label="n"] Buch -- schreibt [label="m"] } ``` ## ER-Modell in Tabellen * Für jeden Entitätstyp wird eine Tabelle definiert. * Für jeden N:M Beziehungstyp wid eine Tabelle benötigt, die die Attribute des Beziehungstyps und je einen Fremschlüssel für die beteiligten Entitätstypen enthält. * 1:N Beziehungstypen werden umgesetzt, indem der Primärschlüssel der 1-Seite in die Tabelle der N-Seite als Fremdschlüssel eingetragen wird. * Bei 1:1 Beziehungstypen gibt es mehrere Möglichkeiten. * die einfachste Möglichkeit : Beide Entitätstypen werden zu einer Relation zusammengefasst * Umsetzung mit 2 Tabellen. Den Primärschlüssel der einen Tabelle als Fremdschlüssel in die andere Tabelle eingetragen ```graphviz graph ERM_attribute { layout=neato node [shape=box] Kunde [pos="1,3!"] node [shape=ellipse] Vorname [pos="0,4!"] Nachname [pos="0,2!"] Land [pos="3,4!"] KundenNr [pos="3,2!"] Kunde -- {Vorname , Nachname, Land, KundenNr } } ``` (Beispiel RM) ```graphviz graph ERM_attribute { rankdir="LR" node [shape=box] Kunde node [shape=ellipse] Vorname Nachname Land KundenNr [label = <<u>KundenNr</u>>] Kunde -- {Vorname , Nachname, Land, KundenNr } } ``` Tabelle Kunde | KundenNr | Vorname | Nachname | Land | | -------- | -------- | -------- |------------- | | 0001 | Person1 | Person1 | Deutschland | | 0002 | Person2 | Person2 | Deutschland | #### N:M - Beziehung ```graphviz graph ERM_Relationship_1_n { layout=neato node [shape=box] Mitarbeiter [pos="-3,3!"] Kunde [pos="3,3!"] node [shape=ellipse] MitarbeiterNr [pos="-3,4!"] Name [pos="-1,4!"] node [shape=ellipse] KundenNr [pos="1,4!"] KundenName [pos="3,4!"] node [shape=diamond fontsize=8] betreut [pos="0,3!"] Mitarbeiter -- betreut [label="N"] Kunde -- betreut [label="M"] Mitarbeiter -- {MitarbeiterNr, Name} Kunde -- {KundenNr, KundenName} } ``` Tabelle Mitarbeiter | MitarbeiterNr | Name | ...| | ------------- | ------------|----| | 01 | Mitarbeiter1| | | 02 | Mitarbeiter2| | Tabelle Kunde | KundeNr | Name | ...| | ------------- | ------------|----| | 0001 | Kunde1 | | | 0002 | Kunde2 | | Tabelle Kundenbetreuung | MitarbeiterNr | KundeNr | ...| | ------------- | ------------|----| | 02 |0001 | | | 01 |0002 | | | 02 |0002 | | | 23 |0963 | | | ... | | | MitarbeiterNr und KundeNr bilden den Primärschlüssel der Tabelle Kundenbetreuung #### 1:N - Beziehung ```graphviz graph ERM_Relationship_1_n { layout=neato node [shape=box] Kunde [pos="-3,3!"] Auftrag [pos="3,3!"] node [shape=ellipse] KundenNr [pos="-3,4!"] Name [pos="-1,4!"] node [shape=ellipse] AuftragNr [pos="1,4!"] Auftragsdatum [pos="3,4!"] node [shape=diamond fontsize=8] erteilt [pos="0,3!"] Kunde -- erteilt [label="1"] Auftrag -- erteilt [label="N"] Kunde -- {KundenNr, Name} Auftrag -- {AuftragNr, Auftragsdatum} } ``` Tabelle Kunde (1-Seite) | KundeNr | Name | ...| | ------------- | ------------|----| | 0001 | Kunde1 | | | 0002 | Kunde2 | | Tabelle Auftrag (N-Seite) | AuftragNr| KundenNr | Auftragsdatum |...| | -------- | -------- | --------------|---| | 00000001 | 0001 | 2.1.2023 | | | 00000002 | 0001 | 3.1.2023 | | | 00000001 | 0002 | 3.1.2023 | | | 00000002 | 0007 | 5.1.2002 | | Auftrag enthält als Fremdschlüssel den Primärschlüssel von Kunde #### 1:1 - Beziehung ```graphviz graph ERM_Relationship_1_n { layout=neato node [shape=box] Kunde [pos="-3,3!"] Telefonnummer [pos="3,3!"] node [shape=ellipse] KundenNr [pos="-3,4!"] Name [pos="-1,4!"] node [shape=diamond fontsize=8] hat [pos="0,3!"] Kunde -- hat [label="1"] Kunde -- {KundenNr, Name} Telefonnummer -- hat [label="1"] } ``` Die informationen können in einer Tabelle zusammengefasst werden: #### Tabelle Kunde | KundeNr | Name | ...|Telefonnummer | | ------------- | ------------|----|------------- | | 0001 | Kunde1 | |04461/123456 | | 0002 | Kunde2 | |04421/654321 | | ... | | | | ## ER-Diagramm Aufgabe: Entwerfen Sie ein Entity-Relationship-Diagramm für den folgenden Sachverhalt: ```graphviz graph ER { layout=neato node [shape=box] Autor [pos="0,2!"] Verlag [pos="3,0!"] Buch [pos="3,2!"] node [shape=ellipse] ISBN [pos="4.5,1.5!"] Alter { node [label="Name"] verlag_name [pos="4.5,0.15!"] autor_name [pos="0.1,0.8!"] buch_name [pos="4.5,2.2!"] } node [shape=diamond fontsize=8] verfasst [pos="1.5,2!"] verlegt [pos="3,1!"] Autor -- {autor_name, Alter } Autor -- verfasst [label="n"] Buch -- {buch_name ISBN } Buch -- verfasst [label="m"] Buch -- verlegt [label="n"] Verlag -- verlag_name Verlag -- verlegt [label="1"] } ``` --- --- **TODO** * [ ] Aufgabe für ERM erstellen * [ ] Überführen in Tabellen * [ ] PK muss unterstrichen sein --- --- Tipps: * Entitäten sind immer in der Einzahl zu schreiben. * Beziehungen können auch Attribute haben ## relationale Datenbank * Relation > Tabelle * Tupel > Zeile * Attribut > Spalte Weiteres * [Martin-Notation](https://de.wikipedia.org/wiki/Martin-Notation) * Veweis auf SQL :::info Texte sind in Anlehnung an den Wikipedia-Artikel zum [ER-Modell](https://de.wikipedia.org/wiki/Entity-Relationship-Modell#Beschreibung_der_Modellkomponenten) entstanden. :::