Σελ. 2 από 2 ΠρώτηΠρώτη 12
Εμφάνιση 16-19 από 19
  1. #16
    Εγγραφή
    10-11-2003
    Περιοχή
    EU
    Μηνύματα
    3.808
    Downloads
    19
    Uploads
    0
    Τύπος
    Other / Άλλο
    Ταχύτητα
    1 κόμμα κάτι
    χμ...τι είναι το foreign key απο ένα πίνακα σε έναν άλλον σε τι χρησιμεύει και πώς ορίζεται;

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

    η πρώτη αφορά στη θεωρία των βάσεων. Βλ. links παραπάνω.

    Η δεύτερη έχει να κάνει με το front-end της Access, δηλ. είναι συγκεκριμένη για το πρόγραμμα 'Access'.

    Για να κάνεις σωστό σχεδιασμό μιάς βάσεως, θα πρέπει να μάθεις το πρώτο μέρος (back-end). Μετά θα σε απασχολήσει το πρακτικό μέρος, δηλ. η σωστή σύνταξη ώστε να διαιρέσεις τα δύο πεδιά και ό,τι άλλο. Δυστυχώς, όλα αυτά θέλουν χρόνο, μην ξεχνάς όμως ότι οι βάσεις δεδομένων είναι από τα δυσκολώτερα πράγματα ως σύλληψη και σχεδιασμό στην πληροφορική. Θυμάμαι στο πρώτο βιβλίο για MySql που διάβασα έγραφε ότι, όταν σχεδιάζετε βάσεις δεδομένων θα καταναλώνετε τον περισσότερο χρόνο σας στον σχεδιασμό της βάσεως. Τότε δεν το είχα "πιάσει" και μου είχε φανεί υπερβολή. Σήμερα ξέρω ότι είναι έτσι. Εάν πάντως τα πήγαινες καλά με τις έννοιες των συνόλων στα μαθηματικά σημαίνει ότι σου πηγαίνει η θεωρία των RDB. Αυτά που ρωτάς με το FK είναι οι αντιστοιχίες των συνόλων, για παράδειγμα (αμφιμονοσήμαντες κλπ., εάν τα θυμάσαι από το σχολείο).

  2. #17
    Εγγραφή
    20-03-2003
    Περιοχή
    Στη μόνη πόλη που γράφεται με 2 'σ' και προφέρεται με 2 'λ'
    Ηλικία
    53
    Μηνύματα
    21.422
    Downloads
    25
    Uploads
    2
    Τύπος
    ADSL2+
    Ταχύτητα
    11000/1023
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΡΟΣΤΑΝ
    Router
    Netgear DGN2000
    SNR / Attn
    4(dB) / 30.5(dB)
    Path Level
    Fastpath
    Αν και θα συμφωνήσω με τον Lazar, ότι αυτό που ρωτάς είναι θεμελιώδες της θεωρίας Β.Δ. την οποία θα πρέπει να διαβάσεις, θα προσπαθήσω να κάνω μια προσέγγιση.

    Τι είναι το Foreign Key;
    Το Foreign Key είναι, ουσιαστικά, ο δεσμός ενός πίνακα με έναν άλλον.

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

    Πως όμως θα συνδέσεις τους 2 πίνακες ώστε η εγγραφή σου στον Έξοδα να δηλώνει αυτή τη σχέση;
    Η λύση είναι να προσθέσεις ένα πεδίο στο οποίο οι τιμές που θα δίνεις να αντιστοιχούν σε μια (και μόνο μια) εγγραφή στην Κατηγορία_Εξόδων.
    Έτσι αν ο πίνακας Κατηγορία εξόδων έχει πεδία/τιμές:
    IDΠεριγραφήΥπεύθυνοςΦΠΑ
    1Είσοδοι σε ΜουσείαΓιώργος9%
    2ΓεύματαΓιάννης19%
    3ΤουρΚώστας19%
    4Κέντρα ΔιασκέδασηςΓιώργος19%
    τότε θα πρέπει σε αυτόν τον πίνακα να βρεις ποιο πεδίο χαρακτηρίζει μοναδικά την εγγραφή (είναι δλδ το Primary Key (PK) του πίνακα).
    Η απάντηση στον παραπάνω είναι προφανής αφού ήδη έχω προσθέσει το πεδίο ID. Θα μπορούσα όμως να χρησιμοποιήσω το πεδίο [Περιγραφή] θεωρώντας ότι δεν υπάρχει περίπτωση 2 κατηγορίες να έχουν την ίδια περιγραφή.
    Δεν το κάνω γιατί αποφεύγουμε (για λόγους βελτιστοποίησης/απλότητας) να χρησιμοποιούμε text πεδία ως PK

    Ας υποθέσουμε τώρα ότι ο πίνακας Έξοδα έχει εγγραφές που πρέπει να συσχετιστούν με μια κατηγορία εξόδων. Δλδ έχει πεδία
    IDΚατηγορίαΗμερομηνίαΠοσό
    111/1/200510€
    217/1/200510€
    327/1/200520€
    Τι λέει ο παραπάνω πίνακας; Ότι την 1η Ιανουαρίου 2005 εμφανίστηκε ένα έξοδο 10€ που ανήκει στην Κατηγορία 1. Δλδ είναι είσοδος σε Μουσείο που την οργάνωσε ο Γιώργος.
    Στις 7 Ιανουαρίου πάλι ο Γιώργος πήγε ένα γκρουπ σε Μουσείο και μετά (3η εγγραφή) ο Γιάννης τους πήγε για γεύμα.

    Όλα αυτά τα καταλαβαίνω επειδή στο πεδίο [Κατηγορία] χρησιμοποιώ το PK του πίνακα Κατηγορία_Εξόδων για να κάνω τη σύνδεση. Έτσι λέμε ότι το πεδίο [Κατηγορία] είναι Foreign Key του πίνακα Κατηγορία_Εξόδων στον πίνακα Έξοδα. Για να γίνεται πιο κατανοητό αυτό θα μπορούσα να ονομάσω το κλειδί [Κατηγορία_ΕξόδωνID] ώστε με μια ματιά να ξέρω ότι αυτό είναι foreign key που χρησιμοποιεί το πεδίο ID του πίνακα Κατηγορία_Εξόδων.

    Φυσικά ο πίνακας Έξοδα θα μπορούσε να έχει ΟΛΑ αυτά τα στοιχεία δλδ να είναι της μορφής:
    1Είσοδοι σε ΜουσείαΓιώργος9%1/1/200510€
    2Είσοδοι σε ΜουσείαΓιώργος9%7/1/200510€
    Όμως σε αυτή την περίπτωση ο χρήστης της εφαρμογής μου θα έπρεπε να πληκτρολογεί ΚΑΘΕ φορά όλα τα στοιχεία του πίνακα. Και φυσικά θα ρίσκαρα ότι σε κάποια φάση θα έκανε κάποιο λάθος πληκτρολόγησης (π.χ. αντί για 9% θα πληκτρολογούσε 19% για είσοδο σε μουσεία).
    Επίσης σκέψου ότι αυτός ο πίνακας σε 2 χρόνια θα είχε εκατοντάδες επαναλαμβανόμενα πεδία. Το "Είσοδοι σε Μουσεία","Γιώργος","9%" θα πρέπει να επαναλαμβάνονται τα ίδια και τα ίδια συνέχεια. Αυτό σημαίνει πιο μεγάλη βάση, και βέβαια μικρότερη ταχύτητα επεξεργασίας.

    Η παραπάνω μέθοδος (όταν δλδ βλέπουμε τις όμοιες τιμές πεδίων) είναι η κλασσική "μπακάλικη" μεθοδος να καταλάβουμε ότι η σχεδίαση της Β.Δ. μας είναι λάθος. Που βασικά σημαίνει ότι δεν κάναμε αυτό που λέει ο lazar (για το χρόνο και την προσοχή στη σχεδίαση ΠΡΙΝ ανοίξουμε το περιβάλλον προγραμματισμού μας)

    Πως ορίζουμε ένα foreign key (FK)
    Αυτό είναι απλό. Κατ' αρχήν πρέπει να δούμε ποιος πίνακας είναι από ποιά πλευρά στη σχέση "ένα-προς-πολλά". Στο παράδειγμα κάθε Κατηγορία_Εξόδων έχει πολλά έξοδα, ενώ κάθε Έξοδο έχει μια (και μόνο μια) Κατηγορία_Εξόδου.
    (εδώ θα κάνω μια παρένθεση για να προσθέσω ότι πριν από ΟΤΙΔΗΠΟΤΕ άλλο πρέπει να έχεις εξασφαλίσει ότι η σχέση είναι πράγματι "ένα-προς-πολλά". Αν κάνεις λάθος και η σχέση είναι "πολλά-προς-πολλά" τον ήπιες! Χαρακτηριστικό "επικίνδυνο" παράδειγμα σχέσης Πολλά-Προς-Πολλά είναι η σχέση Αυτοκίνητο-Ιδιοκτήτης. Κάθε αυτοκίνητο λέμε έχει έναν ιδιοκτήτη, ενώ κάθε ιδιοκτήτης μπορεί να έχει πολλά αυτοκίνητα, χτίζουμε τη βάση μας, κάνουμε την εφαρμογή, όλα πάνε μια χαρά και ξαφνικά εμφανίζεται ένα αυτοκίνητο με 2 ιδιοκτήτες! Σε αυτή την περίπτωση (σχεδόν) τα μαζεύεις και φεύγεις, ειδικά αν έχεις ολοκληρώσει την εφαρμογή. Η αλλαγή μιας σχέσης πολλά-προς-πολλά σε ένα-προς-πολλά είναι εξαιρετικά επίπονη αν γίνει εκ των υστέρων!)
    Επανερχόμαστε μετά την παρένθεση:
    Άρα ο Κατηγορία_Εξόδου είναι από την πλευρά "ένα", ο Έξοδα είναι από την πλευρά "Πολλά"
    Πάντα σε μια τέτοια σχέση από την πλευρά "Ένα" πρέπει να υπάρχει ένα PK και από την πλευρά "Πολλά" ένα FK.

    Επομένως, το επόμενο βήμα μας είναι να προσθέσουμε ένα πεδίο που θα παίζει το ρόλο του FK στον [Έξοδα]. Αυτό είναι το Κατηγορία_εξόδωνID. Ο τύπος του πεδίου πρέπει να είναι ίδιος με τον τύπου του PK με το οποίο θα το συνδέσουμε. Εδώ θεωρώ ότι το ID είναι Autonumber άρα το Κατηγορία_εξόδωνID θα το ορίσω ως Numeric. Αν ήταν text (που είπαμε το αποφεύγουμε) τότε το Κατηγορία_εξόδωνID θα το όριζα ως text.

    Αφού φτιάξουμε το πεδίο και ορίσουμε τον τύπο του πρέπει κάπως να δηλώσουμε αυτή τη σχέση. Η MS Access έχει γι αυτό το σκοπό το Relationships (Tools->Relationships). Την πρώτη φορά που θα το ανοίξεις θα είναι κενό. Κάνε δεξί κλικ οπουδήποτε και επέλεξε Show All. Όλοι οι πίνακές σου εμφανίζονται. Για να δημιουργήσεις μια σχέση κάνε κλικ στο PK του πίνακα της πλευράς "Ένα" (Κατηγορία_Εξόδων) και drag επάνω στο FK (πεδίο Κατηγορία_εξόδωνID του πίνακα Έξοδα).
    Θα σου εμφανιστεί ένα παράθυρο που θα επαληθεύει τα 2 πεδία (αριστερά το PK, δεξιά το FK) και στο οποίο μπορείς να δηλώσεις κανόνες Referential Integrity. Πρόσεξε ΠΟΛΥ του κανόνες που θα ορίσεις, ειδικά αν κρατάς οικονομικά στοιχεία! Αν δλδ επιλέξεις "Enforce Referential Integrity" και τσεκάρεις και το Update και το Delete τότε αν στο παραπάνω παράδειγμα σβήσεις την εγγραφή 1 ("Είσοδοι σε Μουσεία") του πίνακα Κατηγορία_εξόδων τότε ΑΥΤΟΜΑΤΑ θα σβηστούν και ΟΛΕΣ οι συσχετισμένες εγγραφές του πίνακα "Έξοδα"!!!

    --------------------
    Ερώτηση 2: Πως κάνω ένα πεδίο να παίρνει το άθροισμα 2 άλλων;
    Απάντηση: Δεν κάνεις τέτοιο πεδίο εκτός αν είναι τεχνικά επιβεβλημένο. Αν π.χ. μαζεύεις χιλιάδες εγγραφές ανά λεπτό σε πραγματικό χρόνο σε προσωρινό πίνακα και χρειάζεται τελικά να αποθηκεύσεις μόνο κάποιον μετασχηματισμό αυτών των τιμών.
    Το άθροισμα που λες (ή το πηλικό/γινόμενο/οτιδήποτε) το υπολογίζεις "στο φτερό" (on-the-fly) όταν και αν σου χρειαστεί. Ο υπολογισμός αυτός μπορεί να γίνει σε οποιοδήποτε Ερώτημα, σε οποιαδήποτε Φόρμα, σε οποιαδήποτε Αναφορά ή ακόμα και στον κώδικα On_Click ενός πλήκτρου.
    Γενικά ως αρχή "δεν αποθηκεύουμε δευτερογενή στοιχεία" δλδ δεδομένα που μπορούν να προκύψουν από άλλα "πρωτογενή" δεδομένα.
    Όπως είπα παραπάνω υπάρχουν εξαιρέσεις τόσο τεχνικές όσο και διαδικασιών. Ένα παράδειγμα τέτοιας διαδικασίας είναι το κλείσιμο του μεσημεριανού ταμείου μπορεί να απαιτεί την αποθήκευση μιας εγγραφής με το τελικό ποσό, παρά το ότι οι πρωτογενής εγγραφές (τιμολόγια) είναι καταχωρημένες στο σύστημα.

    Ουφ...
    <ταλαιπωρημένο smilie>

  3. #18
    Εγγραφή
    29-04-2004
    Περιοχή
    Πειραιάς
    Μηνύματα
    53
    Downloads
    1
    Uploads
    0
    Τύπος
    ADSL HOL Shared
    Ταχύτητα
    1024/256
    ISP
    HOL
    DSLAM
    Ο.Τ.Ε. - ΝΙΚΑΙΑ
    yiapyiap είσαι όλα τα λεφτά, σε ευχαριστώ πολύ.

    (smile ευγνωμοσύνης)

  4. #19
    Foreign key ειναι ενα κλειδι που σε καποιον αλλο πινακα ειναι πρωτευον κλειδι και το προσθετεις στον νεο πινακα ωστε να κανεις τη συσχετιση με τον αλλο.
    Δεν το οριζεις αν εννοεις να βαλεις "κλειδακϊ" οπως βαζεις στο πρωτευον κλειδι.
    (ελπιζω να μην κανω λαθος και εγω αρχαριος ειμαι)

    Edit:οπ sorry δεν ειδα καθολου μερικες απαντησεις

Σελ. 2 από 2 ΠρώτηΠρώτη 12

Παρόμοια Θέματα

  1. Βοήθεια σε Access 2003
    Από eeryelf στο φόρουμ Windows
    Μηνύματα: 10
    Τελευταίο Μήνυμα: 01-06-08, 15:16
  2. Βοήθεια με wireless access point
    Από RASTAVIPER στο φόρουμ Wireless Networking
    Μηνύματα: 2
    Τελευταίο Μήνυμα: 08-11-07, 23:28
  3. Βοήθεια στην Access
    Από Hardil στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 5
    Τελευταίο Μήνυμα: 17-07-07, 10:02
  4. ACCESS βοήθεια για εκτυπωση
    Από JIANNISBE στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 6
    Τελευταίο Μήνυμα: 17-11-05, 16:03
  5. Μια βοήθεια σε excel η access γιατι κολλησα;;
    Από princess στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 12
    Τελευταίο Μήνυμα: 22-09-05, 13:03

Tags για αυτό το Θέμα

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας