Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Σύνθετο ξένο κλειδί

Îåêßíçóå áðü ôï ìÝëïò prince_elrik. Τελευταία δημοσίευση από το μέλος moruin στις 17-01-2007, 10:38. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-01-2007, 21:35 23573

    Σύνθετο ξένο κλειδί

    Καλησπέρα,
    έχουμε 2 πίνακες με την εξής μορφή:

    πίνακας 1 με πεδία (α,β);
    πίνακας 2 με πεδία (γ,δ);
    με αντίστοιχα πρωτεύοντα κλειδιά το α και το γ.

    Έστω ότι θέλω να δημιουργήσω τον πίνακα γ με πεδία (ε,ζ,η). Ο οποίος θα είναι:
    ε -> primary key
    (ζ,η) ->foreign key στο οποίο το ζ να κάνει reference στο α και το η να κάνει reference στο γ.
    Μπορεί να γίνει κάτι τέτοιο? μέχρι στιγμής όσο και να έψαξα δεν κατάφερα να γράψω τον σωστό κώδικα. Γνωρίζω πως να υλοποιήσω ξένο κλειδί που να κάνει reference σε στοιχεία ίδιου πίνακα αλλά σε 2 διαφορετικά στοιχεία 2 ξεχωριστών πινάκων γίνεται?

    Σας ευχαριστώ.
  •  15-01-2007, 22:18 23578 σε απάντηση της 23573

    Απ: Σύνθετο ξένο κλειδί

    Άν κατάλαβα καλά, το σενάριο που σκέφτεσαι, περιγράφει τα LookUp Tables.

    Δηλαδή πίνακες που κρατούν δεδομένα τα οποία επαναλαμβάνονται μέσα σε έναν άλλο πίνακα.

    Π.χ. δύο πίνακες που κρατούν τις πόλεις και τις θέσεις εργασίας, και τα δεδομένα τους αντιστοιχούν στα αντίστοιχα πεδία ενός πίνακα που "κρατάει" το προσωπικό μιας εταιρίας.

     

    Άν αυτό είναι το σενάριο, τότε είναι πολύ διαδεδομένο και υπάρχουν άπειρα παραδείγματα.

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

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

     

  •  15-01-2007, 23:23 23580 σε απάντηση της 23573

    Απ: Σύνθετο ξένο κλειδί

    Το σενάριο που περιγράφεις δεν έχει ένα σύνθετο, αλλά δύο ανεξάρτητα ξένα κλειδιά. Αν θέλεις οπωσδήποτε, για κάποιο λόγο, το ζεύγος (α,γ) να είναι όντως ξένο κλειδί, κοντολογίς να μην επιτρέπονται όλοι οι συνδυασμοί (α,γ), θέλεις έναν επιπλέον πίνακα. Εκεί θα περιέχονται τα επιτρεπτά ζεύγη (α,γ) και ο πίνακας θα έχει σύνθετο κλειδί (α,γ), κάθε στοιχείο του οποίου θα είναι επίσης ξένο κλειδί. Ο πίνακάς σου (ε,ζ,η) θα κάνει αναφορά στον νέο πίνακα αυτό και όχι στους αρχικούς.

    Νατάσα Μανουσοπούλου
  •  15-01-2007, 23:40 23581 σε απάντηση της 23573

    Απ: Σύνθετο ξένο κλειδί

    Μάλλον δεν ήμουν ιδιαίτερα σαφής. Έχουμε τους εξής 2 πίνακες.

    create table pinakas1(
    a varchar(10) primary key,
    b varchar(10));
    create table pinakas2(
    c varchar(10) primary key,
    d varchar(10));

    και θέλω να δημιουργήσω τον πίνακα 3 που να κάνει το εξής:

    create table pinakas3(
    e varchar(10),
    f varchar(10),
    g varchar(10),
    primary key (e),
    foreign key (f,e) references pinakas1(a),pinakas2(c));

    //Δηλαδή το f να κάνει reference στο α του πίνακα 1

    //και το e να κάνει reference στο c του πίνακα 2

    Χρησιμοποιώ MySQL σε αυτήν την βάση μου και όταν γράφω τον παραπάνω κώδικα παίρνω το σφάλμα ότι υπάρχει συνακτικό πρόβλημα στην γραμμή με το foreign key.
    Ψάχνοντας στο mysql manual βρήκα ότι μπορώ να αντικαταστήσω το παραπάνω με το εξής:

    foreign key (f,e) references pinakas1(a,c));
    με την προΰπόθεση ότι τα a,c είναι στον ίδιο πίνακα. Αλλά σε μένα δεν είναι. Οπότε ρωτάω πως μπορώ να αλλάξω το foreign key ώστε να με καλύπτει?
  •  16-01-2007, 00:00 23583 σε απάντηση της 23581

    Απ: Σύνθετο ξένο κλειδί

    @mns

    Κατάλαβα το σκεπτικό σου, το σκέφτηκα και εγώ αυτό με τον επιπλέον πίνακα απλά προσπαθώ να τον αποφύγω. Θα ήθελα να ρωτήσω το εξής:

    Άμα χρησιμοποιήσω άλλου είδους κλειδί (unique κλπ) θα πετύχει?

    Δηλαδή να ξεχάσουμε το foreign key και να έχουμε ένα σύνθετο κλειδί που να έχει τα (α,γ).
  •  16-01-2007, 00:12 23586 σε απάντηση της 23583

    Απ: Σύνθετο ξένο κλειδί

    Μπορείς να κάνεις το εξής:

    Αρχικά να δώσεις ένα foreign key(π.χ το e) και έπειτα να δώσεις την εντολή

    ALTER TABLE pinakas3

    ADD FOREIGN KEY (f) REFERENCES pinakas2(c);

    Αυτό βέβαια είναι ένα workaround, επειδή μου διαφεύγει η ακριβής σύνταξη για να προσθέσεις στο Create Table και τα δύο FK, αλλά δουλεύει.
  •  16-01-2007, 00:23 23587 σε απάντηση της 23583

    Απ: Σύνθετο ξένο κλειδί

    @evliatsas

    έτσι όμως δεν είναι σαν να προσθέτω 2 ξεχωριστά foreign keys και όχι ένα σύνθετο?
  •  16-01-2007, 00:32 23588 σε απάντηση της 23587

    Απ: Σύνθετο ξένο κλειδί

    Το foreign key, όπως λέει και το όνομά του, αναφέρεται στο κλειδί ενός άλλου πίνακα. Αν θέλεις να αναφερθείς σε δύο διαφορετικούς πίνακες, τότε έχεις δύο foreign keys. Αν θέλεις δύο πεδία σε ένα foreign key, τότε πρέπει αυτό να αναφέρεται σε έναν άλλο πίνακα, του οποίου το primary key αποτελείται από τα δύο αυτά πεδία.

    Νατάσα Μανουσοπούλου
  •  16-01-2007, 00:38 23589 σε απάντηση της 23587

    Απ: Σύνθετο ξένο κλειδί

    Ακριβώς όπως τα λέει η @mns.

    Εγώ είχα καταλάβει ότι θέλεις απλά δύο διαφορετικά FK.

    Προφανώς, θέλεις να υλοποιήσεις σχέση ν-ν (πολλά προς πολλά)

    Παραδείγματα θα βρείς και μέσα στο dotNetZone.
  •  17-01-2007, 10:38 23659 σε απάντηση της 23588

    Απ: Σύνθετο ξένο κλειδί

     mns wrote:
    Το foreign key, όπως λέει και το όνομά του, αναφέρεται στο κλειδί ενός άλλου πίνακα. Αν θέλεις να αναφερθείς σε δύο διαφορετικούς πίνακες, τότε έχεις δύο foreign keys. Αν θέλεις δύο πεδία σε ένα foreign key, τότε πρέπει αυτό να αναφέρεται σε έναν άλλο πίνακα, του οποίου το primary key αποτελείται από τα δύο αυτά πεδία.

    Αυτή είναι η πιο σωστή απάντηση για τη χρήση ενός foreign key. Στο δικό σου πρόβλημα μπορείς να κάνεις το εξής, για να μη φτιάξεις και 4ο πίνακα μπορείς να κάνεις 2 foreign keys προς τους πίνακες 1 & 2 αντίστοιχα. Μετά θα κάνεις τον πίνακα 3 week, δηλαδή το primary key θα είναι τα 2 foreign keys. Δε ξέρω αν αυτό βολεύει το σχεδιασμό σου?Confused Σε γενικές γραμμές είναι μια λύση για τις n-n καταστάσεις.

    System crashed: Coffee_Cup.Content is null
    Please assign coffee to Content and press any key to continue and any other key to cancel

    Καλέας Κων/νος
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems