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
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}
Um Operationen auf Relationen durchführen zu können, wurde die relationale Algebra eingeführt.
Zu den Mengenoperationen gehören:
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:
Lösung:
| A | B | C |
|---|---|---|
| a1 | b2 | c1 |
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
| a1 | b2 | c1 |
| a2 | b1 | c2 |
| a2 | b2 | c1 |
| a2 | b2 | c2 |
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
| a2 | b1 | c2 |
| A | B | C |
|---|---|---|
| a2 | b2 | c1 |
| a2 | b2 | c2 |
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 |
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 |
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!
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 |
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}.
Weitere Verbundarten sind:
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.