====== 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.