vaseis-dedomenon
Βοηθός για το μάθημα Βάσεις Δεδομένων - μοντέλο οντοτήτων-συσχετίσεων (ER/EER) και μετατροπή σε σχεσιακό, συναρτησιακές εξαρτήσεις, κλειστότητα, υποψήφια κλειδιά, ελάχιστη κάλυψη και κανονικοποίηση 2N
SKILL.mdskills/00-ellinika/vaseis-dedomenon/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".
Μέθοδος με το χέρι:
- Κλειδιά: όσα γνωρίσματα δεν εμφανίζονται ποτέ δεξιά ανήκουν σε κάθε κλειδί. Ξεκίνα από αυτά και πρόσθεσε τα λιγότερα δυνατά μέχρι η κλειστότητα να δώσει όλη τη σχέση.
- 2NF: κανένα μη πρωτεύον γνώρισμα δεν εξαρτάται από γνήσιο υποσύνολο κλειδιού.
- 3NF: για κάθε X → A: το X είναι υπερκλειδί ή το A είναι πρωτεύον.
- BCNF: για κάθε μη τετριμμένη X → A: το X είναι υπερκλειδί.
- Διάσπαση BCNF: για παραβίαση X → Y: R₁ = X⁺, R₂ = R − (X⁺ − X). Επανάληψη. Χωρίς απώλειες πάντα, αλλά όχι πάντα με διατήρηση εξαρτήσεων.
- Σύνθεση 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).
Δομή απάντησης για ερωτήματα:
- Ποιοι πίνακες χρειάζονται και πώς συνδέονται.
- Το ερώτημα, με μορφοποίηση και σχόλια.
- Γιατί δουλεύει: σειρά εκτέλεσης
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. - Παγίδες:
NULL(NOT INμε NULL,COUNT(*)vsCOUNT(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).