select

Werbung
DatenbankbasierteWeb-Anwendungen
ForeignKeysundDatenabfragen
MedieninformatikSoSe2017
RenzoKottmann
ThisworkislicensedunderaCreativeCommonsAttribution-NonCommercial
4.0InternationalLicense.
Zusammenfassungdervorherigen
Vorlesung
EigeneDatentypen
ForeignKeysbeiAufzaehlungen(technisch)
Nichtbesprochen:
UmsetzungvonERMBeziehungenmittelsForeignKeys
AktuelleImplementierung
SQLfilemiterstenTestdaten
Relationships(Beziehungen)revisited
VerschiedeneEntitätenkönnenzueinanderinBeziehunggesetztwerden.
InjederBeziehunghabenEntitätengewisseRollen
BeziehungenkönnenEigenschaften(Attribute)haben
BeziehungenhabenKardinalitäten
Beziehungen
TeilenhmeristineinerProjektgruppeundeiner
Laborgruppe
JedeProjektgruppebearbeitetmehereLaboruebungen
BeziehungenmitForeignKeys
Bestimmemdie
AttributewelchedieBeziehungenidentifizieren
Kardinalitäten
ForeignKeys(onetomany)
Koennennureinszu
vieleBeziehungen
umsetzen
Werdenimmervon
vielezueinsgesetzt
CREATETABLElabor_gruppe(
codetext
PRIMARYKEY
CHECK(codeIN('w','x','y','z')),
--Attributefehlen
anfangszeittime
NOTNULL
);
CREATETABLEteilnehmer(
vornametext
CHECK(vorname!=''),
nachnametext,
CHECK(vorname!=''),
matrikel_nrinteger
PRIMARYKEY,
--Attributefehlen
labortext
REFERENCESlabor_gruppe(code),
geschlechttext
REFERENCESgeschlecht(name)
ONUPDATECASCADE
);
ForeignKeys(onetomany)
Frage
Wirdhier0..1zuN
oder
1zuNumgesetzt?
CREATETABLElabor_gruppe(
codetext
PRIMARYKEY
CHECK(codeIN('w','x','y','z')),
--Attributefehlen
anfangszeittime
NOTNULL
);
CREATETABLEteilnehmer(
vornametext
CHECK(vorname!=''),
nachnametext,
CHECK(vorname!=''),
matrikel_nrinteger
PRIMARYKEY,
--Attributefehlen
labortext
REFERENCESlabor_gruppe(code),
geschlechttext
REFERENCESgeschlecht(name)
ONUPDATECASCADE
);
ForeignKeys(manytomany)
ForeignKeys(manytomany)
Umsetzungdurchneue"Beziehungs"-Relation
ForeignKeys(manytomany)
NeueTabelle,dieauf
diebeiden
existierenden
referenziert
PrimaryKeyder
neuenTabelleist
Kombinationder
PKsder
existierenden
Tabellen
CREATETABLEprojekt_gruppe(
titeltext
PRIMARYKEY
CHECK(titel!=''),
thematext
NOTNULL
DEFAULT''
);
CREATETABLElabor_uebung(
titeltext
PRIMARYKEY,
gestelltdate
NOTNULL
UNIQUE
);
CREATETABLElabor_abgabe(
gruppetext
REFERENCESprojekt_gruppe(titel),
uebungtext
REFERENCESlabor_uebung(titel),
PRIMARYKEY(gruppe,uebung)
);
VonAnfragenzuAbfragen
Anfragen
Z.b.WievielTeilnehmersindinmeinemKurs?
StaerkenrelationalerDatenbanken:
1. Persistente,sichereundstrukturierteDatenspeicherung
2. EffizienteAbfragenumAnfragenbeantwortenzukoennen!
StaerkenrelationalerDatenbanken:
1. Persistente,sichereundstrukturierteDatenspeicherung
2. EffizienteAbfragenumAnfragenbeantwortenzukoennen!
SQLhatnureinenBefehldafuer:
StaerkenrelationalerDatenbanken:
1. Persistente,sichereundstrukturierteDatenspeicherung
2. EffizienteAbfragenumAnfragenbeantwortenzukoennen!
SQLhatnureinenBefehldafuer:
SELECT
AnatomyvonSELECT
SELECT*--welcheSpaltensollenwieangezeigtwerden
FROMtabelle--DatenwelcherTabelle
WHEREtrue--Selektionesbedingungen:nurDaten,dieKriteriumentsprechen
AnatomyvonSELECT
SELECT*--welcheSpaltensollenwieangezeigtwerden
FROMtabelle--DatenwelcherTabelle
WHEREtrue--Selektionesbedingungen:nurDaten,dieKriteriumentsprechen
Kanngelesenwerdenals:
ZeigemiralleSpaltenderTabelle"tabelle"anunddavonalleZeilen.
AnatomyvonSELECT
SELECT*--welcheSpaltensollenwieangezeigtwerden
FROMtabelle--DatenwelcherTabelle
WHEREtrue--Selektionesbedingungen:nurDaten,dieKriteriumentsprechen
Kanngelesenwerdenals:
ZeigemiralleSpaltenderTabelle"tabelle"anunddavonalleZeilen.
DatenbankinterpretiertdasinderReihenfolgeFROM,WHERE,'*'(Spalten)
HoleausderTabelle"tabelle"alleZeilendiederBedingung'true'entsprechen
undzeigedavonalleSpaltenan.
KonkretesSELECT
SELECT*--*(asterisk)heisstallespalten,wiesiesind
FROM"teilnehmer";--DatenderTabellemitdemNamen"order"
BoolscheWHEREBedingungkannweggelassenwerden,wennmanalleZeilen
will.
SammelnvonAnfragen
Transaktion
EineTranskationisteineMengevonOperationendieatomic,consistent,
isoliertunddauerhaftsind(ACID).
ACID
AlleAenderungenmit
Chirurgischerintegritaetineinem
IsoliertemVorgangzusammengefasstundmit
DauerhaftemErgebnis.
DiewichtigstenEigenschaftenimEinzelnen:
Atomic
EineTransaktiongruppiertmehrereAnweisungenineineeinzigeatomare
Operationinder"AllesoderNichts”stattfindet.
Consistent
EineTransaktionbringteineDatenbankvoneinemkonsistentenZustandin
dennächsten.
Isolated
Transaktionistunabhängig,d.h.siewirdnichtdurchkonkurrierende
Transaktionenbeeinflusst.
Durable
BeidererfolgreichenBeendigungeinerTransaktionsindalleÄnderungen
dauerhaftgespeichert.
Konsistenzbeisehrvielengleichzeitigen
Aenderungen
Transaktionengarantieren,dasstrotzgleichzeitiger
AenderungenvonvielenverschiedenenBenuztern,alle
Aenderungenkonsistentsind.
TatsaechlichistjedeeinzelneSQL-Anweisungbeiden
meistenDatenbankimpliziteineeinzelneTransaktion,d.h.
eineGruppevonAnweisungenmitnureinerAnweisung
TransaktionmitmeherenAnweisungen
PostgreSQLDocumentationfuersyntaktischeDetailsundfortgeschrittene
Eigenschaften
Ausgangslage:DatenbankistineinemsupergutemZustand:Z1
--Transaktionwirdangefangen:
BEGIN;
SQLAnweisung1;
SQLAnweisung2;
...
SQLAnweisungN;
--Bleibtoffenbis:
COMMIT;
WennTransaktiongutlaeuft,d.h.alleAnweisungenkorrektsind:
DatenbankistineinemsupergutemZustand:Z2
WennTransaktionfehlschlaegt,d.h.nureinederAnweisungenzumFehler
fuehrt:
DatenbankwirdindenvorherigenZustandzurueckgesetzt(rollback):Z1
PostgreSQLDocumentationfuersyntaktischeDetailsundfortgeschrittene
GewollterTransaktionsabbruch
--Transaktionwirdangefangen:
BEGIN;
SQLAnweisung1;
SQLAnweisung2;
...
SQLAnweisungN;
--Bleibtoffenbis:
ROLLBACK;
WennTransaktionfehlschlaegtodererfolgreichist:
DatenbankwirdindenvorherigenZustandzurueckgesetzt(rollback):Z1
DDLEntwicklung
PostgreSQListeinerderwenigenDBMS,dieauchDDL
AnweisungeninTransaktionenausfuehrenkann
--Transaktionwirdangefangen:
BEGIN;
CREATETABLEtest(idintegerPRIMARYKEY);
INSERTINTOtestVALUES(1),(2),(3);
SELECT*fromtest;
UPDATEtestSETid=id+3;
SELECT*fromtest;
ROLLBACK;
Sehrnuetzlichfueriterative,evolutionaere
Datenbankentwicklung
DankefürdieZusammenarbeit
Anhang
AbfragenuebermehereTabellen
Revisited:AnatomyvonSELECT
SELECT*--welcheSpaltensollenwieangezeigtwerden
FROMtabelle--DatenwelcherTabelle
WHEREtrue--Selektionesbedingungen:nurDaten,dieKriteriumentsprechen
Kanngelesenwerdenals:
ZeigemiralleSpaltenderTabelle"tabelle"anunddavonalleZeilen.
Revisited:AnatomyvonSELECT
SELECT*--welcheSpaltensollenwieangezeigtwerden
FROMtabelle--DatenwelcherTabelle
WHEREtrue--Selektionesbedingungen:nurDaten,dieKriteriumentsprechen
Kanngelesenwerdenals:
ZeigemiralleSpaltenderTabelle"tabelle"anunddavonalleZeilen.
EswirdimmereineundnureineTabelledurchSELECTerzeugt,daheristdas
technischpraeziser:
ErzeugeundzeigmireinevirtuelleTabelle,diefolgenderAnweisungenpricht:
ZeigealleSpaltenderTabelle"tabelle"anunddavonalleZeilen.
Beispiel-Tabellen
TabelleATabelleB
idnameidname
-----------1Pirate1Rutabaga
2Monkey2Pirate
3Ninja3DarthVader
4Spaghetti4Ninja
INNERJOIN
SELECT*
FROMTabelleAASa
INNERJOIN
TabelleBasb
ONa.name=b.name
idnameidname
-----------1Pirate2Pirate
3Ninja4Ninja
FULLOUTERJOIN
SELECT*
FROMTabelleAasa
FULLOUTERJOIN
TabelleBasb
ONa.name=b.name
idnameidname
-----------1Pirate2Pirate
2Monkeynullnull
3Ninja4Ninja
4Spaghettinullnull
nullnull1Rutabaga
nullnull3DarthVader
LEFTOUTERJOIN
SELECT*
FROMTabelleAASa
LEFTOUTERJOIN
TabelleBASb
ONa.name=b.name
idnameidname
-----------1Pirate2Pirate
2Monkeynullnull
3Ninja4Ninja
4Spaghettinullnull
LEFTOUTERJOIN:nurZeilenvonTabelleA
SELECT*
FROMTabelleAASa
LEFTOUTERJOIN
TabelleBASb
ONa.name=b.name
WHEREb.idISnull
idnameidname
-----------2Monkeynullnull
4Spaghettinullnull
FULLOUTERJOIN:nurexklusiveZeilen
SELECT*
FROMTabelleAASa
FULLOUTERJOIN
TabelleBASb
ONa.name=b.name
WHEREa.idISnull
OR
b.idISnull
idnameidname
-----------2Monkeynullnull
4Spaghettinullnull
nullnull1Rutabaga
nullnull3DarthVader
CROSSJOIN:ErzeugtkartesichesProdukt
SELECT*
FROMTabelleA
CROSSJOIN
TabelleB
IneinfachenWorten:VerbindetjedeZeilederTabelleAmitjederZeileder
TabelleB
DiskussionzuVisualisierungvonSQL-joins
OriginalArtikelmitVenn-Overview
DiskussionundalternativeDarstellung
KategorisierungnachJOIN-Typen
Normalisierung
MeineVorgehensweise
Alleswas,gemaessdenAnforderungen,eigenstaendigund
unabhängigvonexisiterenedenEntitaetengemanaged
werdenmuss,isteineneueeigenstaendigeEntitaet.
Managenheisst:AlleswaszuunterschiedlichenZeiten
erstinsSystemkommtundeigeneinsert,update,und
deleteRegelnhat.
Appendix
MotherCelko'sThirteenNormalizationHeuristics
1. Doesthetablemodeleitherasetofoneandonlyonekindof
entityoroneandonlyonerelationship.ThisiswhatIcall
disallowinga“Automobiles,SquidsandLadyGaGa”table.
Followingthisrulewillprevent‘Multi-valueddependencies’
(MVD)problemsanditisthebasisfortheotherheuristics.
2. Doestheentitytablemakesense?Canyouexpresstheideaof
thetableinasimplecollectiveorpluralnoun?Tobeistobe
somethinginparticular;tobeeverythingingeneralor
nothinginparticularistobenothingatall(thisisknownas
theLawofIdentityinGreeklogic).ThisiswhyEAVdoesnot
work–itiseverythingandanything.
3. Doyouhavealltheattributesthatdescribethethinginthe
table?Ineachrow?Themostimportantlegonathree-legged
stoolisthelegthatismissing.
1. Areallthecolumnsscalar?Orisacolumnservingmorethan
onepurpose?Didyouactuallyputhatsizeandshoesizein
onecolumn?OrstoreaCSVlistinit?
2. Donotstorecomputedvalues,suchas(unit_price*
order_qty).YoucancomputethesethingsinVIEWsor
computedcolumns.
3. Doestherelationshiptablemakesense?Canyouexpressthe
ideaofthetableinasimplesentence,orevenbetter,aname
fortherelationship?Therelationshipis“marriage”andnot
“person_person_legal_thing”
4. Didyouchecktoseeiftherelationshipis1:1,1:morn:m?
Doestherelationshiphaveattributesofitsown?Amarriage
hasadateandalicensenumberthatdoesnotbelongto
eitherofthepeopleinvolved.Thisiswhywedon'tmind
tablesthatmodel1:1relationships.
1. Doestheentityorrelationshiphaveanaturalkey?Ifitdoes,
thenyouabsolutelyhavetomodelitasthePRIMARYKEYor
aUNIQUEconstraint.Isthereastandardindustryidentifier
forit?Letsomeoneelsedoallthatworkforyou.
2. IfyouhavealotofNULL-ablecolumns,thetableisprobably
notnormalized.
3. TheNULLscouldbenon-relatedentitiesorrelationships.
4. DotheNULLshaveoneandonlyonemeaningineach
column?
5. Ifyouhavetochangemorethanonerowtoupdate,insertor
deleteasimplefact,thenthetableisnotnormalized.
6. Didyouconfuseattributes,entitiesandvalues?Wouldyou
splitthePersonneltableinto“Male_Personnel”and
”Female_Personnel”bysplittingoutthesexcode?No,sexis
anattributeandnotanentity.Wouldyouhaveacolumnfor
eachshoesize?No,ashoesizeisavalueandnotan
attribute.
Herunterladen