TDO- HEFT
Bei einer relationalen Datenbank sind die Daten in Tabellenform gespeichert.
Tabelle |
|
|
|
|
|
|
|
|
|
SNr. |
Vorname |
Zuname |
Alter |
|
|
Max |
Müller |
|
|
|
Peter |
Berger |
|
Datensatz |
|
Herbert |
Maier |
|
|
|
Gunther |
Müller |
|
|
|
Sigfried |
Gunaker |
|
|
|
Spalte (Attribut) |
|
|
SQL steht für structured query language (Strukturierte Abfragesprache)
select ZN, SNR bestimmt aus welcher Tab. Daten gehohlt werden
from schüler gibt an welche Zeile
where A>16 and gibt an welche Spalte
BEISPIEL 1.01 (Alle Schüler mit dem Vorname Josef die älter als 16 sind)
select ZN
from schüler
where VN=´Josef´and A>16
BEISPIEL 1.02 (Alle Piloten mit mehr als 1000 Flugstunden
Vorname |
Zuname |
Flugstunden |
Max |
Müller |
|
Peter |
Berger |
|
Herbert |
Maier |
|
Gunther |
Müller |
|
Sigfried |
Gunaker |
|
select ZN
from pilot
where Flugstunden> 1000
Tabelle: Spieler |
|
Tabelle: Verein |
|
||
ZN |
Verein |
|
Verein |
Präsident |
|
Herzog |
Bremen |
|
Bremen |
Pfanner |
|
Stanzl |
Austria |
|
Austria |
Haym |
|
|
|
|
|
|
|
|
|
|
|
|
|
SQL bildet eine neue Tabelle mit allen Atributen |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
Spieler.ZN |
Spieler.Verein |
Verein.Verein |
Verein.Präsident |
|
|
Herzog |
Bremen |
Bremen |
Pfanner |
|
|
Herzog |
Bremen |
Austria |
Haym |
|
|
Stanzl |
Austria |
Bremen |
Pfanner |
|
|
Stanzl |
Austria |
Austria |
Haym |
|
Um alle 'richtigen' Daten herauszufiltern muß man von der Join Bedingung gebrauch machen: where S.Verein=V.Verein
BEISPIEL 2.01 (Alle Stewardes mit deren Piloten)
|
Tabelle: SF |
|
|
Tabelle: PF |
||
Stewardes |
Flugzeug |
Alter |
|
Pilot |
Flugzeug |
Alter |
Roth |
|
|
|
Mayer |
|
|
Blau |
|
|
|
Müller |
|
|
Grün |
|
|
|
|
|
|
select SF.Stewardes, PF.Pilot
from SF, PF
where SF.Flugzeug= PF.Flugzeug
bei dem Befehl from SF, PF bildet SQL folgende Tabelle
SF.Stewardes |
SF.Flugzeug |
SF.Alter |
PF.Pilot |
PF.Flugzeug |
PF.Alter |
Roth |
|
|
Mayer |
|
|
Roth |
|
|
Müller |
|
|
Blau |
|
|
Mayer |
|
|
Blau |
|
|
Müller |
|
|
Grün |
|
|
Mayer |
|
|
Grün |
|
|
Müller |
|
|
BEISPIEL 2.02 (Alle Stewardessen, die älter sind als ihre Piloten)
select SF.Stewardes, PF.Pilot
from SF, PF
where SF.Flugzeug= PF.Flugzeug and SF.Alter> PF.Alter
BEISPIEL 2.03 (Alle Autotypen aus England u. einer Kleinstadt
Tabelle: A |
|
Tabelle: S |
|||
Autotyp |
Stadt |
|
Stadt |
Land |
EW |
Vauxhall |
Birmingham |
|
Birmingham |
England |
|
Renault |
Paris |
|
Paris |
Frankreich |
|
BMW |
München |
|
München |
Deutschland |
|
select A.Autotyp, S.Land
from A, S
where A.Stadt= S.Stadt and Land= 'England' and EW< 20001
BEISPIEL 2.04 (Welche Schüler sind in 4HB/a
Tabelle: Schüler |
|
Tabelle: Klasse |
|
Tabelle: Lehrer |
||||
Schüler |
Klasse |
|
Klasse |
KV |
Abteilung |
|
Hauptfach |
Name |
Dunst |
4HB/a |
|
4HB/a |
Mercury |
TA |
|
Vauxhall |
Novotny |
Rauch |
4HB/a |
|
1FT/b |
Novotny |
TA |
|
Renault |
Mercury |
Schall |
5HW/c |
|
5HW/c |
Schläfer |
TA |
|
BMW |
Reichel |
select S.Schüler
from S
where S.Klasse= ´4HB/a´
BEISPIEL 2.05 (Welche Schüler haben Mercury als KV
select S.Schüler
from S, K
where S.Klasse= K.Klasse and KV= ´Mercury´
BEISPIEL 2.06 (Welche Schüler haben einen Chemielehrer als KV)
select S.Schüler
from S, K, L
where S.Klasse= K.Klasse and K.KV= L.Name and L.Hauptfach= ´Chemie´
BEISPIEL 2.07 (Welche Schüler aus der Ta haben einen Pysiklehrer als KV)
select S.Schüler
from S, K, L
where S.Klasse= K.Klasse and K.KV= L.Name and K.Abteilung= ´TA´and L.Hauptfach= ´Physik´
BEISPIEL 2.08 (Autotypen einer Stadt mit mind. 1/10 der Bev. d. Landes)
Tabelle: A |
|
Tabelle: S |
|
Tabelle:L |
||||
Autotyp |
Stadt |
|
Stadt |
Land |
EW |
|
Land |
Kontinent |
Vauxhall |
Birmingham |
|
Birmingham |
England |
|
|
England |
Europa |
Renault |
Paris |
|
Paris |
Frankreich |
|
|
Frankreich |
Europa |
BMW |
München |
|
München |
Deutschland |
|
|
Deutschland |
Europa |
Rikscha V8 |
Phnom Penh |
|
Phnom Penh |
Kambodscha |
|
|
Kambodscha |
Asien |
select A.Autotyp
from A, S, L
where A.Stadt= S.Stadt and S.Land= K.Land and S.EW> (L.EW* 0,1)
Bei langen Tebellennamen können Synonyme verwendet werden
select L, S
from Landesschulinspektor L, Stadtschulrat S
where L.Name= S.Name
Joint man eine Tabelle mit sich selbst so heißt das Equijoin
BEISPIEL 3.01 (Alle Menschen und Großväter sind gesucht)
Tabelle: Mensch |
|
Kind |
Vater |
Josef |
Peppi |
Peppi |
Hans |
Susi |
Peppi |
Peter |
Peppi |
select K.Kind, V.Vater
from Mensch K, Mensch V
where K.Vater= V.Kind
BEISPIEL 3.01 (Alle Menschen und ihre Geschwister sind gesucht
select K.Kind, V.Vater
from Mensch K, Mensch V
where K.Vater= V.Vater and K.Kind not(V.Kind)
Tabelle: |
Zahl |
|
|
|
max count 3
min sum 45
avg 15
select ZN
from schüler
where Klasse=´3Hba´
and A=( select max(a)
from schüler
where Klasse=´3Hba´)
Der Befehl Distinct dient zur Duplicatenunterdrückung
select distinct Name
from Schüler
macht aus Tab1, Tab2
Tab1 |
|
Tab2 |
Maier |
|
Maier |
Maier |
|
Roth |
Roth |
|
|
Roth |
|
|
Maier |
|
|
BEISPIEL 4.01 (Das Alter des ältesten der Schule ist gesucht)
select Alter
from Schüler
where Alter=( select max(Alter)
from Schüler)
BEISPIEL 4.02 (Wie heißen die 15 jährigen der Schule)
select ZN
from Schüler
where Alter=19
BEISPIEL 4.03 (Wie heißen die ältesten der Schule)
select ZN
from Schüler
where Alter=( select max(Alter)
from Schüler)
BEISPIEL 4.04 (Welche Schüler der 3Hb/b sind jünger als die S. d. 4Hb/b)
select ZN
from Schüler
where Klasse=´3Hbb/b´and
Alter=( select min(Alter)
from Schüler
where Klasse)´4Hb/b)
BEISPIEL 4.05 (Namen der Schüler die älter sind als der Druchschnitt)
select ZN
from Schüler
where Alter=( select avg(Alter)
from Schüler)
BEISPIEL 4.06 (In welcher Klasse sitzt der größte Schüler d. Schule)
select distinct Klasse
from Schüler
where Größe=( select max(Größe)
from Schüler)
BEISPIEL 4.07 (In welchem Stock/Stöcken sitzen 1,77m große Schüler)
Tabelle:Schüler |
|
Tabelle: Ort |
|||||
SNr. |
Vorname |
Zuname |
Alter |
Größe |
|
Klasse |
Stock |
|
Max |
Müller |
|
|
|
4Hb/a |
|
|
Peter |
Berger |
|
|
|
3HB/a |
|
|
Herbert |
Maier |
|
|
|
4HB/c |
|
|
Gunther |
Müller |
|
|
|
1FL |
|
|
Sigfried |
Gunaker |
|
|
|
3Hak/a |
|
select distinct Ort, Stock
from Schüler, Ort
where Schüler.Größe=177 and Schüler.Klasse=Ort.Klasse
BEISPIEL 4.08 (Angenommen, alle Schüler sind verschieden groß, wie groß ist der zweitgrößte?)
select ZN
from Schüler
where Größe=( select max(Größe)
from Schüler
where Größe<( select max(Größe)
from Schüler)
´Maier´in (Müller, Maier, Huber,)
´Maier´in (Müller, Huber, Fischer,)
12 >max(8,12,13,20)
Exists(9,13);
Exists()
BEISPIEL 4.09(Alle Schüler, die so heißen wie jemand aus der 3HB/c)
select ZN
from Schüler
where Name in( select Name
from Schüler
where Klasse=3HB/c)
Tabelle: Schüler |
||||
Name |
Alter |
Größe |
|
Klasse |
Maier |
|
|
|
4HB/a |
Müller |
|
|
|
3HB/a |
Gruber |
|
|
|
4HB/a |
Berger |
|
|
|
3HB/a |
Die Befehlszeile Group by Klasse ergibt folgendes
Maier |
|
|
|
|
|
4HB/a |
Gruber |
|
|
|
|
|
|
|
|
|
|
|
|
|
Müller |
|
|
|
|
|
3HB/a |
Berger |
|
|
|
|
|
|
Die Werte in den Kästchen können nicht am Bildschirm ausgegeben werden, sondern nur durch Gruppenfunktionen.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
min |
|
ist 17 |
|
avg |
|
ist 1,88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BEISPIEL 5.01
select count name, klasse
from schüler
group by klasse
BEISPIEL 5.02
select max(Alter), avg(Größe), Klasse
from schüler
group by klasse
BEISPIEL 5.03(Alle Klassen, avg alter, größe der Größten)
select KLasse, avg(alter), max(größe)
from Schüler
group by Klasse
BEISPIEL 5.04(Liste aller Altersgruppen mit durchschnittlicher Größe)
select alter, avg(größe)
from Schüler
group by alter
BEISPIEL 5.05(Liste aller Klassen und Anzahl der über 18 jährigen)
select alter, count(alter)
from Schüler
where alter>18
group by alter
BEISPIEL 5.06(Liste aller Altersgruppen in d. 5.Klasse mit dschn. Größe)
select alter, avg(größe)
from Schüler
where klasse like(´5*´)
group by alter
BEISPIEL 5.07 (Liste aller Stcokwerke mit dschn. Alter, Schülerzahl u. Größe des größten Schülers)
select avg(alter), count(alter), max(größe)
from Schüler, Ort
where S.klasse= O.Klasse
group by O.Stock
Im Gegensatz zu where, kann man mit having auch Gruppenfunktionen verwenden
BEISPIEL 6.01 (Liste aller Klassen, deren dschn. Alter, die mehr als 20 Schüler haben)
select Klasse, avg(alter)
from Schüler
group by Klasse
having count(*)>20
BEISPIEL 6.02(Liste aller Klassen, mit Schülerzahlen und der dsch.Größe)
select alter, count(schüler)
from Schüler
group by Alter
having avg(größe)>180
BEISPIEL 6.03(Liste aller Klassen, mit Schülerzahlen und der dsch.Größe)
select alter, count(schüler)
from Schüler
group by Alter
having avg(größe)>180
BEISPIEL 6.04(Den Piloten mit den meisten Flugstunden)
Pilot |
|
KF |
||||
Piloten# |
Name |
Copiloten# |
Flugstunden |
|
Piloten# |
Typ |
|
Müller |
|
|
|
|
DC10 |
|
Berger |
|
|
|
|
Boing747 |
|
Maier |
|
|
|
|
Boing747 |
|
Müller |
N |
|
|
|
Fokker110 |
|
Gunaker |
N |
|
|
|
DC10 |
select P.Name
from Pilot
where h=( select max(Flugstunden)
from Pilot)
BEISPIEL 6.05(Alle Piloten und ihre Copiloten)
select T1.Name, T2.Name
from Pilot T1, Pilot T2
where T1.CNR=T2.PNR
BEISPIEL 6.06(Welche Typen kann Berger fliegen?)
select KF.Typ
from Pilot, KF
where P.PNR=KF.PNR and Name=´Berger´
BEISPIEL 6.07(Alle Klassen, in denen avg alter >16 ist)
select Klasse
from Schüler
group by klasse
having avg(alter)>16
BEISPIEL 6.08(Alle Altersgruppen in denen mind einer über 2m großen Schüler gibt und die Größe dieses Schülers)
select Alter,max(Größe)
from Schüler
group by alter
having max(größe)>2
BEISPIEL 7.01(Gib die Schüler der 3Hbc dem Alter geordnet nach aus)
select name
from Schüler
where klasse=´3Hbc´
order by alter
Im order by Teil können die Attribute oder Gruppenfunktionen von Attributen stehen, die auch im select- Teil stehen oder stehen könnten.
select name avg(alter) könnte auch nicht
from schüler im select Teil stehen, weil
order by avg(alter) nicht gruppiert wird
BEISPIEL 7.02(Gib alle Klassen nach dem Durchschnittsalter geordnet aus)
select klasse
from Schüler
group by klasse
order by avg(alter)
Man kann im order by- Teil auch mehrere Attribute angeben
select name
from Schüler
order by klasse, alter
Liste aller Schüler nach Klassen geordnet, innerhalb einer Klasse sind sie nach ihrem Alter geordnet
select name
from Schüler
order by alter, klasse
Liste aller Schüler nach dem Alter geordnet, gleich alte werden nach der Klasse geordnet
NULL bedeuted "gibt es nicht"
Mitarbeiter# |
Name |
Chef# |
|
|
|
|
|
Maier |
|
|
Müller hat keinen Chef |
|
|
|
Müller |
NULL |
|
|
|
|
|
Huber |
|
|
|
|
|
|
Berger |
|
|
Huber hat den Chef mit Nummer 0 |
NULL
BEISPIEL 8.01(Alle Mitarbeter ohne Chef)
select name
from Mitarbeiter
where Chef is NULL
Es gibt auch not NULL
BEISPIEL 8.02(Alle Untergebenen von Berger )
select count(Name) select count(Chef#)
from Mitarbeiter from Mitarbeiter
3
Datensätze mit Null Null wird nicht
werden mitgezählt mitgezählt
from
where
group by
having
order by
select
BEISPIEL 9.01(Größe+ Alter der Schüler der 3hbb)
select größe, alter
from schüler
where klasse=´3hbb´
BEISPIEL 9.02(alle S. die so groß und so alt sind wie jemand aus 3Hbb)
select name
from schüler
where (größe, alter) in (select
BEISPIEL 9.03(Alle Weitspringer)
|
|
Sportler |
|
|
|
Name |
VName |
Alter |
Disziplin |
Bestleitsung |
Nr |
Berger |
Gerhard |
|
100m Sprint |
|
|
Glas |
Uschi |
|
Schuplattln´ |
126 pro sek |
|
Mercury |
Frederick |
|
|
|
|
Polster |
Anton Jesus |
|
talking |
2 words/sec |
|
Duck |
Daffy |
|
shaking |
|
|
select name
from sportler
where disziplin=´weitsprung´
order by name
BEISPIEL 9.04(Alle 100m Läufer unter 10sec)
select name
from sportler
where disziplin=´100m´ and bestleistung<10
order by bestleistung
(nicht == wie in C)
<>(nicht != wie in C
<
>
>=
<=
Between: where alter between 14 and 16
in: where klasse in(´5a´,´5c´)
like: % beliebig viele Zeichen (* in DOS)
- 1 Zeichen (? in DOS)
addieren
subtrahieren
dividieren
multiplizieren
hängt Zeichenfolge zusammen
nvl(a,b) falls a dann b
length gibt die Länge einer Zeichenkette aus
abs Absolutbetrag (z.B. abs(-7)=7)
sign Vorzeichen (z.B. sign(-7)=-1)
substr
Tabelle: Spieler |
|
Tabelle: Verein |
|
||
ZN |
Verein |
|
Verein |
Präsident |
|
Herzog |
Bremen |
|
Bremen |
Pfanner |
|
Stanzl Sahne |
Austria NULL |
|
Austria |
Haym |
|
select *
from spieler,verein Ergibt 2 Datensätze
where s.verein=v.verein
select *
from spieler,verein Ergibt 3 Datensätz
where s.verein=v.verein (+)
Datenbankentwurfsregel Nummer 1:
KEINE VERSTECKTEN JOINS !!!
Bei Vertippen wiedersprüchlich (inkonsistent)
Unnötig viel Speicherverbrauch (Reduntant)
Wenn kein Mitarbeiter, keine Abteilung (deletion anonaly)
Mitarbeiter |
|
|
|||
Mitarb# |
Mitarbname |
Abt# |
Abtname |
|
|
|
Müller |
|
Verkauf |
|
|
|
Maier |
|
Einkauf |
|
|
|
Fischer |
|
Verkauf |
|
|
|
Huber |
|
Leitung |
|
|
|
Reinauer |
|
Verkauf |
|
|
|
|
|
|
|
|
Statt dieser Tabelle könnte man auch |
|
|
|||
|
|
|
|
|
|
Employee |
|
Abteilung |
|||
Mitarb# |
Mitarbname |
Abt# |
|
Abt# |
Abtname |
|
Müller |
|
|
|
Verkauf |
|
Maier |
|
|
|
Einkauf |
|
Fischer |
|
|
|
Leitung |
|
Huber |
|
|
|
|
|
Reinauer |
|
|
|
|
|
|
|
|
|
|
entwerfen |
|
|
|
|
Die Tabelle ´Mitarbeiter´ ist somit join von ´Employee´ und ´Abteilung´
Mitarbeiter= select mitarb#, mitarbname,
from employee, abteilung
where employee.abt#= abteilung.abt#
Eine Informationsverlustfreie Zerlegung (lossless decomposition/ nonloss decomposition) von ´Mitarbeiter´ in ´Employee´ und ´Abteilung´ ist also möglich
Bürohilfe vertippt sich und schreibt bei Fischer ´Einkauf´ statt ´Verkauf´. Laut Datenbank ist Abt.3 mal der Einkauf, mal der Verkauf ---> Widerspruch (Inconsistency) Vertippt sie sich in Tabelle ´Abteilung´, so ist die Datenbank falsch, aber nicht widersprüchlich
Zu hoher Speicherverbrauch
Werden alle Mitarbeiter der Produktion gelöscht, so weiß man nicht mehr, welche Abteilungsnr. sie hat (deletion anomaly)
Läßt sich Tabelle X verlustfrei in die Tabellen Y und Z zerlegen, so wirft man X weg und nimmt Y und Z in die Datenbank auf.
ENTITY: alle Menschen, Sachen, Orte, über die wir Informationen speichern wollen.
Bsp.: Schüler Maier, 3Hbc, TDO, Schüler Müller, .Stock,
ENTITY TYPE: Zusammenfassung gleicher Entities
Bsp.: Schüler, Klasse, Fach, Stock
RELATIONSHIP: Beziehung zwischen Entities
Bsp.:3hbc hat_Klassenzimmer_in 2.Stock Hasitschka unterrichtet 4hba in TDO
RELATIONSHIPTYPE Beziehungen zwischen Entitytypes
Bsp.: Klasse hat_Klassenzimmer_in Stock Lehrer unterrichtet Klasse in Fach
ATTRIBUT: Eigenschaft einer Entity
Bsp.: Maier:17 Jahre, katholisch, Eishockey
ATTRIBUTE TYPE Bsp.: Alter, Religion, Sport
Entity Type Tabelle
Entity Datensatz= Tabellenzeile
Attribute Type Spalte
Attribute Tabellenzeile
Suche
alle Entity Types, über die Information gespeichert werden soll.
z.B. Schraubentyp, Mitarbeiter, Kunde, Fabrik,
Suche zu
jedem die zu speichernden Attribute.
z.B. Schraubentyp(Typenbez., Länge, Steigung) Mitarbeiter(Name, Einstelldatum)Kunde(Name,
Adresse)
Wähle
oder erfinde Schlüssel
z.B. Schraubentyp(Typenbez., Länge, Steigung) Mitarbeiter(M#,
Name, Einstelldatum)Kunde(K#, Name, Adresse)
Mache aus
jeder Entity Type eine Tabelle
z.B. SQL:creat table schraubentyp
Suche
alle Relationship Types, über die Information gespeichert werden soll.
z.B. Mitarbeiter arbeitet_in Fabrik Schraubentyp
wird_hergestellt_in Fabrik Kunde bestellt Schraubentyp bei Mitarbeiter
Suche
speicherungswürdige Attribute der Beziehungen.
z.B. Arbeitet_in: Dienstbegin, Funktion wird_hergestellt_in: max.
Tagesproduktion bestellt_bei: Bestellmenge, Datum
Welche
Beziehungen sind 1:n?
Jeder Mitarbeiter arbeitet_in (<=) einer Fabrik In jeder Fabrik arbeiten
(<=) mehrere Mitarbeiter einer:mehrere= 1:n Beziehung
Welche Beziehungen sind m:n?
Jeder Schraubentyp wird_hergestellt_in (<=) mehreren Fabr. In jeder Fabr.
werden_hergestellt (<=) mehrere Schr.typen mehrere:mehrere= m:n Beziehung
Welche sind Mehrfachbeziehungen?
Kunde bestellt Schraubentyp bei Mitarbeiter 3 Entity Types an Beziehung beteiligt
(3=trinär, 4=Quaternär)
Wie
halte ich in Datenbank fest, wer in welcher Fabrik arbeitet?
a.)Spalte ´Mitarbeiter´ in Tabelle Fabrik.
schlecht: können
beliebig viele sein Wieviel Byte sollen für dieses Attribut pro Zeile reserviert werden?
b.)Spalte ´Fabrik´ in Tabelle Mitarbeiter.
gut: kann iimer
nur eine sein. Aber was wird dort eingetragen? Kapazität, Adresse, Beides? Etwas was eindeutig klar
macht, in welcher Fabrik der Mitarbeiter arbeitet->
Mitarbeiter bekommt neue Spalte mit dem Schlüssel von Fabrik.
Wie
halte ich m:n Beziehungen fest?
(z.B. welcher Schraubentyp wird in welcher Fabrik gefertigt?)
a.) Ich speichere bei Fabrik die Schr.typen schlecht siehe 8.
b.) Umgekehrt schlecht siehe 8. neue Tabelle Fertigung
|
|
|
Fertigung |
|
|
|
|
|
Schlüssel |
-------------> |
STyp |
Fabrik |
<------------- |
Schlüssel |
|
|
aus |
|
H8/1 |
Wien 23 |
|
aus |
|
|
Schr´Typ |
|
H8/1 |
Linz |
|
Fabrikstabelle |
|
|
|
|
M15/2.5 |
Wien 23 |
|
|
|
Mehrfachbeziehungen-> Eigene Tabelle
Betsellung |
||
Kunde |
Mitarbeiter |
Produkt |
|
|
H8/1 |
|
|
M15/2.5 |
11. Füge Beziehungsattribute zur Datenbank Bestellmenge, Datum neue Spalten der Tabelle "Bestellung" Max. Tagesproduktion Spalte von "Fertigung" Dienstbeginn, Funktion neue Spalten und "Mitarbeiter"
12. Entferne
Ableitbare Beziehungen
Derivable Realtionship (Spitalsbeispiel)
Ableitbare Attribute
Derivable Attribute (Geburtsdatum, Alter-> Geburtsdatum)
Zerlegbare Tabellen
Tabellen bauen:
creat table kunde (knr number(4) not null, nme char(30))
Datensätze einfügen:
insert into kunde values(3276. ´Maier´)
Datensätze ändern
update kunde set knr=5000 where name=´Berger´
Datensätze löschen
delete from kunde where name=´Müller´
Tabellen löschen
drop tabelle kunde
Helfen (sollen helfen) beim Datenbankdesign
ERDs zeigen keine Entities & Relationships sondern Entity Types und Relationship Types
Entity Type Kästchen Kunde
Attribute Type Kugel
K# Name
1:n Beziehung Linie Mitarbeiter Fabrik
m:n Beziehung: Assoziative Entity Types
Fabrik Fertigung Schraubentyp
Mehrfachbezogene Assoziative Entititypes
Kunde Bestellung Mitarbeiter
Schraubentyp
mind. 0 höchstens 1
mind. 1 höchstens 1
mind. 0 höchstens mehrere
mind 1 höchstens mehrere
Jeder Lehrer unterrichtet mindestens 0, höchstens mehrere Schüler. Jeder Schüler wird von mindestens 1 höchstens mehreren Lehrern unterrichtet.
Lehrer Schüler
m:n
Man gebe einen Schlüssel an für
Eine Tabelle der Schüler der Hbc (Kat´Nr)
Eine Tabelle aller derzeitigen Wiener Schüler (Kat´Nr Schulcode, Klassencode)
Eine Tabelle aller Schüler, die jemals die Ungargasse besucht haben (Eintrittsjahr, Klassencode d, 1.Klasse, Kat´Nr in 1.Klasse)
gebe Kardinalitäten, Beziehungstyp an
Mieter bewohnen Haus Mieter Haus m:n
Patient bekommt von Arzt Medizin verschrieben
Patient Arzt
Verschreibung
Mehrfachbeziehungen Medizin
Mutter hat Kind Mutter Kind 1:n
Programmierer schreibt Programm in Sprache
Programmierer Programm Sprache
Das sind 2 m:n Beziehungen Neue Tabellen
Mensch übt Beruf aus Mensch Beruf m:n
ERD Schraubenhersteller (ohne Attribute)
1
Kunde Bestellung Mitarbeiter Maschine
3
2
Schr´typ Fertigung Fabrik
1..Kann_bedienen
2..Steht_in
3..Arbeiter_in
Wichtigste ERD- Regel: Keine Ableitbaren Beziehungen!
1 2
Spital
3
Patient Spitalsbett
1..Liegt_in
2..Steht_in
3..Belegt
1 ist überflüssig: 2,3 reichen, um herausfinden zu lönnen, in welchem Spital Patient x liegt 1 könnte gestrichen werden.
Man könnte auch 1 lassen und 2 streichen aber nicht 1 lassen und 3 streichen!
Um etwas vertrauter mit ERDs zu werden hier noch ein kleines Beispiel der HTL Ungarg.
Folgende Tabellen werden erstellt:
Schüler (Name, Vname, Aufnahme#, GebDatum, Staatsbürgerschaft, Muttersprache, Quartier, Adresse, Plz, Ort, Land, Erziehungsberechtigter, Privatnummer, Firmennummer, Status, Behinderung, Vorschule, KKZ, Abtcode, PKZ)
Laufbahn (Name, Vname, Gebdatum, Sjahr, KKZ, Abtcode, PKZ)
Klasse (KKZ, Abtcde, PKZ, KV, Raum)
Fach (Fbezl, Fbezk, Fbezaltern)
Stdtafel (KKZ, Abtcode, Fbezk, Std)
Lehrer (Lehrer#, Name, Vname, Akgrad, staatsbürgerschaft, Muttersprache, Adresse, Plz, Land, Privnummer, Firmennummer)
Stdplan (KKZ, Abtcode, PKZ, Fbezk, Raum, Ausweichraum, Tag, Stunde, L#, Unterichts#)
Zeugnis (Aufnahme#, KV, Snote, Enote)
usw. usw. usw.
Unter einer Schedule versteht man die zeitliche Reihenfolge in der Transaktionen ablaufen.
Transaktion_1 |
Transaktion_2 |
Transaktion_1 |
Transaktion_2 |
|
|
|
|
read B |
|
|
read B |
|
|
|
|
write L |
|
|
write L |
|
read B |
read B |
|
|
|
|
|
|
write B |
write B |
|
Wert: B B-5 |
Wert: B B-5 |
||
L L+10 |
L L+10 |
=> serialisierbar
Transaktion_1 |
Transaktion_2 |
Transaktion_1 |
Transaktion_2 |
|
|
read B |
|
read B |
|
B=B-1 |
|
B=B-10 |
|
write B |
|
|
read B |
read L |
|
write B |
|
|
read B |
read L |
|
|
B=B+5 |
|
B=B+5 |
|
write B |
|
write B |
L=L+10 |
|
L=L+10 |
|
write L |
|
write L |
|
|
|
Wert: B B+5 |
|
||
L L+10 |
|
=> nicht serialisierbar
Flug Platz S304 ist schon vergeben, wenn 1 sonst 0
Langt Transaktion_1 vor Transaktion_2 ein bekommt Edlauer das Ticket.
Langt Transaktion_2 vor Transaktion_1 ein bekommt Haselberger das Ticket.
Transaktion_1 |
Transaktion_2 |
Transaktion_1 |
Transaktion_2 |
|
|
read B |
|
read S304 |
read S304 |
|
|
if (S304==1) sorry |
|
|
|
else |
|
|
|
|
read S304 |
|
|
|
if (S304==1) sorry |
|
|
|
else |
|
|
read A |
|
|
|
A=A+1 |
|
|
|
write A |
|
|
|
|
read A |
|
|
|
A=A*2 |
|
|
|
write A |
|
|
read A |
|
|
|
A=A+1 |
|
|
|
write A |
|
|
|
T1, T2 A 2A+4 |
A 2A+3 |
||
T2, T1 A 2A+2 |
|
Um zu verhindern, daß zwei Prozesse auf ein und denselben Datensatz zugreifen muß man locken. Unter locking versteht man das Sperren Daten um anderen Transaktionen den Zugriff auf den gesperrten Datensatz zu verwehren.
Bei einem Ms-Dos Rechner wird das locken mit den Befehlen cli und sti realisiert.
Durch das Locken wäre folgende Transaktion nicht mehr möglich.
Transaktion_1 |
Transaktion_2 |
|
|
Lock A |
|
|
Lock A |
|
A=A+3 |
Die Transaktion
Transaktion_1 |
Transaktion_2 |
|
|
Lock B |
|
Read B |
|
B=B-10 |
|
write B |
|
unlock B |
|
|
lock L |
|
read L |
|
L=L+10 |
|
write L |
|
unlock |
wäre jedoch zulässig.
Es ist möglich, daß Transaktionen nicht nach Reihenfolge des Einterrens, sondern nach Prioritäten abgearbeitet werden. Dies ist manchmal erforderlich, wie beispielsweise bei einem Space Shuttle die Sauerstoffversorgung, die die höchste Priorität zugewiesen bekommt da sie immer aufrecht erhalten werden muß. Bei dieser Lösung besteht jedoch die Gefahr, daß eine Transaktion mit geringer Priorität immer nach hinten gereigt wird, da wichtigere Transaktionen auszuführen sind. Ist dies der Fall so ist ein Livelock (oder Starvation) gegeben.
Wartet eine Transaktion_1 auf Datensatz B und eine Transaktion_2 auf Datensatz A, wobei sie beiden Datensätze von der jeweilig anderen Transaktion gelockt wurden, so nennt man diese Situation Deadlock.
Transaktion_1 |
Transaktion_2 |
|
|
Lock A |
|
|
Lock B |
Lock B |
|
|
Lock A |
Es gibt mehrere Möglichkeiten um einen Deadlock zu verhindern. Ein Beispiel wäre bestimmte Regeln aufzustellen an die sich die Transaktionen halten müssen:
Locken
Reihenfolge beim Locken
Phasen Locking (Nach dem unlock darf kein lock mehr kommen)
Eine andere Möglichkeit um Livelocks zu verhindern ist es einen Graphen (Dead Lock Graph) zu zeichnen.
Ein Deadlock ist dann vorhanden, wenn man einen geschlossenen Kreis (cycle) zeichnen kann. Ist die der Fall so muß ein Knoten gelöscht werden, um den Deadlock aufzulösen
Läuft eine Transaktion nicht bis zum Ende, aus welchem Grund auch immer, so dürfen die bis jetzt geänderten Daten nicht geändert bleiben, sondern müssen zurückgesetzt werden. Dieses Zurücksetzten wird im allgemeinen Rollback bezeichnet. Ein Rollback kann aus vielen verschiedenen Gründen notwendig werden. Zum Beispiel wenn der user am Ende der Dateneingabe auf "Cancel" clicked so sollen die gemachten Anderungen nicht gesichert werden, oder auch wenn das System abstürtz oder andere Komplikationen auftreten.
Transaktion_1 |
|
lock E |
Rollback |
lock H |
read E |
read H |
H=H+1 000 000 |
write H |
unlock H |
if (E>-100 000) else |
E=E-1 000 000 |
write E |
unlock E |
Es ist oft der Fall, daß eine Transaktion andere Transaktionen aufruft oder durchführt, und diese wiederum ander aufruft oder durchführt, usw. Damit wäre bei einem Rollback nicht nur erforderlich eine Transaktion Back zu rollen, sondern mehrere. Dieser Effekt hat die Bezeichnung Cascading Rollback. Dies ist praktisch kaum durchführbar und ist unbedingt zu vermeiden.
Um dies zu realisieren, muß gewährleistet sein, daß nach einem gewissen Zeitpunkt kein Rollback mehr durchgeführt wird. Dieser Punkt ist nach Beendigung aller Berechnungen und wird Commit Point genannt.
Wenn folgende Reihenfolge eingehalten wird ist gesichert, daß kein Cascading Rollback durchgeführt werden muß. Diese Vorgangsweise nennt man Zwei Phasen Commit.
Commit Point wurde erreicht
Write to the Database now
Unlocks
Unter einem Protokoll versteht man allgemein gültige Regeln, an die sich alle zu halten haben.
Um auch das Risiko noch weiter zu veringern werden sogenannte LOGs angelegt. In diesen LOGs steht welche Transaktion, welche veränderungen plant. Tritt nun eine unvorhergesehene Unterbrechung auf, so kann man anhand des LOG rekonstruieren was geplant, bzw. mit Vergleich der aktuellen Daten, was verändert wurde. Jedes LOG wird sicherheitshalber 2x auf Lokale Speichermediem gesichert, die womöglich noch räumlich getrennt sein sollten.
Ein LOG hat in etwa folgende Aussage
Ich bin Transaktion_1 |
ich plane |
write A=19 |
write B=30 |
write C=4 |
|
ENDE |
Dieses Kapitel beschäftigt sich damit was gesperrt werden soll (Tabelle, Datensatz, Zelle), d.h. mit
der richtigen Größe der zu sperrenden Objekt
Access Optionen zu diesem Thema sind z.B. exlusiv öffnen, Tabelle locken.
Access Basic Befehle zu diesem Thema sin z.B. Move First, Move Last (Bewegt Bleistift), lock edits, begin trans, commit trans, rollback.
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen