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

 

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

Εναλλακτικό Ερώτημα (ms access)

Îåêßíçóå áðü ôï ìÝëïò KoYkoY. Τελευταία δημοσίευση από το μέλος KoYkoY στις 14-06-2006, 15:36. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-06-2006, 16:21 13996

    Smile [:)] Εναλλακτικό Ερώτημα (ms access)

    Σε μια βάση δεδομένων της ms access έχω ένα πίνακα [tblGroup] με βασικό κλειδί ένα πεδίο autonumber [GroupID]  και ένα πεδίο ημερομηνίας [GroupDate] ο οποίος περιέχει 18 επιπλέον πεδία όπου καταχωρούνται ονόματα συμμετεχόντων [Participant1] έως 18. Ο χρήστης συμπληρώνει την κάθε εγγραφή μέσω μίας φόρμας με 18 σύνθετα πλαίσια που παίρνουν τιμές από τη λίστα μελών [tblMembersList]. Θέλω να δημιουργήσω  μία αναφορά όπου ο χρήστης θα βλέπει ομαδοποιημένες ανά συμμετέχοντα τις ομάδες και τις ημερομηνίες που έχει πάρει μέρος.

    Για να το καταφέρω αυτό έχω δημιουργήσει ένα ερώτημα συνένωσης qrGroupMembers ως εξής:
    SELECT [Particiapant1] As [Participant], [GroupID], [GroupDate]
    FROM tblGroups
    WHERE Nz([Participant1])<>""
    UNION SELECT [Participant2], [GroupID], [GroupDate]
    FROM tblGroups
    WHERE Nz([Participant2])<>""
    κλπ έως 18;

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

  •  13-06-2006, 17:26 13997 σε απάντηση της 13996

    Απ: Εναλλακτικό Ερώτημα (ms access)

    Μάλλον το πρόβλημα σου είναι ότι έχεις σχεδιάσει την βάση με λάθος τρόπο.

    Εγώ θα έβαζα τους συμμετέχοντες σε μια στήλη και εκεί μέσα θα καταχωρούσα για τον καθένα ξεχωριστά την ημερομηνία που έχει παρουσιαστεί. Έτσι δεν θα είχα κενά πεδία (όπως φαντάζομαι ότι έχεις) στους participant 1-18 και θα είχα μόνο 3 στήλες. Το αποτέλεσμα θα ήταν μικρότερη σε μέγεθος βάση και πιο εύκολα διαχείρισημη.

  •  13-06-2006, 19:02 13998 σε απάντηση της 13997

    Απ: Εναλλακτικό Ερώτημα (ms access)

    Συμφωνώ οτι πρέπει να επανασχεδιαστεί. Ετσι οπως έχει σχεδιαστεί δεν καλύπτει ουτε τον 1NF. Για να ξανασχεδιαστεί όμως (αν το επιθυμείς), θα πρέπει να μας δώσεις μερικές πληροφορίες ακόμα όπως:

    Τα groups είναι ad-hoc (δημιουργούνται δηλ. με βάση μια συγκεκριμένη ημ/νία) ή χρησιμοποιούνται συνέχεια, το ίδιο γκρουπ σε διάφορες ημ/νίες;

    Αν ισχύει το δεύτερο από παραπάνω, κάθε φορά ένα γκρουπ έχει διαφορετικούς συμμετέχοντες;


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  13-06-2006, 21:24 14002 σε απάντηση της 13998

    Απ: Εναλλακτικό Ερώτημα (ms access)

    Οι συμμετέχοντες μπορεί να είναι οι ίδιοι αλλά και διαφορετικοί για άλλο γκρουπ - όταν λέω γκρουπ το ταυτίζω με το GroupID. Ακόμα υπάρχει η πιθανότητα διαφορετικά γκρουπς αλλά με τους ίδιους συμμετέχοντες να παίζουν την ίδια ημερομηνία.
    To 1NF έχει σχέση με το σχεσιακό μοντέλο; Τί είναι ακριβώς;Wink

     

     

     

  •  14-06-2006, 11:38 14011 σε απάντηση της 14002

    Απ: Εναλλακτικό Ερώτημα (ms access)

    Σου έγραψα κάποια πράγματα για τους Normal Forms (Κανονικές Μορφές) αλλά δυστυχώς ένα αναπάντεχο crash ήταν η αιτία να χαθούν. Παντως, για να δεις ορισμένα πράγματα για τις κανονικές μορφές (οι οποίες αποτελούν guidelines για το σχεδιασμό σχεσιακών βάσεων δεδομένων) μπορείς να πας π.χ. εδώ:

    http://www.answers.com/topic/database-normalization
    http://www.phlonx.com/resources/nf3/
    http://en.wikipedia.org/wiki/Database_normalization

    Ο επαναλαμβανόμενος αριθμός ομοειδών πεδίων σε μια γραμμή με τον κίνδυνο κάποια να μένουν κενά ειναι απαγορευτικός από τα εν λόγω guidelines, εμμέσως μεν, σαφώς δε. Προκύπτουν διάφορα προβλήματα ως προς το χώρο αποθήκευσης αλλά και την ενημέρωση σε περίπτωση π.χ. που θέλεις να διαγράψεις ολοσχερώς κάποιο συμμετέχοντα (σε ποιό από τα 18 πεδία βρίσκεται σε κάθε εγγραφή);

    Για να δούμε όμως μια άλλη προσέγγιση της σχεδίασης που βρίσκεται στον 3NF:

    Εχω αυθαιρετήσει λιγάκι ως προς τον πίνακα tblMembersList λόγω του οτι δεν ειχα ιδιαίτερη πληροφορία για αυτόν. Αυτό που κάνω εδώ είναι να έχω ορίσει ένα πίνακα για τα groups (θεωρώ οτι ένα group είναι η ονομασία του και η ημ/νία του - δηλ. ουσιαστικά η δημιουργία ενός group είναι η ημ/νία του) και σε αυτο μπορούν να συμμετέχουν n συμμετέχοντες οι οποίοι επιλέγονται από τον πίνακα tblMembersList. Ως ενδιάμεσο πίνακα έχω τον πίνακα tblParticipations, του οποίου κάθε γραμμή είναι το primary key (ενα autonumber), και ο συνδυασμός groupid/memberid. Καθε γραμμή του πίνακα δηλ. είναι μια συμμετοχή ενός ατόμου σε ένα γκρουπ. (Το primary key - participationID θα μπορούσε και να μην υπάρχει, μια και ο συνδυασμός groupid/memberid προσδιορίζει μοναδικά κάθε εγγραφή του πίνακα - είναι από μόνη της ένα surrogate key).

    Ετσι έχεις την ευκολία να ορίσεις από έναν ως n συμμετέχοντες σε κάθε γκρουπ, ενώ αν θέλεις περιορισμούς ως προς το μέγιστο αριθμό μπορείς να τους επιβάλλεις στην πλευρά του user interface.

    Για να κάνουμε το Query που θέλεις σε αυτό τον πίνακα:

    SELECT tblMembersList.memberName, tblGroup.groupDescription, tblGroup.groupDate
    FROM tblMembersList INNER JOIN (tblGroup INNER JOIN tblParticipations ON tblGroup.groupID = tblParticipations.groupId) ON tblMembersList.memberId = tblParticipations.memberId
    ORDER BY tblMembersList.memberName, tblGroup.groupDescription, tblGroup.groupDate;

    Και σχηματικά:

    Το αποτέλεσμα που παίρνω (χρησιμοποίησα το πεδίο groupDescription αντί του groupID για να είναι πιό ξεκάθαρο):


    Ο χρόνος εκτέλεσης είναι αμελητέος.

    Βεβαια, δεν ειμαι απόλυτα σίγουρος οτι θέλεις να κάνεις ακριβώς αυτό, όμως με βάση τα δεδομένα που μας δίνεις, κατά 90% θα πρέπει να σε καλύπτει κάτι τέτοιο.

     

     

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  14-06-2006, 15:36 14016 σε απάντηση της 14011

    Απ: Εναλλακτικό Ερώτημα (ms access)

    Cap ευχαριστώ πολύ για τις αναλυτικές οδηγίες και τα χρήσιμα links.Big Smile
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems