Formulas, algorithms, and key facts for last-minute revision.
Record size (R) = sum of all field sizes
Blocking factor (bfr) = ⌊Block size (B) / Record size (R)⌋
Number of blocks = ⌈Number of records (r) / bfr⌉
Binary search accesses = ⌈log₂(number of blocks)⌉
Index entry size = Key size + Pointer size
Index blocking factor (bfr_i) = ⌊B / index entry size⌋
First-level index entries = number of data blocks (for sparse) or records (for dense)
First-level index blocks = ⌈index entries / bfr_i⌉
Level 1 blocks = ⌈first-level entries / bfr_i⌉
Level k blocks = ⌈Level (k-1) blocks / bfr_i⌉
Stop when level has 1 block
Total accesses = number of levels + 1 (for data block)
For non-leaf: (n-1) keys + n pointers fit in one block
n × P + (n-1) × K ≤ B
n = ⌊(B + K) / (K + P)⌋
For leaf: (n-1) keys + (n-1) data pointers + 1 sibling pointer
(n-1) × (K + P_data) + P_sibling ≤ B
n-1 = ⌊(B - P) / (K + P_data)⌋
Non-leaf: min ⌈n/2⌉ children, max n children
Leaf: min ⌈(n-1)/2⌉ keys, max (n-1) keys
Root: min 2 children (if non-leaf), min 1 key (if leaf)
Max height for N records:
h ≤ ⌈log_⌈n/2⌉(N / ⌈(n-1)/2⌉)⌉ + 1
Accesses for search = height + 1 (for data block)
Input: Set of FDs F, attribute set X
Output: X⁺
X⁺ = X
repeat:
for each FD (Y → Z) in F:
if Y ⊆ X⁺:
X⁺ = X⁺ ∪ Z
until X⁺ does not change
Check BCNF: For every non-trivial FD X → A, is X a superkey?
Yes → BCNF (also 3NF, 2NF, 1NF)
No → Check 3NF: Is A a prime attribute?
Yes for all violating FDs → 3NF
No → Check 2NF: Is there partial dependency?
No partial dependency → 2NF
Partial dependency exists → only 1NF
R decomposed into R1 and R2 is lossless iff:
(R1 ∩ R2) → R1 OR (R1 ∩ R2) → R2
i.e., common attributes form a superkey of at least one sub-relation
For every non-trivial MVD X →→ Y:
X must be a superkey
MVD semantics: "For a given X value, the set of Y values
is independent of the set of (R - X - Y) values"
Read(X) by T:
if TS(T) < W-TS(X): REJECT (rollback T, restart with new TS)
else: allow, set R-TS(X) = max(R-TS(X), TS(T))
Write(X) by T:
if TS(T) < R-TS(X): REJECT (rollback T)
if TS(T) < W-TS(X): Thomas Write Rule — skip write (don't reject)
else: allow, set W-TS(X) = TS(T)
Recoverable: If Ti reads from Tj, then commit(Tj) < commit(Ti)
Cascadeless: Ti reads X only after the Tj that last wrote X has committed
Strict: Ti cannot read or write X until writer Tj commits/aborts
Strict ⊂ Cascadeless ⊂ Recoverable ⊂ All schedules
[START Ti]
[Ti, X, old_value, new_value]
[COMMIT Ti]
[ABORT Ti]
[START CKPT (list of active transactions)]
[END CKPT]
For query point Q = (qx, qy) and MBR [xmin, xmax, ymin, ymax]:
dx = xmin - qx if qx < xmin
0 if xmin ≤ qx ≤ xmax
qx - xmax if qx > xmax
(same for dy)
MINDIST = √(dx² + dy²)
If MINDIST > current best distance → prune this subtree