Προς το περιεχόμενο

mySql πρόβλημα!


Επισκέπτης

Προτεινόμενες αναρτήσεις

Επισκέπτης
Δημοσ.

Καλησπέρα,

Έχω το παρακάτω σχήμα στη MySql(βλεπε αρχειο)

 

http://www.yousendit.com/transfer.php?action=download&ufid=39BDE49D349339E2

 

αλλά αντιμετωπίζω σοβαρό πρόβλημα με τα ξένα κλειδιά..

Έχω κάνει κανονικοποιηση μεχρι 3NF αλλά οταν οριζω τα ξενα κλειδια μερικα απο αυτα δεν περνανε.

Για να φορτώσετε το αρχείο δίνετε την εντολή

source path/creategramateia2.sql;

Με την εντολή SHOW ENGINE INNODB STATUS βλέπετε την κατάσταση της βάσης η οποια θα σας δειξει τι ακριβως χτυπαει.Προσωπικα δε βγαζω ακρη και δυσκολευομαι να καταλαβω τι ακριβως συμβαινει με δεδομενο οτι τελειωνει η προθεσμια παραδοσης της εργασιας. :confused:

Καθε βοηθεια ευπροσδεκτη.

Δημοσ.

Η mySql γενικά είναι πολύ "ιδιότροπη" 'οσον αφορά τα ξένα κλειδιά. Δοκίμασε να βάλεις όλα τα πεδία που έχεις ορίσει σαν ξένα κλειδιά στην ίδια σειρά.

Δηλ. αν στη μία σχέση το ένα πεδίο είναι στη δεύτερη θέση τότε θα πρέπει να είναι στη δεύτερη θέση κ στη σχέση στην οποία είναι ξένο κλειδί.

Δημοσ.

Δεν μπορώ να βοπηθήσω άμεσα στο πρόβλημα σου, αλλά έχω κάποιες απορίες για το σχήμα που έχεις δημιουργήσει.

 

Γιατί έχεις 2 tables: teacher και teacher_identity? Μπορείς να έχεις την ίδια πληροφορία σε ένα μόνο table και δεν βλέπω κάποιο λόγο να το σπάσεις σε δύο.

Ομοίως για τα tables lesson και lesson_descript.

 

Επίσης, σύμφωνα με τα FK που προσπαθείς να ορισείς έχεις το teacher_id του πίνακα teacher (και teacher_identity, αλλά από εδώ και πέρα θα τα θεωρώ ως ένα table με όνομα teacher) να δείχνει στο teacher_id του πίνακα semester. Νομίζω ότι πρέπει να είναι αντίθετα.

Ομοίως για όλα τα κλειδία που σχετίζεις στον πίνακα semester.

δλδ.

 

Αντι για αυτο που έχεις εσύ:

ALTER TABLE teacher_identity ADD

FOREIGN KEY (teacher_id) REFERENCES semester (teacher_id) ON DELETE CASCADE ON UPDATE CASCADE;

 

Πρέπει να έχεις:

ALTER TABLE semester ADD

FOREIGN KEY (teacher_id) REFERENCES teacher (teacher_id) ON DELETE CASCADE ON UPDATE CASCADE;

 

Σου προτείνω σε κάθε πίνακα να έχεις ένα κλειδί με όνομα: <ονομα πίνακα>_id και να αποφεύγεις να χρησιμοποιείς σύνθετα κλειδιά. (Αυτό μπορεί και να λύσει το πρόβλημα με τα FK που έχεις.)

 

Δεν μπορείς να έχει το ίδιο πεδίο να δείχνει σε δύο διαφορετικά νομίζω.

δλδ. Αυτές οι δύο δηλώσεις έχουν πρόβλημα

ALTER TABLE study_plan ADD

FOREIGN KEY (lesson_id) REFERENCES semester (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE;

 

ALTER TABLE study_plan ADD

FOREIGN KEY (lesson_id) REFERENCES lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE;

 

Ίδιο πρόβλημα και εδώ:

ALTER TABLE teacher_identity ADD

FOREIGN KEY (teacher_id) REFERENCES semester (teacher_id) ON DELETE CASCADE ON UPDATE CASCADE;

 

ALTER TABLE teacher_identity ADD

FOREIGN KEY (teacher_id) REFERENCES teacher (teacher_id) ON DELETE CASCADE ON UPDATE CASCADE;

 

Θα σου πρότεινα γενικά να ξανασχεδιάσεις τη βάση σου από την αρχή γιατί έχεις κάνει λάθος στη λογική που τη δημιούργησες. Ξεκίνα καθορίζοντας με σαφήνεια τις απαιτήσεις σου, φτιάξε το ER και από αυτό φτιάξε το σχεσιακό μοντέλο. Από το σχεσιακό είναι εύκολο να προκύψει η SQL.

 

Ελπίζω να βοήθησα... αν έχεις κι άλλες απορίες ξαναρώτα και θα προσποαθήσω να απαντήσω.

 

Ποια έκδοση της Mysql χρησιμοποιείς?

Επισκέπτης
Δημοσ.

Καταρχάς, να σε ευχαριστήσω που μπήκες στον κόπο να το κοιτάξεις και να απαντήσεις. Το θέμα αφορά τον σχεδιασμό και υλοποίηση του συστήματος μηχανογράφησης της γραμματείας του Τμήματος Επιστήμης και Τεχνολογίας Υπολογιστών του Πανεπιστημίου Πελοποννήσου.(Η εργασία αυτή είναι ομαδική).

Εκφώνηση : http://www.megaupload.com/?d=IM2KXZMX

 

Τώρα, όσον αφορά τους πίνακες teacher και teacher_identity μάλλον έχουμε κάνει λάθος κατά την κανονικοποιηση του σχήματος. Σʼαυτό έχεις απόλυτο δίκιο. Διορθώθηκε. Φαίνεται σκεφτήκαμε να το σπάσουμε διότι δεν θέλαμε να κουβαλάμε πολλά πεδία σε περίπτωση JOIN κάποιων πινάκων. Μόνο αυτό μπορώ να σκεφτώ τώρα.

 

Σχετικά με το lesson kai lesson_descript επιφυλάσσομαι να σου απαντήσω καθώς βρισκόμαστε αρκετές μέρες τώρα σε διαφωνία σχετικά με το αν θα πρέπει να γίνει συνένωση ή όχι. Περιμένουμε κάποιες διευκρινίσεις που αφορούν τον οδηγό σπουδών της σχολής μας. Πιστεύω θα έχω μια τεκμηριωμένη απάντηση αύριο.

 

Τα κλειδιά είναι όντως ανάποδα. Αυτό οφείλεται σε λαθεμένη αντίληψη για το πώς συσχετίζονται δυο πίνακες μεταξύ τους μέσω foreign key.Δηλαδή, ποιο επηρεάζει ποιο.Επίσης, ο κώδικας παρήχθη αυτόματα από πρόγραμμα database designer (dezign for database 4.0.3) και έχοντας λαθεμένη θεωρητική αντίληψη για τα foreign keys ,σχεδιάσαμε λάθος το σχεσιακό μοντέλο και τις συνδέσεις(τραβήξαμε λάθος τα βελάκια που συμβολίζουν τα ξένα κλειδιά).

 

Γενικά, έχουμε καθορίσει τις απαιτήσεις μας. Έχουμε φτιάξει ER και σχεσιακό μοντέλο με τη χρήση προγραμμάτων όπως DBDesigner 4 και Dezign for Databases 4.0.3.Η έκδοση MySql που χρησιμοποιούμε είναι η 5.0.22.

 

Τέλος, μας βοήθησες αρκετά. Εύχομαι μόνο να είχες απαντήσει νωρίτερα καθώς όλες αυτές τις μέρες ψάχναμε μια λύση. Τελικά τη βρήκαμε μόλις χτες. Ειρωνεία. Παρολαυτά, μάθαμε αρκετά για τη MySql,κυρίως ότι είναι ιδιότροπη. Σου στέλνω την τελική εκδοχή της βάσης.

 

Η λύση του προβλήματός μας συνοψίζεται στα έξις σημεία.

 

1)Αποφυγή χρήσης αλυσίδας foreign keys .Δηλαδή, ένα ξένο κλειδί μπορεί να δείχνει σε πολλά table ταυτόχρονα αλλά πρέπει να αποφεύγεται η ιδέα του foreign key να δείχνει σε foreign key,το οποίο με τη σειρά του δείχνει σε ένα τρίτο foreign key κ.ο.κ.

 

2)Στη MySql ,προκειμένου να χρησιμοποιήσουμε ξένα κλειδιά πρέπει να ορίσουμε ρητά ότι οι πίνακες χρησιμοποιούν τη μηχανή αποθήκευσης- (storage engine) INNODB με την εντολή ENGINE=INNODB.

Π.χ.

CREATE TABLE classroom (

classroom_id VARCHAR(40) NOT NULL,

hour TIME NOT NULL,

day VARCHAR(20) NOT NULL,

UNIQUE(classroom_id),

PRIMARY KEY (classroom_id, hour, day)

)ENGINE=INNODB DEFAULT CHARSET=greek;

 

Η δομή ευρετηρίου MyISAM δεν υποστηρίζει ξένα κλειδιά. Αναγκαστικά λοιπόν πρέπει να χρησιμοποιήσουμε το INNODB.

 

3)Μερικά πεδία έπρεπε να σημειωθούν ως UNIQUE(αυτά που συνδέονται με ξένα κλειδιά)

 

Αν προλαβαίνεις ρίξε μια ματιά σε αυτή την εκδοχή …Μπορώ να σου στείλω και δεδομένα να δοκιμάσεις τη βάση.

Δημοσ.

Φίλε natural_sgf να κάνω μερικές παρατηρήσεις...

Όπως δίνεις τον πίνακα θα αντιμετωπίσεις δυσκολίες όταν πας να ενημερώσεις την βάση για κάποια αλλαγή (update) ή για να κάνεις διαγραφή (delete), χρειάζεσαι οποσδήποτε την χρησιμοποίηση του CASCADE (ON DELETE CASCADE ON UPDATE CASCADE)..

Επίσης δουλεύει ο συσχετισμός και με TYPE=INNODB..

Επισκέπτης
Δημοσ.

o sysxetismos TYPE=INNODB se mas den doylepse..to dokimasame..giayto kai xrhsimopoioyme ENGINE=INNODB.

ta foreign key constraints den ta blepeis ston orismo twn pinakwn giati ta dhlwnoyme xwria..p.x.

ALTER TABLE semester

ADD FOREIGN KEY (teacher_id)

REFERENCES teacher (teacher_id) ON DELETE CASCADE ON UPDATE CASCADE ;

anyway,eyxaristw..

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...