andreas_g Δημοσ. 3 Φεβρουαρίου 2014 Δημοσ. 3 Φεβρουαρίου 2014 Έχω ένα πρόγραμμα σε java, που με αυτό εισάγω και διαγράφω εγγεαφές σε μερικούς πίνακες, πχ. String sql = "CREATE TABLE Supplier" + "(id INTEGER NOT NULL AUTO_INCREMENT, " + " sName VARCHAR(255), " + " sEmail VARCHAR(255), " + " sFax VARCHAR(255), " + " sPhone VARCHAR(255), " + " prefer VARCHAR(255), " + " daysBefore INTEGER, " + " PRIMARY KEY ( id ))"; String sql = "CREATE TABLE Product" + "(id INTEGER NOT NULL AUTO_INCREMENT, " + " pName VARCHAR(255), " + " supplierID INTEGER, " + " PRIMARY KEY ( id ))"; Στο πεδίο supplierID του πίνακα των προιόντων βάζω το id του κάθε προμηθευτή από τον άλλο πίνακα. Τώρα, αυτό που θέλω είναι. Γίνεται όταν διαγράφω για εγγραφή από τον πίνακα των προμηθευτών να ενημερώνεται αυτόματα και ο πίνακας των προιόντων? Η πρέπει να γράψω εγω κώδικα που να το κάνει?
defacer Δημοσ. 3 Φεβρουαρίου 2014 Δημοσ. 3 Φεβρουαρίου 2014 Γίνεται αλλά είσαι σίγουρος ότι το θέλεις; Η αυτόματη ενημέρωση που λες μπορεί να είναι είτε η διαγραφή όλων των προϊόντων του εν λόγω προμηθευτή είτε το να γίνει το supplierID όλων των προϊόντων του null. Και τα δύο έχουν μειονεκτήματα. Αν διαγραφούν όλα τα προϊόντα τότε τι θα κάνεις με όλα τα υπόλοιπα tables που αναφέρονται σε προϊόντα (π.χ. παραγγελίες); Θα πρέπει να διαγραφούν τα πάντα σχετικά και από εκεί. Προφανώς έτσι καταστρέφεται όλο το ιστορικό και πολύ σπάνια γίνεται η δουλειά που θέλεις. Αν ο προμηθευτής γίνει null τότε ήδη μιλάμε για αλλαγή του σχήματος της βάσης, πράγμα το οποίο πρέπει να γίνεται επειδή το σχεδίασες έτσι κι όχι επειδή έτυχε. Αυτό με τη σειρά του σημαίνει πως πρέπει και η σχετική εφαρμογή να μπορεί να διαχειριστεί προϊόντα χωρίς προμηθευτές. Είσαι σίγουρος πως αυτό που θέλεις είναι ένα από τα παραπάνω; Εναλλακτικά μια λύση που είναι πολύ πιθανότερο να σε βολέψει είναι να κάνεις soft delete: βάζεις ένα πεδίο "deleted" στους προμηθευτές και το διαχειρίζεσαι κατάληλλα στην εφαρμογή. Βασικό πλεονέκτημα ότι μπορείς να κάνεις "delete" (και γιατί όχι και undelete) χωρίς να πειραχτεί καθόλου το ιστορικό σου.
andreas_g Δημοσ. 3 Φεβρουαρίου 2014 Μέλος Δημοσ. 3 Φεβρουαρίου 2014 Αυτό που κάνω τώρα, είναι να χρησιμοποιώ μια μέθοδο που έκανα με τη java και όταν διαγράφω ένα προμηθευτή, διαβάζω όλα τα προιόντα από τη βάση(SELECT *) και ελέγχω αν το id του προμηθευτή που διέγραψα υπάρχει μέσα στον πίνακα του προιόντος. Αν υπάρχει τότε θέτω τη τιμή NULL. Αυτό που με προβήματίζει είναι αν αυτό που κάνω είναι η σωστή πρακτική? κανω λάθος που λειτουργώ έτσι? Για αυτό ρωτάω, μήπως αν κάνει μόνη της την αλλαγή η mysql είναι πιο καλή πρακτική, πιο σωστό γενικά.
warlock9_0 Δημοσ. 4 Φεβρουαρίου 2014 Δημοσ. 4 Φεβρουαρίου 2014 υπάρχει η on delete cascade αλλά αυτά που σου είπε ο defacer είναι αρκετά για να μην τη χρησιμοποιήσεις
defacer Δημοσ. 4 Φεβρουαρίου 2014 Δημοσ. 4 Φεβρουαρίου 2014 Αυτό που κάνω τώρα, είναι να χρησιμοποιώ μια μέθοδο που έκανα με τη java και όταν διαγράφω ένα προμηθευτή, διαβάζω όλα τα προιόντα από τη βάση(SELECT *) και ελέγχω αν το id του προμηθευτή που διέγραψα υπάρχει μέσα στον πίνακα του προιόντος. Αν υπάρχει τότε θέτω τη τιμή NULL. Αυτό που με προβήματίζει είναι αν αυτό που κάνω είναι η σωστή πρακτική? κανω λάθος που λειτουργώ έτσι? Για αυτό ρωτάω, μήπως αν κάνει μόνη της την αλλαγή η mysql είναι πιο καλή πρακτική, πιο σωστό γενικά. Σίγουρα κάνεις λάθος, αν μη τι άλλο γιατί στη χειρότερη περίπτωση αυτό που θα έπρεπε να κάνεις αντί γι' αυτό που περιγράφεις είναι UPDATE product SET supplierID = null WHERE supplierID = X Και αυτό βέβαια πάλι λάθος είναι γιατί η σωστή εφαρμογή του επαφίεται στα χέρια σου ενώ θα μπορούσες πολύ σωστότερα να βάλεις τη βάση να βοηθήσει δηλώνοντας το foreign key με on delete set null (google it).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα