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

 

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

DB question - relations

Îåêßíçóå áðü ôï ìÝëïò dimos.homatas. Τελευταία δημοσίευση από το μέλος dimos.homatas στις 11-08-2011, 08:42. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-08-2011, 15:40 66780

    DB question - relations

    Πχ έχω τους πίνακες Α και Β με primary keys int A_ID & B_ID αντίστοιχα

    Η σχέση των δεδομένων είναι πολλά προς πολλά, οπότε δημιουργώ τον πίνακα C και ορίζω ως composite key τα A_ID & B_ID

    Μέχρι εδώ καλά. Η ερώτηση είναι η εξής: 

    Εάν θέλω να προσθέσω κάποια attributes (έξτρα πεδία) στην σχέση, ποιο είναι το best practice?

    Βάζω απλά περισσότερες στήλες στον πίνακα C?

    Συσχετίζω με τον/τους πίνακες που θέλω και χρησιμοποιώ το composite key ως foreign key?

    Δημιουργώ ένα identity και ορίζω εκείνο ως PK και συσχετίζω με εκείνο;

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  08-08-2011, 21:03 66782 σε απάντηση της 66780

    Απ: DB question - relations

    Προτού γράψω τη γνώμη μου θα ήθελα να ρωτήσω αν το business logic είναι σωστό. Νομίζω ότι από τη στιγμή που για το C πρέπει να κρατηθεί επιπλέον πληροφορία μιλάμε για αυθύπαρκτο object και όχι για many to many relationship. Ένα τέτοιο παράδειγμα αποτελεί το: Μαθητής - Καθηγητής - Εξέταση. Η "Εξέταση" έχει ημερομηνία, μάθημα, βαθμό και βεβαίως τον Καθηγητή που εξετάζει και τον Μαθητή που εξετάζεται. Και αν θέλουμε να ορίσουμε ένα composite key γι' αυτήν τότε, εκτός των πεδίων Μαθητής - Καθηγητής, πρέπει να συμπεριλάβουμε την ημερομηνία, αλλά και το μάθημα. Δηλαδή, ΔΕΝ ισχύει η μοναδικότητα του συνδυασμού "Μαθητής - Καθηγητής".

    Αντίστοιχα, κλασικό many to many παράδειγμα αποτελεί το Συγγραφείς - Βιβλία. Το ότι ένα βιβλίο μπορεί να έχει περισσότερες της μίας εκδόσεις, αυτό δεν πρέπει να μας μπερδεύει γιατί κάθε έκδοση είναι και ξεχωριστό βιβλίο. Μπορεί ο τίτλος να παραμένει ο ίδιος, αλλά το ISBN αλλάζει. Αν, λοιπόν, επιλέξουμε να δημιουργήσουμε διαφορετικό πεδίο για την έκδοση, τότε για το πεδίο του τίτλου πρέπει να μεριμνήσουμε ώστε το index που θα δημιουργήσουμε να μην είναι unique. Έτσι, δεν "διαταράσσεται" η "αρχή" του many to many relationship.

    Θα ήθελες να δώσεις λίγα παραπάνω στοιχεία για τα A, B, C και το είδος της πληροφορίας που θέλεις να γράψεις στο C; Σίγουρα ο συνδυασμός 'ΑΒ' είναι μοναδικός; Αν ναι, μήπως η επιπλέον πληροφορία πρέπει να κρατηθεί είτε στο A object είτε στο B object, όπως στην περίπτωση "Βιβλίο - Συγγραφέας";

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  09-08-2011, 00:08 66788 σε απάντηση της 66782

    Απ: DB question - relations

    Ευχαριστώ για την απάντηση Μάρκο, ιδού και τα λοιπά στοιχεία λοιπόν:

    Καταρχάς πρόκειται για συνοδό σύστημα (security/permissions) και όχι για κατ'εξοχήν business logic - από πλευράς business τουλάχιστον.

    Χάριν απλότητας, θεωρώ ότι τα επιπλέον πεδία είναι του στυλ timestamp, user κλπ χωρίς περαιτέρω constraints ή κανόνες, δεν επηρεάζουν δηλαδή την μοναδικότητα της εγγραφής στον πίνακα C, αλλά θα μπορούσαμε να πούμε ότι την χαρακτηρίζουν.

    Βέβαια το παράδειγμα πάει και παραπέρα, πχ πως συσχετίζω έναν τέτοιο πίνακα με έναν άλλον κλπ

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  09-08-2011, 19:43 66790 σε απάντηση της 66788

    Απ: DB question - relations

    Αν κατάλαβα καλά, μιλάμε για audit trail. Δε χρειάζεται να συσχετίσεις πίνακες μεταξύ τους. Όλη την "κίνηση" μπορείς να την καταγράψεις σε έναν πίνακα. Αν δώσεις στο Google "entity framework audit trail" ή "ado.net audit trail" θα έρθουν πολλά αποτελέσματα. Δε συστήνω κανένα από αυτά στο σύνολό του. Μπορείς να τα μελετήσεις όλα και να συνθέσεις κάτι δικό σου, που θα εξυπηρετήσει ακριβώς τις ανάγκες σου. Ένα παράδειγμα είναι το "Auditing Data Changes in the Entity Framework", Part 1 και Part 2 ή αντίστοιχο δημοσίευμα στο Code Project (Part 1, Part 2). Σχετικές συζητήσεις έχουν γίνει και στο DNZ. Προσωπικά, για κάτι τέτοιο θα χρησιμοποιούσα stored procedures.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  10-08-2011, 22:04 66798 σε απάντηση της 66790

    Απ: DB question - relations

    Λάθος δικό μου, δεν πρόκειται για audit trail - τα άρθρα που παρέθεσες πάντως το καλύπτουν πλήρως.

    Στην ουσία, έτσι όπως διαμορφώνεται το θέμα, το ζουμί μίας πλευράς της ερώτησης είναι το "ποιος είναι ο ενδεδειγμένος τρόπος για να συσχετίσω έναν πίνακα ΑΒ (όπως στο παράδειγμα) με έναν πίνακα C. Χρησιμοποιώ το composite key ή δημιουργώ ένα νέο identity χάριν πχ performance;". Αν και δεν ξέρω πόσο συνταρακτικό είναι το θέμα του performance σε αυτήν την περίπτωση...

    Αν και για να πω καλύπτομαι σε ικανοποιητικό βαθμό με αυτό:

    "...  Νομίζω ότι από τη στιγμή που για το C πρέπει να κρατηθεί επιπλέον πληροφορία μιλάμε για αυθύπαρκτο object και όχι για many to many relationship ..."

    Παρόλα αυτά, ακόμα και σε αυτήν την περίπτωση, θα ήθελα να ξέρω τον σωστό τρόπο για να απεικονιστεί αυτό στην βάση.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  10-08-2011, 23:39 66799 σε απάντηση της 66798

    Απ: DB question - relations

    Δεν παίρνω θέση. Ας μιλήσουν κι άλλοι. Ένα καλό σημείο αφετηρίας είναι αυτή η συζήτηση. Νομίζω ότι είναι κοντά σ' αυτό που θέλεις να κάνεις. Καμιά φορά δεν είναι κακό να συζητάμε για πράγματα που θεωρούνται δεδομένα και αυτονόητα.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  11-08-2011, 08:42 66801 σε απάντηση της 66799

    Απ: DB question - relations

    Big Smile><img src=" title="Big Smile" border="0" width="19" height="19" tabindex="1">


    Το έχω διαβάσει αυτό το άρθρο εδώ και καιρό. Και για να πω την αλήθεια, είμαι υπέρ της χρήσης των composite pks, μιας και τα δεδομένα αντιπροσωπεύονται όπως είναι και στην πραγματικότητα, και η σωστή αναπαράσταση των δεδομένων αποτελεί την σωστή βάση για να χτιστεί μια εφαρμογή - να έχει προηγηθεί και κάποια σωστή ανάλυση πρώτα βέβαια. Είναι εκπληκτικό όμως, το πόσος κόσμος θεωρεί ότι ένας πίνακας "πρέπει να έχει ένα primary key" - μην γνωρίζοντας ότι μπορείς να έχεις composite!

    Προσοχή όμως, κρατάω και μία πισινή για πιθανά θέματα performance, απλά υιοθετώ την στάση "εάν προκύψει θέμα, το εξετάζουμε".

    Πάντως, μου προκαλεί έκπληξη ότι το συγκεκριμένο θέμα αποτελεί debate - τι λέει η θεωρία δηλαδή; Τι λέει το Software Engineering;

    Πάντως σε ένα σχόλιο της παραπάνω συζήτησης αναφέρει κάποιος κάτι πολύ σωστό κατά την γνώμη μου:

    "... Relationship tables also tend to grow attributes of their own and suddenly become entity tables in their own right, at which point it becomes awkward if you have a multi-column key, better to just start with a key that works for all scenarios. ..."

    Abstraction σε database δηλαδή... 

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems