www.MsAccess.gr

Access Σχέσεις Πινάκων

•There are no translations available.•

[ Απόσπασμα κειμένου από Forum.msaccess.gr Topic MsAccess Tools. Συντάχθηκε από Χαράλαμπο Χρήστου. ]

Η Access αποτελεί ένα σχεσιακό σύστημα βάσεων δεδομένων. Αναπόσπαστο μέρος των σχεσιακών συστημάτων αποτελούν οι πίνακες μέσα στους οποίους γίνεται η καταγραφή των στοιχείων που περιέχει η βάση σας. Ωστόσο, αφήνοντας τους πίνακες μόνους τους και ανεξάρτητους μεταξύ τους δεν έχετε την δυνατότητα να απαντήσετε σε ερωτήματα του τύπου:

α)Πόση ποσότητα από το προϊόν Χ πουλήθηκε την περασμένη εβδομάδα;(πίνακες Products και Sales)

β)Πόσα χρήματα οφείλει στο τιμολόγιό του ο πελάτης Χ;(πίνακες Invoices και Customers)Γίνεται σαφής λοιπόν η ανάγκη για συσχέτιση των πινάκων που δημιουργείται στην Access έτσι ώστε η μεταξύ τους εξάρτηση – σχέση να σας παρέχει τη δυνατότητα ανάκτησης πληροφοριών οι οποίες βρίσκονται σε πολλούς διαφορετικούς πίνακες.  

Ορίζοντας μια σχέση (relationship)Οι βασικοί κανόνες που πρέπει να θυμάστε για να ορίσετε μια σχέση μεταξύ των πινάκων είναι οι εξής:
1. Κάθε σχέση (
relationship) συνδέει δύο πεδία όπου το καθένα ανήκει σε ένα διαφορετικό πίνακα. Πρωταρχικό σας μέλημα είναι να ταυτοποιήσετε - καθορίσετε το πεδίο που θα χρησιμοποιείσετε στο γονικό πίνακα (parent table). Σε μια καλά σχεδιασμένη βάση δεδομένων το πεδίο που χρησιμοποιείται στο γονικό πίνακα είναι το πεδίο που είναι πρωτεύον κλειδί (primary key field) που ταυτοποιεί μοναδικά κάθε εγγραφή του γονικού πίνακα.

2. Ανοίγετε το child πίνακα σε προβολή σχεδιάσης και δημιουργείται εκεί το άλλο πεδίο της διασύνδεσης, αν δεν υπάρχει ήδη. Κάθε εγγραφή του child πίνακα που περιέχει πληροφορίες δημιουργεί ένα σύνδεσμο που δείχνει σε μια εγγραφή του γονικού πίνακα (parent table). Παρατήρηση: Αν το πεδίο που καθορίσατε στο γονικό πίνακα έχει τύπο δεδομένων Auto Number τότε το πεδίο στον child πίνακα πρέπει να χρησιμοποιεί τον τύπο δεδομένων Number.   

Τα βασικά είδη σχέσεων στην Access 

1)      Ένα προς πολλά (one-to-many): Είναι η πιο συνηθισμένη σχέση που συναντάνται στην Access. Συνδέει μία εγγραφή του γονικού πίνακα (parent table) με μηδέν, μία ή περισσότερες εγγραφές του child πίνακα. Για παράδειγμα ένα κατασκευαστής προϊόντων μπορεί να συνδέεται με ένα μόνο προϊόν, πολλά προϊόντα, ή και με κανένα προϊόν [πίνακες Manufacturer και Products].

2)      Ένα προς ένα (one-to-one): Η σχέση αυτή συνδέει μία εγγραφή ενός πίνακα με καμία ή με μία εγγραφή του άλλου πίνακα. Σύχνα χρησιμοποιείται για να σπάμε ένα πίνακα στον οποίο περιέχονται πολλά πεδία σε δύο ή περισσότερους μικρότερους πίνακες. Η Access δεν σας επιτρέπει να δημιουργείται πίνακες με περισσότερα από 255 πεδία. Μερικοί από τους λόγους που μπορεί να σας κάνουν να χωρίσετε ένα πίνακα είναι οι ακόλουθοι:

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

·        Μπορεί να θέλετε να αποκρύψετε ευαίσθητα δεδομένα ενός πίνακα. Κατά αυτόν τον τρόπο βάζετε τις ευαίσθητες πληροφορίες σε ένα ξεχωριστό πίνακα και βάζετε αυτόν τον πίνακα μέσα σε ένα διαφορετικό πιο ασφαλές αρχείο βάσεων δεδομένων.

·        Μπορεί να έχετε ένα πίνακα που αποθηκεύονται μέσα του μεγάλες ποσότητες δεδομένων, όπως για παράδειγμα να διαθέτει ένα πεδίο τύπου Attachment (ο τύπος αυτός ισχύει μόνο στην Access 2007) μέσα στο οποίο περιέχονται έγγραφα τεράστια σε μέγεθος. Σε αυτή την περίπτωση για θέμα απόδοσης είναι καλύτερο να χωρίσετε αυτόν τον πίνακα και ακόμη μπορείτε να βάλετε το ένα τμήμα του πίνακα σε μία ξεχωριστή βάση.

·        Μπορεί να διαθέτετε ένα πίνακα στον οποίο πολλά από τα δεδομένα του είναι προαιρετικά. Αντί να έχετε πολλά κενά πεδία σ’ αυτόν τον πίνακα μπορείτε να χωρίσετε τα προαιρετικά πεδία να περιλαμβάνονται σε ένα άλλο πίνακα. Κατά αυτόν τον τρόπο, αν δεν εισαχθεί ποτέ καμία πληροφορία σε αυτά τα προαιρετικά πεδία, δεν θα προστίθεται και εγγραφή στον συνδεδεμένο πίνακα. Σε μια σχέση one-to-one τα συνδεδεμένα πεδία και των δύο πινάκων στους οποίους σπάει ο αρχικός μας πίνακας πρέπει να εμποδίζουν τις διπλοεγγραφές σε αυτούς τους ξεχωριστούς πίνακες. Με άλλα λόγια μία εγγραφή στον ένα πίνακα μπορεί το πολύ να συνδεθεί με μία μόνο εγγραφή του άλλου πίνακα. Ένα πεδίο του πίνακα εμποδίζει τις διπλοεγγραφές αν είναι καθορισμένο ως πρωτεύον κλειδί (primary-key) ή αν έχει ένα ευρετήριο το οποίο εμποδίζει τις διπλοεγγραφές.

3)      Πολλά-προς-πολλά (many-to-many): Αυτή η σχέση συνδέει μία ή περισσότερες εγγραφές ενός πίνακα με μία ή περισσότερες εγγραφές ενός άλλου πίνακα. Για παράδειγμα έστω ότι έχετε τους πίνακες Authors (συγγραφείς) και Books (βιβλία) τα οποία αυτοί γράφουν. Ένας συγγραφέας μπορεί να έχει γράψει πολλά βιβλία αλλά ταυτόχρονα και ένα βιβλίο μπορεί να έχει γραφτεί από πολλούς συγγραφείς. Παρόμοια παραδείγματα της καθημερινότητας αποτελούν οι σχέσεις μεταξύ Students (μαθητών) και Classes (τάξεων), Employees (υπαλλήλων) και Committees (επιτροπών), Ingredients (συστατικών) και Recipes (συνταγών). Η Access σας δίνει τη δυνατότητα να ασχοληθείτε με αυτή τη σχέση με δύο τρόπους:

·        Διασυνδεδεμένοι πίνακες (junction tables)

·        Πεδία πολλαπλών τιμών (multi-value fields) [υποστηρίζεται μόνο στην Access 2007] - Διασυνδεδεμένοι πίνακες (junction tables): Σε αυτή την περίπτωση δημιουργείται ένας έξτρα πίνακας που βοηθάει στην ένωση δύο πινάκων. Κάθε εγγραφή στον διασυνδεδεμένο πίνακα (junction table) αναπαριστά μια σύνδεση με μια εγγραφή σε καθένα από τους δύο πίνακες που συμμετέχουν στην σχέση. Για παράδειγμα έστω ότι έχετε τον παρακάτω πίνακα Authors: 

ID

FirstName

LastName

10PetrosKaragiannis
11AntonisKadoglou
12GiorgosGrigoriou
 και τον παρακάτω πίνακα Books:

ID

Title

Published

402Software EngineeringFebruary 2, 2005
403AlgorithmsSeptember 10, 2002
404Wireless NetworksNovember 11, 2004
 Ο διασυνδεδεμένος πίνακας των δύο παραπάνω πινάκων θα είναι ο ακόλουθος[πίνακας Authors_Books]:
IDAuthorIDBookID
110402
211403
312403
411404
 Όπως βλέπετε ο ακόλουθος πίνακας είναι ένας διασυνδεδεμένος πίνακας που ορίζει τέσσερις συνδέσεις με δύο άλλους πίνακες. Η πρώτη εγγραφή δηλώνει πως ο συγγραφέας (Petros Karagiannis) έγραψε το βιβλίο με κωδικό ID 402 (Software Engineering). Ο συγγραφέας με ID 11 (Antonis Kadoglou) συνεισέφερε στην εγγραφή δύο βιβλίων, ID 403, ID 404 (Algorithms, Wireless Networks), καθώς επίσης το βιβλίο με ID 403 (Algorithms) γράφτηκε από 2 συγγραφείς με ID 11, ID 12 (Antonis Kadoglou, Giorgos Grigoriou). Ένας junction table δημιουργείται στην ουσία από δύο σχέσεις one-to-many (ένα προς πολλά). Με άλλα λόγια, ο junction table είναι ένας child πίνακας που έχει δύο γονικούς πίνακες (parent tables). Ο πίνακας Authors έχει μια ένα-προς-πολλά σχέση με τον πίνακα Authors_Books, με τον πίνακα Authors να είναι ο γονικός πίνακας. Ο πίνακας Books έχει μία ένα-προς-πολλά με τον πίνακα Authors_Books και είναι παράλληλα και ο γονικός πίνακας στη σχέση.- Πεδία πολλαπλών τιμών (multi-value fields): Aποτελεί την άλλη εναλλακτική λύση της Microsoft με σκοπό την υποστήριξη των SharePoint υπηρεσιών που προσφέρει. Όπως φαίνεται και από το όνομα της, σε αυτή την περίπτωση μπορεί να έχετε ένα πεδίο μέσα στο οποίο μπορείτε να αποθηκεύσετε περισσότερες από μία τιμές. Αυτό που κάνετε εδώ είναι να βάζετε το συνδεδεμένο πεδίο στον child πίνακα σαν ένα πεδίο πολλαπλών τιμών (multi-value field). Ας πάρουμε πάλι το παράδειγμα με τους πίνακες Authors και Books. Χωρίς την ύπαρξη του junction table Authors_Books, χρειάζεται να συμπληρώσετε τον πίνακα Books με ένα νέο πεδίο AuthorID έτσι ώστε να γνωρίζετε ποιος συγγραφέας έγραψε ένα δοθέν βιβλίο. 

ID

Title

Published

AuthorID

402Software EngineeringFebruary 2, 200510
403AlgorithmsSeptember 10, 200211
404Wireless NetworksNovember 11, 200411
 Κατά αυτόν τον τρόπο όμως, ένα κανονικό πεδίο μπορεί να κρατά μία μόνο τιμή και ο παραπάνω πίνακας μπορεί να σας πληροφορήσει για έναν μόνο από τους συγγραφείς του βιβλίου με ID 403. Aν όμως αλλάξετε το πεδίο AuthorID και το κάνετε τύπου πολλαπλών τιμών (multi-value field) τότε μπορείτε μέσα σε αυτό να εισάγετε μια λίστα από συγγραφείς όπως φαίνεται στο παρακάτω παράδειγμα:

ID

Title

Published

AuthorID

403AlgorithmsSeptember 10, 200211, 12
 Στο παρασκήνιο ένα πεδίο πολλαπλών τιμών στην πραγματικότητα χρησιμοποιεί ένα junction table. Ωστόσο όλες αυτές οι λεπτομέρειες αποκρύπτονται από την Access. Τα πεδία πολλαπλών τιμών είναι διαθέσιμα μόνο αν χρησιμοποιείται το format .accdb και όχι το format .mdb. Επίσης ο Microsoft SQL Server δεν τα υποστηρίζει, γι’αυτό το λόγο αν αποφασίσετε να μετακινήσετε τα δεδομένα της βάσης σας σε έναν SQL Server θα ήταν καλό να αποφύγετε τα πεδία πολλαπλών τιμών. 

Παραδείγματα του πραγματικού κόσμου 

Έστω ότι υπάρχει μια επιχείρηση η οποία δέχεται παραγγελίες για τα προϊόντα τα οποία πουλάει ηλεκτρονικά και τα οποία τα στέλνει ταχυδρομικά στους πελάτες της. Η επιχείρηση αυτή οργανώνοντας κατάλληλα τα δεδομένα της με την Access θα έχει τη δυνατότητα να παρακολουθεί τις παραγγελίες της καθώς επίσης και τους πελάτες της. Υπάρχουν οι παρακάτω πίνακες:

Products: μέσα σε αυτό τον πίνακα περνιέται όλος ο κατάλογος των προϊόντων που διαθέτει η επιχείρηση. Αυτός ο πίνακας καταγράφει το όνομα (name), την περιγραφή (description) και την τιμή (price) κάθε διαθέσιμου προϊόντος. Επίσης υπάρχουν δύο αριθμητικά πεδία (UnitsInStock και UnitsOnOrder) που δείχνουν πόση ποσότητα από ένα συγκεκριμένο προϊόν βρίσκεται στην αποθήκη αλλά και πόση πόσοτητα από αυτό το προϊόν βρίσκεται σε κατάσταση παραγγελίας. Ακόμη ένα πεδίο τύπου Yes/No με όνομα Discontinued δηλώνει προϊόντα που δεν είναι διαθέσιμα πια. Ένα τέτοιο πεδίο είναι πάρα πολύ χρήσιμο για την επιχείρηση γιατί της δίνει τη δυνατότητα να διαγράφει παλιά προϊόντα τα οποία δεν βρίσκονται πλέον στο κατάλογό της και τα οποία συνδέονται με παλιές παραγγελίες καθώς επίσης είναι σημαντικά και για να μπορεί η επιχείρηση να κρατά ιστορικά στοιχεία τα οποία έπειτα μπορεί να αναλύει.

ProductCategories: Ο πίνακας αυτός χωρίζει τα προϊόντα της επιχείρησης σε ομάδες. Με αυτόν τον τρόπο οι πελάτες της επιχείρησης θα έχουν την δυνατότητα να αναζητούν προϊόντα στην ομάδα την οποία αυτοί θέλουν όπως για παράδειγμα λαχανικά, φρούτα, γλυκύσματα κτλ.

Customers: Στον πίνακα αυτό κρατούνται πληροφορίες σχετικά με τους πελάτες οι οποίοι έχουν κάνει κάποια παραγγελία. Κρατείται το όνομα του πελάτη (name), οι πληροφορίες διαμονής του που θα παραδοθούν τα προϊόντα (shipping information) και πληροφορίες σχετικά με το λογαριασμό του και τον τρόπο πληρωμής (billing information). Βέβαια υπάρχουν πολλές επιχείρησεις που επιτρέπουν στους πελάτες τους να δηλώνουν πολλαπλές διευθύνσεις για μεταφορά των προϊόντων τους καθώς επίσης και πολλαπλές πιστωτικές κάρτες. Σε μια τέτοια περίπτωση χρειάζεται να χρησιμοποιείτε περισσότερους πίνακες, όπως για παράδειγμα θα μπορούσατε να δημιουργήσετε ένα πίνακα CustomerCreditCards όπου κάθε εγγραφή στον πίνακα Customers θα συνδεόταν με μία ή περισσότερες εγγραφές στο πίνακα CustomerCreditCards. Ωστόσο, εδώ θα ακολουθηθεί η απλή περίπτωση.

