$$
t : R \to \bigcup\limits_{i = 1}^n dom(A_i) : A_i \mapsto a \in dom(A_i)
$$
If $X \subseteq R$ and $t_1$ and $t_2$ are two tuples on $R$, $t_1$ and $t_2$ coincide on $X$ $(t_1[X] = t_2[X])$ if $\forall A \in X t_1[A] = t_2[A]$
If $X \subseteq R$ and $t_1$ and $t_2$ are two tuples on $R$, if $\forall A \in X, t_1[A] = t_2[A] \implies t_1[X] = t_2[X]$
Given a relation schema $R$, a functional dependency on $R$ is an ordered pair of non-empty subsets X, Y ⊆ R
Given a relation schema $R$ and $X, Y \subseteq R : X \neq \varnothing \land Y \neq \varnothing \implies (X, Y) = X \to Y$ is a functional dependency on $R$
> NOTE: the definition of functional dependency doesn't depend on the concept of instance, as a functional dependency is just an ordered pair of non-empty subsets of $R$; it's important to understand the concept that $r$ may or may not satisfy $X \to Y$
it satisfies all dependencies in $F$
# How big is $F^+$?
Given a relation schema $R$ such that $|R| = n$, let's consider the definition of functional dependency: we need $X, Y \in \mathcal{P}(R) \setminus \varnothing$, given that $|\mathcal{P}(R)| = 2^n$ we could have $2^n - 1$ choices for $X$ and $Y$. Given that we could pair the subsets however we want, we have $(2^n - 1)(2^n - 1) = 2^{2n} - 2\cdot 2^n + 1 = \\ =2^{2n} - 2^{n + 1} + 1$ combinations
Let's consider the smallest possible $F = \varnothing$, how many values does $F^+$ have?
---
By definition an instance $r$ of $R$ satisfies a dependency $X \to Y$ if $\forall t_1, t_2 \in r, t_1[X] = t_2[X] \implies t_1[Y] = t_2[Y]$
$X \to Y, X \to Z \in F^A \implies X \to YZ \in F^A$
TODO check if subseteq? NOT needed because X is a proper subset of K
PDF 10 slide 6
Let $R$ be a relation schema and $F$ a set of functional dependencies on $R$. A schema $R$ is in 3NF if and only if neither partial dependencies nor transitive dependencies exist in $F$
> TODO: example that show that not all relation schemas can be reduced to 3NF
$Z_0 = X \subseteq (X)^+_F \implies Z_0 \subseteq (X)^+_F$
### Inductive step
We have to prove that $Z_i \subseteq (X)^+_F \implies Z_{i + 1} \subseteq (X)^+_F$
and $S_i = \set{A \in R \mid Y \to V \in F \land Y \subseteq Z_i \land A \in V}$
If the intersection of these sets determines $R$, then the intersection is the only key to $R$ else there are multiple keys, and ALL of them must be identified for checking 3NF
S = { A ∈ R | Y → V ∈ F ∧ Y ⊆ Z ∧ A ∈ V }
# return X if S ⊆ X else closure(R, F, X ∪ S)
PDF 13 slide 19
return X if S ⊆ X else closure_G(R, F, X ∪ S)
the final values of $Z$ and $S$
# $X \subseteq Y \implies (X)^+_F \subseteq (Y)^+_F$ _(alternative)_
Let $X_i, Y_i$ the values of the clousure after the $i$-th application of the algorithm `closure()`
### Base case
$X_0 = X \subseteq Y = Y_0$
### Inductive step
$X_i \subseteq Y_i \implies X_{i + 1} \subseteq Y_{i + 1}$
$A \in X_{i + 1}$, given that $X_{i + 1} = X_i \cup S^X_i \land S^X_i = \set{A \mid V \to W \in F \land V \subseteq X_i \land A \in W} \implies$ by HP $V \subseteq Y_i \implies W \subseteq S^Y_i \implies$ by decomposition, and given that $Y_{i + 1} = Y_i \cup S^Y_i \implies A \in Y_{i + 1}$
---
If we decompose a relation schema $R$ we want the obtained decomposition $\rho = \set{R_1, R_2, ..., R_k}$ such that each legal instance $r$ of $R$ can be reconstructed through natural join from legal instnaces $r_1, r_2, ..., r_k$
ρ = R1 , R2 , ..., Rk , such that each legal instance r of R can be reconstructed through natural join from the legal instances r1 , r2 , ..., rk of the decomposition schemas R1 , R2 , ..., Rk as for reconstructing a tuple t of r it is required that t[Ri ] ∈ ri , ∀ i = 1,...,k, then we must have πRi(r) = ri , ∀ i = 1,...,k
$t \in r \implies t[R_i] = \set{(A, t[A]) \mid A \in R_i}$
Let's define the $\bowtie$ operator $R \bowtie S = \set{t_1 \cup t_2 \mid t_1 \in r \land t_2 \in s \land t_1 \cup t_2 \text{ is a function}}$
$\forall t \in r, \; t = \bigcup\limits_{i = 1}^k t[R_i] = \mathop{\bowtie}\limits_{i = 1}^k \set{ t[R_i] }$
---
# Physical organization
- Heap
- Sequential
- Random (hashing)
- Indexed Sequential
- List Data
- Secondary Indexes _(and inverted files)_
- $B$-Tree
- $B^+$-tree
---
# Hark Disk
## Reading cost
**service time** = seek time + rotational delay + service time
response time = queueing time + **service time**
A physical organization can optimize record lookup, as we can read from the disk either **randomly** or **sequentially** _(which is faster, as we don't have to account for seek time)_
---
# Heap
New records are inserted at the end of the file
Linear search is the only option for records retrieval
The `linear_search()` function has $O(\frac{\#Blk}{2})$ average complexity
The `insert()` function has $O(1)$ complexity
---
# Sequential
Records are sorted based on key
The `binary_search()` function has $O(log_2(\#Blk))$ complexity with random access
The `linear_search()` function has $O(\frac{\#Blk}{2})$ complexity with sequential access
The `insert()` function has $O(n \cdot log_2(n))$ complexity
> TODO: Slide 20
---
# Hashing
`hash(key) -> address` function, it uses buckets. Collitions can occur. `%` is kinda cool, better if $n$ is prime
**Loading Factor**: average number of records per bucket divided by bucket size
- tradeoff between efficient use of storage capacity and retrieval performance
# ISAM (Indexed Sequential Access Method)
It's basically sequential file organization with an index before
> TODO research on loading factor
Slide 40
---
# Concorrenza
[PDF 22 slide 5](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=5)
**Transazione** - esecuzione di una parte di un programma che rappresenta un’unità logica di accesso o modifica del contenuto della base di dati
[PDF 22 slide 6](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=6)
**ACID** - Atomicity, Consistency, Isolation e Durability
[PDF 22 slide 7](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=7)
**Schedule** - (piano di esecuzione) di un insieme $T$ di transazioni ordinamento delle operazioni nelle transazioni in $T$ che conserva l’ordine che le operazioni hanno all’interno delle singole transazioni
[PDF 22 slide 8](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=8)
**Schedule seriale** - schedule ottenuto permutando le transazioni in T
---
# Schedule
[PDF 22 slide 15](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=15)
Tutti gli schedule seriali sono corretti. Uno schedule non seriale è corretto se è serializzabile, cioè se è “equivalente” ad uno schedule seriale.
**Possibili problemi**
- aggiornamento perso
- dato sporco
- aggregato non corretto
[PDF 22 slide 19](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=19)
Due schedule sono **equivalenti** se (per ogni dato modificato) producono valori uguali, dove due valori sono uguali solo se sono prodotti dalla stessa sequenza di operazioni
---
# Item
[PDF 22 slide 24](22%20-%20Il%20controllo%20della%20concorrenza.pdf#page=24)
**Item** - unità a cui l’accesso è controllato
Le **dimensioni** degli item devono essere definite in base all’uso che viene fatto della base di dati in modo tale che in media una transazione acceda a pochi item _(granularità)_
# Lock
[PDF 23 slide 2](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=2)
**Lock** - privilegio di accesso ad un singolo item realizzato mediante una variabile associata all’item (variabile lucchetto) il cui valore descrive lo stato dell’item rispetto alle operazioni che possono essere effettuate su di esso
---
# Lock pt.2
[PDF 23 slide 6](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=6)
Uno schedule è detto **legale** se una transazione effettua un locking ogni volta che deve leggere o scrivere un item ciascuna transazione rilascia ogni lock che ha ottenuto
[PDF 23 slide 31](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=31)
Uno schedule è serializzabile se esiste uno schedule seriale
tale che per ogni item l’ordine in cui le varie transazioni fanno un lock su quell’item coincide con quello dello schedule seriale
[PDF 23 slide 32](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=32)
Algoritmo 1
Dato uno schedule S
• Passo 1
• crea un grafo diretto G (grafo di serializzazione)
nodi: transazioni
archi: Ti
Tj
(con etichetta X) se in S Ti esegue un
unlock(X) e Tj esegue il successivo lock(X)
non UN successivo ma IL successivo, cioè Tj è la prima
transazione che effettua il lock di X dopo che Ti ha
effettuato l’unlock, anche se le due operazioni non sono
di seguito
---
# Serializzabilità
[PDF 23 slide 38](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=38)
Uno schedule $S$ è serializzabile $\iff$ il suo grafo di serializzazione è aciclico
[PDF 23 slide 42](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=42)
Una transazione obbedisce al protocollo di locking a due fasi, o più semplicemente è a due fasi, se
- prima effettua tutte le operazioni di lock (fase di
locking) e
- poi tutte le operazioni di unlock (fase di
unlocking)
[PDF 23 slide 43](23%20-%20Il%20meccanismo%20di%20lock%20–%20Lock%20binario.pdf#page=43)
Sia $T$ un insieme di transazioni. Se ogni transazione in $T$ è a due fasi $\implies$ ogni schedule di $T$ è serializzabile
---
# Lock a 3 valori
[PDF 24 slide 7](24%20-%20Lock%20a%20tre%20valori.pdf#page=7)
Due schedule sono equivalenti se
- producono lo stesso valore per ogni item su cui viene effettuato un wlock (le formule che danno i valori finali per ciascun item sono le stesse)
- ogni operazione rlock(X) legge lo stesso valore di X nei due schedule
Testare la serializzabilità
Algoritmo
Dato uno schedule S
• Passo 1
• crea un grafo diretto G (grafo di serializzazione)
nodi: transazioni
archi: Ti
Tj
(con etichetta X) se in S
- Ti esegue una rlock(X) o una wlock(X) e Tj è la
transazione che esegue la successiva wlock(X)
- Ti esegue una wlock(X) e Tj esegue una
rlock(X) dopo che Ti ha eseguito la wlock(X) e
prima che un’altra transazione esegua una
wlock(X).
O Tj esegue la successiva wlock (dopo una rlock o una wlock, è indifferente)
oppure esegue la rlock tra due wlock (potrebbero esserci più rlock tra
due wlock e quindi più archi che partono da Ti
)
---
# Lock a 3 valori pt.2
Una transazione nel modello a tre valori è a due fasi se nessuna operazione di lock (rlock o wlock) segue una operazione di unlock
- Se ogni transazione in un insieme T è a due fasi allora
ogni schedule di T è serializzabile
- Solo se tutte le transazioni sono a due fasi possiamo
avere la certezza che ogni schedule è serializzabile
[PDF 25 slide 16]
Algoritmo 2
• Dato uno schedule S
• Passo 1
• crea un poligrafo diretto P
nodi: transazioni+T0+Tf
archi
• vengono creati gli archi in accordo al vincolo 1: se una
transazione T2
legge il valore di un item X scritto da una
transazione T1
viene aggiunto l’arco T1
T2
• vengono eliminati tutti gli archi entranti in transazioni inutili
(una transazione inutile T può essere individuata facilmente
perché non c’è nessun cammino in P da T a Tf
)
---
# Deadlock
[PDF 26 slide 2](26%20-%20Deadlock%20e%20livelock%20-%20Protocollo%20di%20locking%20a%20due%20fasi%20stretto.pdf#page=2)
Un deadlock si verifica quando
- ogni transazione in un insieme T è in attesa di ottenere un lock su un item sul quale qualche altra transazione nell’insieme T mantiene un lock e quindi
- rimane bloccata e quindi
- non rilascia i lock e quindi
- può bloccare anche transazioni che non sono in T
---
# Timestamp
[PDF 27 slide 2](27%20-%20Time-stamp.pdf#page=2)
Il timestamp identifica una transazione è assegnato alla transazione dallo scheduler quando la transazione ha inizio può essere
- il valore di un contatore
- l’ora di inizio della transazione
[PDF 27 slide 4](27%20-%20Time-stamp.pdf#page=4)
Uno schedule è serializzabile se è equivalente allo schedule seriale in cui le transazioni compaiono ordinate in base al loro timestamp
---
# Timestamp pt.2
[PDF 27 slide 4](27%20-%20Time-stamp.pdf#page=5)
Quindi uno schedule è serializzabile se: per ciascun item acceduto da più di una transazione, l’ordine con cui le transazioni accedono all’item è quello imposto dai timestamp
$$
$$