Vensl (e. relation)
Vensl er mengi n-da $(d_1, d_2, \ldots , d_n)$ þar sem hvert stak $d_j$ tilheyrir tilteknu óðali $D_j$.
N-d (e. tuple)
N-d (borið fram sem “ennd”) er endanlegur raðaður listi af $N$ stökum $(d_1, d_2, \ldots , d_N)$.
Eigindi (e. attribute)
Eigindi er nafn ásamt óðali.
Óðal (e. domain)
Óðal er mengi allra þeirra gilda sem tiltekið stak má innihalda.
Fallaákveða (e. functional dependency) á vensli $R$ er skilyrði sem segir að allar n-dir í $R$ sem hafa sömu gildi á einindunum $A_1 \cdots A_n$ verða að hafa sömu gildi á einindunum $B_1 \cdots B_m$. Slík fallaákveða er rituð $A_1 A_2 \ldots A_n \rightarrow B_1 B_2 \ldots B_m$ þar sem $A_i$ og $B_i$ eru einindi í $R$.
Ef $\{B_1, B_2 \ldots B_m\} \subseteq \{A_1, A_2 \ldots A_n\}$ þá er talað um ómarkverða (e. trivial) fallaákveðu.
Setning (samsetning fallaákveðna)
Fallaákveðan $A_1 A_2 \ldots A_n \rightarrow B_1 B_2 \ldots B_m$ er jafngild eftirfarandi fallaákveðum
$$A_1 A_2 \ldots A_n \rightarrow B_1$$ $$A_1 A_2 \ldots A_n \rightarrow B_2$$ $$\vdots$$ $$A_1 A_2 \ldots A_n \rightarrow B_m$$
Lokun af eigindum $\{A_1, A_2, \ldots , A_n\}$ undir mengi af fallaákveðum $S$ er mengi allra eiginda $B$ þannig að sérhvert vensl sem uppfyllir fallaákveðurnar í $S$ uppfyllir einnig $A_1 A_2\cdots A_n \rightarrow B$. Við táknum lokunina með $\{A_1, A_2, \ldots , A_n\}^+$
Reiknirit (lokun af mengi fallaákveða)
Finna má lokunina $\{A_1, A_2, \ldots , A_n\}^+$ undir mengi fallaákveðna $S$ með eftirfarandi aðferð
Þá er $X$ lokunin.
Setning (gegnvirkni á fallaákveðum)
Ef $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ og $B_1 B_2 \cdots B_m \rightarrow C_1 C_2 \cdots C_k$ eru fallaákveður sem gilda á vensli $R$. Þá gildir einnig fallaákveðan
$$A_1 A_2 \cdots A_n \rightarrow C_1 C_2 \cdots C_k$$
Reiknirit (vörpun á fallaákveðum)
Höfum vensl $R$ og mengi fallaákveða $F$. Vörpum fallaákveðunum úr $F$ yfir á vensl $R_1$.
Þekja (e. basis) fyrir mengi fallaákveða $S$ er mengi af fallaákveðum $F$ þannig að sérhver fallaákveða í $S$ sé afleiðing af fallaákveðunum í $F$.
Lágþekja (e. minimal basis) fyrir $S$ er mengi af fallaákveðum $F$ þannig að sérhvert hlutmengi í $F$ er ekki þekja fyrir $S$.
Reiknirit (lágþekja fyrir mengi fallaákveða)
Þá stendur eftir lágþekja $F$.
Frávik (e. anomalies) eru óæskilegir eiginleikar sem koma upp þegar reynt er að koma of mörgum eigindum fyrir í einu vensli.
Þegar vensli $R$ er skipt niður í nokkur vensli $R_1, R_2, \ldots , R_n$ er talað um þáttun. Til dæmis má þátta $R(A,B,C)$ niður í $R_1(A,B)$ og $R_2(A,C)$. Þegar vensli er þáttað er mögulegt að einhverjar upplýsingar um uppbyggingu á $R$ glatist. Þáttanir eru vanalega gerðar með eina eða fleiri af eftirfarandi kröfum í huga.
BCNF (Boyce Codd Normal Form)
Vensli $R$ er á Boyce Codd staðalformi ef og aðeins ef eftirfarandi gildir.
Fyrir sérhverja markverða fallaákveðu $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ á $R$ gildir að $\{A_1, A_2 , \ldots , A_n \}$ er yfirlykill fyrir $R$.
Reiknirit (þáttun á BCNF form)
Byrjum með vensli $R$ og mengi fallaákveða $S$. Framkvæmum eftirfarandi skref endurkvæmt.
Þegar vensli $R$ er þáttað á BCNF form er ekki víst að allar fallaákveður muni varðveitast. Hinsvegar munu engin frávik birtast í þáttuninni og BCNF þáttun er ávallt taplaus.
Við þáttun þarf stundum að velja á milli þess að varðveita allar fallaákveður eða halda þáttuninni á BCNF formi. 3NF er slakari útgáfa af BCNF sem varðveitir alltaf fallaákveður.
3NF (Third Normal Form)
Vensli $R$ er á þriðja staðalformi ef og aðeins ef eftirfarandi gildir.
Fyrir sérhverja markverða fallaákveðu $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ á $R$ gildir að
$$\{A_1, A_2 , \ldots , A_n \}$$
er annað hvort yfirlykill eða einindin í $A \setminus B$ tilheyra einhverjum lykli í $R$.
Reiknirit (þáttun á 3NF form)
Eftir að vensl $R$ hefur verið þáttað niður í vensl $R_1, R_2, \ldots , R_n$ er ekki víst að hægt sé að endurbyggja $R$ út frá þáttuninni. Ef það er hægt er talað um taplausa tengingu (e. lossless join)
Mögulegur lyklill (e. candidate key)
Mengi eiginda $A = \{A_1, A_2, \ldots , A_n\}$ er sagt vera mögulegur lykill (stundum bara lykill) fyrir vensl $R$ ef
Yfirlykill (e. superkey)
Mengi eiginda $A = \{A_1, A_2, \ldots , A_n\}$ er sagt vera yfirlykill ef það uppfyllir fyrra skilyrðið á mögulegum lykli, þ.e. $A^+ = R$.
Af þessu er ljóst að allir mögulegir lyklar eru yfirlyklar, en yfirlykill þarf ekki að vera mögulegur lykill.
Aðallykill (e. primary key)
Aðallykill er einn af mögulegum lyklum fyrir vensl $R$. Vensl $R$ getur aðeins haft einn aðallykil. Aðrir mögulegir lyklar eru stundum nefndir varalyklar (e. alternate key)
Aðallykill er með öðrum orðum einhver einn mögulegur lykill sem hefur verið valinn af handahófi.
Í SQL geta eigindi tekið gildið NULL, sem er ekki það sama og 0 (ef eigindið er INTEGER) eða tómur strengur (ef eigindið er TEXT). Það getur haft nokkrar merkingar, tökum sem dæmi eigindi phoneNumber
Þegar reikniaðgerð er beitt á NULL er útkoman alltaf NULL. Til dæmis ef x = NULL þá er bæði 0*x = NULL og x-x = NULL.
Þegar eigindi taka gildið NULL þýðir það í vissum skilningi að gildið er ekki vitað. Þar með getur yrðing á borð við NULL == “strengur” hvorki tekið gildi TRUE né FALSE, heldur tekur hún gildið UNKNOWN.
Þrígild rökfræði vinnur með TRUE, FALSE og UNKNOWN. Mikilvægt er að vita hvernig aðgerðir eins og AND, OR og NOT hegða sér með UNKNOWN.
Skorðun (e. restrict)
Skilar vensli sem inniheldur allar n-dir úr vensli sem uppfylla ákveðið skilyrði. Táknað með $\sigma_{a \theta b}( R )$ eða $\sigma_{a \theta v}( R )$ þar sem
Vörpun (e. projection)
Skilar vensli sem inniheldur allar hlut n-dir sem verða eftir þegar ákveðin eigindi eru fjarlægð úr vensli $R$. Táknað með $\Pi_{a_1, \ldots,a_n}( R )$ þar sem $a_1,\ldots,a_n$ eru þau eigindi sem standa eftir.
Földun (e. product)
Intersect
Union
Difference
Join
Divide
Náttúruleg tenging
Náttúruleg tenging
Theta tenging
Ytri tenging
Vinstri ytri tenging ($⟖$)
Skorður (e. contraints) eru notaðar til að takmarka hvaða gildi eindir mega taka.
NOT NULL
UNIQUE
CHECK
CREATE ASSERTION
Gikkir (e. triggers) eru aðgerðir sem eru framkvæmdar við ákveðna atburði (e. events)
CREATE [DEFINER = USER] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
Í hvert sinn sem starfsmanni er bætt við fá núverandi starfsmenn launahækkun sem jafngildir 10% af launum nýja starfsmannsins.
CREATE TABLE salary (employee_id INT, salary DECIMAL(10,2));
CREATE TRIGGER salary_bonus BEFORE INSERT ON salary FOR EACH ROW SET salary = salary + 0.1*NEW.salary;
Við hönnun á gagnagrunni er algengt að setja fram almennt líkan áður en það er útfært í ákveðnu SQL kerfi. Eininda-vensla líkön (e. entity-relation model) eru eitt dæmi um slíkt, gjarnan sett fram með einindavenslariti (e. E/R diagram)
Eininda-vensla líkön eru samansett úr eftirfarandi einingum
Aðallykill er táknaður með undirstrikuðum nöfnum á eiginleikum.
Vensl hafa vanalega skorður á fjölda. Algengasta gerðin af venslum eru tvíundarvensl sem eru sambönd á milli tveggja eininda.
Hér verður farið í ýmsar tæknilegar hliðar á útfærslum gagnagrunnskerfa.
Færslur (e. transactions)
Lásar (e. locks).
Sjálfhelda (e. dead-lock)
ANSI SQL
Statement createStatement()
Skilar Statement klasa.
PreparedStatement prepareStatement(String sql)
Tekur inn sql fyrirspurn sem inniheldur eitt eða fleiri spurningarmerki. Skilar PreparedStatement klasa.
ResultSet executeQuery(String sql)
Keyrir sql fyrirspurn og skilar niðurstöðum sem ResultSet klasa.
int executeUpdate(String sql)
Keyrir sql fyrirspurn sem skilar engu, t.d. INSERT, UPDATE eða DELETE. Skilar fjölda raða í niðurstöðu, vanalega núll.
void close()
Lokar á Statement og sleppir takinu af gagnagrunninum.
void setInt(int n, int x)
Gerir spurningarmerki númer $n$ að gildinu $x$. Skilar engu.
void setString(int n, String x)
Gerir spurningarmerki númer $n$ að gildinu $x$. Skilar engu.
ResultSet executeQuery()
Keyrir fyrirspurnina og skilar niðurstöðum.
int executeUpdate()
Keyrir fyrirspurnina og skilar fjölda raða í niðurstöðu. Yfirleitt notað fyrir INSERT, UPDATE og DELETE sem skila engu.
String getString(String columnLabel)
Skilar strengnum í dálki columnLabel úr núverandi röð.
int getInt(String columnLabel)
Skilar tölunni í dálki columnLabel úr núverandi röð.
boolean next()
Færir bendilinn (e. cursor) yfir á næstu röð og skilar true, annars false ef engin röð er eftir.
void close()
Lokar ResultSet og sleppir gagnagrunni.