====== 2.4 Relationenmodell ====== Das Relationenmodell wurde 1970 von Codd entwickelt. Es **repräsentiert** die **Daten einer Datenbank als eine Menge von Relationen**. Eine **Relation** können wir uns dabei **als Tabelle vorstellen**, der **Zeilen Objekte oder Beziehungen zwischen Objekten beschreiben**. Der **Tabellenkopf** heißt **Relationenschema**, die einzelnen **Spalten** werden als **Attribute** bezeichnet, die einzelnen **Zeilen als Tupel**. Restaurant |ID|Name|PLZ| |R1|Mc|3300| |R2|Hw|3300| |R3|Kb|3300| "Restaurant" ist ein Relationenschema. ID, Name, PLZ ist Attribut, R1/Mc/3300 etc. sind Tupel ===== 2.4.1 Formalisierung ===== Ein **Relationenschema R** ist eine **endliche Menge von Attributnamen** {A1, A2, .... An}. Zu jedem Attributnamen A1 gibt es eine Menge Di, 1 ≤ i ≤ n, den **Wertebereich (=domain)** von Ai, der auch mit Dom(Ai) bezeichnet wird. \\ \\ Eine **Relation r(R)** auf einem **Relationenschema R** ist eine endliche Menge von Abbildungen {t1,....,tm} von R nach D. Die Abbildungen werden **Tupel** genannt. \\ \\ Bsp.: Relationenschemata für RESTAURANT und SPEISE Restaurant = {rnr,name,adresse,haube,typ} Speise = {name,preis,rnr} |rnr|name|adresse|haube|typ| |1|...|...|...|...| |2|...|...|...|...| |3|"Green Cottage"|"Kettenbrückengasse 3, 1050 Wien"| 2| "chinesisch"| |4|...|...|...|...| \\ Bsp.: Domänen für das Relationenschemata RESTAURANT: Dom(rnr) = Menge aller Integer Dom(name) = Menge aller Namen Dom(haube) = {k|0<=k<=4} \\ Bsp.: Die Tabelle Restaurant hat mehrere Tupel. Eines von ihnen ist t3 mit: t3 = 3, "Green Cottage", "Kettenbrückengasse 3, 1050 Wien", 2, "chinesisch" t3(rnr) = 3 t3(name) = "Green Cottage" t3(haube,typ) = 2, "chinesisch" \\ **Ein Schlüssel einer Relation r(R) ist eine Teilmenge K von R, sodass für zwei verschiedene Tupel t1 und t2 aus r(R) immer t1(K) != t2(K) gilt und keine echte Teilmenge K' von K diese Eigenschaft hat.** \\ \\ Im Allgemeinen wird dabei ein Schlüssel als Primärschlüssel ausgezeichnet und in den Relationenschemata durch Unterstreichen der Schlüsselattribute gekennzeichnet. \\ Bsp.: Restaurant = {__rnr__, name, adresse, haube, typ} Speise = {__name__, preis, rnr} ===== 2.4.2 Operationen auf Relationen ===== Um Operationen auf Relationen durchführen zu können, wurde die relationale Algebra eingeführt. ==== 2.4.2.1 Mengenoperationen ==== Zu den Mengenoperationen gehören: * Durchschnitt ("∩") * Vereinigung ("∪") * Differenz ("-") von Relationen, die über der gleichen Attributmenge mit derselben Anordnung (identische Reihenfolge der Attribute) definiert sind: \\ \\ Bsp.: Es sind 2 Relationen r und s gegeben: \\ \\ r ^A^B^C^ |a1|b1|c1| |a1|b2|c1| |a2|b1|c2| \\ s ^A^B^C^ |a1|b2|c1| |a2|b2|c1| |a2|b2|c2| \\ \\ Gesucht sind: * Durchschnitt (r ∩ s) * Vereinigung (r ∪ s) * Differenz (r - s) * Differenz (s - r) \\ \\ Lösung: \\ \\ * Durchschnitt (r ∩ s) \\ ^A^B^C^ |a1|b2|c1| \\ * Vereinigung (r ∪ s) \\ ^A^B^C^ |a1|b1|c1| |a1|b2|c1| |a2|b1|c2| |a2|b2|c1| |a2|b2|c2| \\ * Differenz (r - s) \\ ^A^B^C^ |a1|b1|c1| |a2|b1|c2| \\ * Differenz (s - r) \\ ^A^B^C^ |a2|b2|c1| |a2|b2|c2| \\ ==== 2.4.2.2 Die Selektion ("σ") ==== Bei der Selektion werden Zeilen ausgewählt, die einem bestimmten Kriterium entsprechen: \\ \\ $ σ_{A=a}(r) = \{ t∈r|t(A)=a \} $ \\ \\ Beispiele: \\ a) $ σ_{A=a1}(r) = ? $ \\ \\ ^A^B^C^ |a1|b1|c1| |a1|b2|c1| \\ b) $ σ_{A=a1}(s) = ? $ \\ \\ ^A^B^C^ |a1|b2|c1| \\ Noch allgemeiner wird die Selektion, wenn wir erlauben, wohldefinierte Operatoren auf den Attributwerten auszuführen, z.B.: arithmetische Operationen auf Zahlenwerte und logische Verknüpfungen von Attributen durch "und" ("∧"), "oder" ("∨") und Negationen ("¬"). \\ \\ c) $ σ_{(B=b1)∧¬(A=a1)}(r)=? $ \\ 1. Schritt: \\ $ σ_{(B=b1)}(r)=? $ ^A^B^C^ |a1|b1|c1| |a2|b1|c2| \\ 2. Schritt: $ σ_{(B=b1)∧¬(A=a1)}(r)=? $ ^A^B^C^ |a2|b1|c2| \\ \\ d) $ σ_{( haube > 1) ∧ ¬(typ="österreichisch" ∨ typ="international")}(Restaurant)=? $ \\ \\ Bsp: Relation Restaurant \\ ^rnr^name^adresse^haube^typ^ |1|Schnitzelhaus|Amstetten|1|österreichisch| |2|Brauhof|Amstetten|3|international| |3|Pizza Hollywood|Amstetten|2|italienisch| \\ \\ Lösung => Folgender Tupel: \\ |3|Pizza Hollywood|Amstetten|2|italienisch| ==== 2.4.2.3 Die Projektion ("π") ==== Bei der Projektion werden gewisse Spalten einer Tabelle ausgewählt. Man projiziert nach einer Teilmenge der Attribute: $π_X(r) = \{t(X)|t∈r\} für X ⊆ R $ \\ Beispiele: \\ \\ e) $ π_{A,B}(r)=? $ \\ \\ f) $ π_{name,adresse,haube}(Restaurant)= ?? $ ^name^adresse^haube^ |Schnitzelhaus|Amstetten|1| |Brauhof|Amstetten|3| |Pizza Hollywood|Amstetten|2| ==== 2.4.2.4 Der Verbund ==== === 2.4.2.4.1 Der natürliche Verbund === Der Verbundoperator verknüpft zwei Relationen über ihre gemeinsamen Attribute: \\ \\ $ r ⋈ s = \{|\{R,S\}| ∃ t_r ∈ r \text{ und } ∃ t_s ∈ s:t_r =t(R) \text{ und } t_s=t(S) \} $ \\ \\ Der Verbundoperator ist kommutativ. \\ \\ Beispiel: \\ Relation r \\ ^A^B^ |a1|b1| |a2|b1| |a3|b2| \\ \\ Relation s \\ ^B^C^ |b2|c1| |b2|c2| |b1|c3| |b3|c4| \\ \\ Relation r ⋈ s \\ ^A^B^C^ |a1|b1|c3| |a2|b1|c3| |a3|b2|c1| |a3|b2|c2| \\ Aufgabe: Restaurant ⋈ Speise \\ Lösung: \\ |rnr|name|adresse|haube|typ|preis| \\ \\ **Erklärung:** \\ Der natürliche Verbund verknüpft beide Relationen über die gemeinsamen Attribute und gibt daher jene Tupel aus, bei denen sowohl der Name **name** des Restaurants und der Name **name** der Speise als auch die Restaurantnummer **rnr** des Restaurants und jene der Speise gleich sind. In unserem Fall ist das die leere Menge! \\ \\ ==Projektionseigenschaften des Verbundoperators== Seien R und S zwei Relationenschema, $ q=r⋈s $ und $ r'=π_R(q) $, dann gilt $ r'⊆r $. Joinen wir also eine Relation r mit einer anderen und projizieren dann nach den ursprünglichen Attributen von r, so können unter Umständen Tupel verloren gehen. \\ \\ Beispiel: \\ \\ Relation r ^A^B^ |a|b| |a|b'| \\ Relation s ^B^C^ |b|c| \\ \\ Relation r⋈s=q ^A^B^C^ |a|b|c| \\ \\ Relation $ π_{AB}(q)=r' $ ^A^B^ |a|b| === 2.4.2.4.2 Das Kartesische Produkt === Falls $R ∩ S = \{\}$,die beiden Relationenschemata also kein gemeinsames Produkt haben, so liefert die Verknüpfung r ⋈ s das Kartesische Produkt, geschrieben als r x s. \\ \\ Beispiel: \\ Relation r ^A^B^ |a1|b1| |a2|b1| \\ Relation s ^C^D^ |c1|d1| |c2|d1| |c2|d2| \\ Relation r x s = r ⋈ s ^A^B^C^D^ |a1|b1|c1|d1| |a1|b1|c2|d1| |a1|b1|c2|d2| |a2|b1|c1|d1| |a2|b1|c2|d1| |a2|b1|c2|d2| \\ \\ Wie wir oben gesehen haben, ist das Kartesische Produkt nur für den Fall definiert, dass $R ∩ S=\{\}$. Möchte man das Kartesische Produkt von Relationen bilden, die gemeinsame Attribute haben, so müssen diese in einer der Relationen umbenannt werden. Ist etwa R = {A,B,C} und S = {A,B,D}, so benennen wir die Attribute von S um, so dass S={A',B',D} oder kennzeichnen sie durch Voranstellen des Relationennamens, also S={S.A,S.B,D}. === 2.4.2.4.3 Weitere Verbundarten === Weitere Verbundarten sind: * der Gleichverbund (equi-join) * der Theta-Verbund (theta-join) * der Semi-Verbund (semi-join) * der Äußere Verbund (outer-join) ==== 2.4.2.5 Division ==== Möchte man die Relation r durch s dividieren, so muss die Attributmenge von s eine Teilmenge der Attributmenge von r sein. Das Ergebnis hat die Differenz der Attributmengen als Attribute und wählt jene Tupel aus r aus, die eingeschränkt auf die Differenz der Attribute R-S für alle Tupel aus s denselben Wert haben. \\ \\ Beispiel: \\ Relation R ^A^B^C^D^ |a|b|c|d| |a|b|e|f| |b|c|e|f| |e|d|c|d| |a|b|d|e| |e|d|e|f| |a|d|e|f| \\ \\ Relation S ^C^D^ |c|d| |e|f| \\ \\ Relation R % S ^A^B^ |a|b| |e|d| Sowohl bei |a|b| als auch bei |e|d| kommen beide Tupel der Relation S, nämlich |c|d| und |e|f| vor.