Orders: Αυτός ο πίνακας περιέχει κάθε παραγγελία που κάνει κάποιος πελάτης. Συνδέει τον πελάτη που έκανε την παραγγελία και προσθέτει πληροφορίες όπως την ημερομηνία που έγινε η παραγγελία. Μέσα στον πίνακα δεν υπάρχει πεδίο που να κρατά το συνολικό κόστος της παραγγελίας γιατί πολύ απλά το συνολικό κόστος της είναι το άθροισμα του κόστους όλων των παραγγελθέντων προϊόντων. Αν υπήρχε θα δημιουργούνταν πρόβλημα αν το συνολικό κόστος της παραγγελίας που θα είχε καταγραφεί στον πίνακα Orders δεν συμφωνούσε με το κόστος όλων των παραγγελθέντων προϊόντων στον πίνακα OrderDetails που ακολουθεί.

OrderDetails: Ο πίνακας αυτός περιέχει τα μεμονωμένα αντικείμενα που υπάρχουν σε μια παραγγελία. Κάθε εγγραφή του πίνακα OrderDetails περιέχει το ID του προϊόντος που παραγγέλθηκε, τον αριθμό των μονάδων που παραγγέλθηκαν από το συγκεκριμένο προϊόν, καθώς και την τιμή με την οποία αυτές οι ποσότητες παραγγέλθηκαν. Επειδή τις περισσότερες φορές σε μια παραγγελία περιέχονται περισσότερα του ενός αντικείμενα, μία μόνο εγγραφή στον πίνακα Orders είναι συνήθως συνδεδεμένη με πολλές εγγραφές στον πίνακα OrderDetails. Όπως βλέπετε καταγράφεται και σε αυτό τον πίνακα η τιμή με την οποία παραγγέλθηκε το προϊόν γιατί οι επιχειρήσεις συχνά κάνουν εκπτώσεις στις τιμές των προϊόντων τους και έτσι αν δεν υπήρχε εδώ σε αυτό τον πίνακα πεδίο για την τιμή του παραγγελθέντος προϊόντος αλλά υπήρχε μόνο πεδίο για την τιμή του στον πίνακα Products, θα είχε πρόβλημα η επιχείρηση στο να διαπιστώσει πόσα χρήματα τις οφείλει ένας πελάτης της.  Εκτός από όλους αυτούς τους πίνακες αν θέλατε να κάναμε ακόμη πιο επαγγελματική τη βάση σας ίσως θα ήταν καλό να φτιάξετε ένα πίνακα Shipments με τον οποίο θα ελέγχεται την αποστολή των εμπορευμάτων σας προς τον πελάτη καθώς και ένα πίνακα πληρωμών (Payments) μέσα στον οποίο θα καταγράφετε τους πελάτες που σας έχουν εξοφλήσει τελείως για τα προϊόντα που σας αγόρασαν. Ωστόσο όσο πιο πολλούς πίνακες φτιάχνεται τόσο πιο πολύ σύνθετη γίνεται και η βάση σας και απαιτεί προσεχτικότερο χειρισμό εκ μέρους σας όσον αφορά τη διαχείρισή της. 

Δημιουργία των σχέσεων του παραπάνω παραδείγματος με την Access 2000

Αφού έχουμε ήδη δημιουργήσει τους παραπάνω πίνακες στην Access είμαστε έτοιμοι να εισάγουμε τις σχέσεις που τους διέπουν.  

•Last Updated on ••Tuesday•, 10 •February• 2009 09:32••