vaseis-dedomenon

Βοηθός για το μάθημα Βάσεις Δεδομένων - μοντέλο οντοτήτων-συσχετίσεων (ER/EER) και μετατροπή σε σχεσιακό, συναρτησιακές εξαρτήσεις, κλειστότητα, υποψήφια κλειδιά, ελάχιστη κάλυψη και κανονικοποίηση 2N

SKILL.md

GitHub

Βάσεις Δεδομένων

Απαντάς στα ελληνικά. Οι όροι στα αγγλικά την πρώτη φορά. Σε βαθμολογούμενες ασκήσεις ισχύει η πολιτική του μαθήματος (δες kathigitis-kodika).

1. Κανονικοποίηση: λύνεις με βήματα, επαληθεύεις με εργαλείο

Η κανονικοποίηση είναι εύκολο να λυθεί λάθος με το μάτι. Δείξε πάντα τα βήματα και επαλήθευσε με το scripts/fd.py:

F="A->B; B->C; C,D->E"
python3 scripts/fd.py closure --rel ABCDE --fd "$F" --attrs AD   # κλειστότητα με βήματα
python3 scripts/fd.py keys    --rel ABCDE --fd "$F"              # υποψήφια κλειδιά
python3 scripts/fd.py cover   --rel ABCDE --fd "$F"              # ελάχιστη κάλυψη (3 βήματα)
python3 scripts/fd.py nf      --rel ABCDE --fd "$F"              # 1NF/2NF/3NF/BCNF και γιατί
python3 scripts/fd.py bcnf    --rel ABCDE --fd "$F"              # διάσπαση BCNF + έλεγχος απωλειών
python3 scripts/fd.py 3nf     --rel ABCDE --fd "$F"              # σύνθεση 3NF
python3 scripts/fd.py implies --rel ABCDE --fd "$F" --test "A->C"

Γνωρίσματα με ονόματα: --multi --rel "emp_id, name, dept, dname" --fd "emp_id->name,dept; dept->dname".

Μέθοδος με το χέρι:

  1. Κλειδιά: όσα γνωρίσματα δεν εμφανίζονται ποτέ δεξιά ανήκουν σε κάθε κλειδί. Ξεκίνα από αυτά και πρόσθεσε τα λιγότερα δυνατά μέχρι η κλειστότητα να δώσει όλη τη σχέση.
  2. 2NF: κανένα μη πρωτεύον γνώρισμα δεν εξαρτάται από γνήσιο υποσύνολο κλειδιού.
  3. 3NF: για κάθε X → A: το X είναι υπερκλειδί ή το A είναι πρωτεύον.
  4. BCNF: για κάθε μη τετριμμένη X → A: το X είναι υπερκλειδί.
  5. Διάσπαση BCNF: για παραβίαση X → Y: R₁ = X⁺, R₂ = R − (X⁺ − X). Επανάληψη. Χωρίς απώλειες πάντα, αλλά όχι πάντα με διατήρηση εξαρτήσεων.
  6. Σύνθεση 3NF: ένα σχήμα ανά ομάδα της ελάχιστης κάλυψης με κοινό αριστερό μέλος, + ένα κλειδί αν κανένα σχήμα δεν το περιέχει, μετά αφαίρεση σχημάτων που περιέχονται σε άλλα.

Συχνά λάθη: ξεχνάς ότι μπορεί να υπάρχουν πολλά κλειδιά, συγχέεις υπερκλειδί με υποψήφιο κλειδί, θεωρείς ότι η BCNF διατηρεί πάντα τις εξαρτήσεις.

2. Μοντέλο ER → σχεσιακό

Στοιχείο ER Μετατροπή
Ισχυρή οντότητα Πίνακας, πρωτεύον κλειδί = κλειδί οντότητας
Ασθενής οντότητα Πίνακας με PK = μερικό κλειδί + PK ιδιοκτήτη (FK, ON DELETE CASCADE)
Συσχέτιση 1:1 FK στη μία πλευρά (κατά προτίμηση με ολική συμμετοχή), UNIQUE
Συσχέτιση 1:N FK στην πλευρά του N
Συσχέτιση M:N Νέος πίνακας με PK = (FK₁, FK₂) + γνωρίσματα της συσχέτισης
Πλειότιμο γνώρισμα Νέος πίνακας (FK, τιμή)
Σύνθετο γνώρισμα Ξεχωριστές στήλες
Παραγόμενο γνώρισμα Συνήθως δεν αποθηκεύεται (view ή υπολογισμός)
Γενίκευση/εξειδίκευση (α) πίνακας ανά υποκλάση με FK στην υπερκλάση, (β) ένας πίνακας με στήλη τύπου, (γ) πίνακες μόνο για υποκλάσεις. Εξήγησε τα trade-offs

Για διαγράμματα πρότεινε Mermaid erDiagram (δες markdown-mermaid-writing) ή dbdiagram.io / draw.io.

3. SQL

Γράφε SQL που δοκιμάζεται: δώσε CREATE TABLE + λίγα INSERT + το ερώτημα + την αναμενόμενη έξοδο, ώστε να τρέξει σε SQLite/PostgreSQL. Αν έχεις shell, τρέξ' το (sqlite3 :memory: ή psql).

Δομή απάντησης για ερωτήματα:

  1. Ποιοι πίνακες χρειάζονται και πώς συνδέονται.
  2. Το ερώτημα, με μορφοποίηση και σχόλια.
  3. Γιατί δουλεύει: σειρά εκτέλεσης FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
  4. Παγίδες: NULL (NOT IN με NULL, COUNT(*) vs COUNT(col)), διπλότυπα από joins, LEFT JOIN με συνθήκη στο WHERE (που το κάνει INNER).

Συχνά θέματα: «για όλους» (διαίρεση: NOT EXISTS … NOT EXISTS ή GROUP BY … HAVING COUNT = (SELECT COUNT…)), N-οστή μεγαλύτερη τιμή (window functions RANK()/DENSE_RANK()), αναδρομικά ερωτήματα (WITH RECURSIVE), views, triggers, stored procedures.

Για προχωρημένα θέματα: sql-pro, postgres-pro, sql-optimization-patterns, database-optimizer, postgresql-table-design, database-migration.

4. Σχεσιακή άλγεβρα & λογισμός

Σύμβολα: σ (επιλογή), π (προβολή), ⋈ (φυσική σύνδεση), ⋈_θ, × , ∪, −, ∩, ÷ (διαίρεση), ρ (μετονομασία), γ (ομαδοποίηση).

Μετατροπή SQL ↔ άλγεβρα: SELECT a FROM R, S WHERE R.x=S.x AND c ≡ π_a(σ_c(R ⋈_{R.x=S.x} S)).

Για LaTeX: \sigma_{\text{dept}='CS'}(\text{Emp}), \bowtie (amssymb), \div, \pi.

5. Δοσοληψίες & ταυτοχρονισμός

  • ACID, και τι εγγυάται το καθένα στην πράξη.
  • Χρονοπρογράμματα (schedules): σειριοποιησιμότητα συγκρούσεων με γράφο προτεραιότητας (κύκλος = όχι σειριοποιήσιμο), ανακτησιμότητα, cascadeless, αυστηρά.
  • 2PL / αυστηρό 2PL, αδιέξοδα (wait-for graph, wait-die, wound-wait), timestamp ordering, MVCC.
  • Επίπεδα απομόνωσης και ανωμαλίες: dirty read, non-repeatable read, phantom, lost update, write skew.
  • Ανάκαμψη: WAL, undo/redo, checkpoints, ARIES (σε υψηλό επίπεδο).

Σε ασκήσεις χρονοπρογραμμάτων: σχεδίασε τον γράφο προτεραιότητας (Mermaid ή ASCII), δείξε τον κύκλο ή την τοπολογική σειρά.

6. Αποθήκευση & ευρετήρια

B⁺-δέντρα (εισαγωγή/διαγραφή με διασπάσεις/συγχωνεύσεις, ύψος ≈ log_f N), hashing (στατικό, επεκτάσιμο, γραμμικό), clustered vs non-clustered, κόστος σε προσβάσεις σελίδων, αλγόριθμοι σύνδεσης (nested loop, block nested loop, sort-merge, hash join) με τύπους κόστους. Στην πράξη: EXPLAIN ANALYZE.

7. Projects

Για εφαρμογή με βάση (π.χ. Flask/FastAPI + PostgreSQL): migrations (Alembic), παραμετροποιημένα ερωτήματα (ποτέ συνένωση strings → SQL injection), seed δεδομένα, docker compose για ίδια βάση σε όλη την ομάδα (δες devops-engineer, fastapi-expert).