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

 

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

Καλύτερος Σχεδιασμός Βάσης

Îåêßíçóå áðü ôï ìÝëïò basilis. Τελευταία δημοσίευση από το μέλος azazeal στις 18-11-2008, 03:24. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  14-11-2008, 17:51 46212

    Καλύτερος Σχεδιασμός Βάσης

    Έχω το εξής σχεδιαστικό πρόβλημα και θα ήθελα την γνώμη σας:

    Δημιουργώ μία βάση που θα αποθηκεύσει τους πελάτες και τα project τους. Υπάρχει συγκεκριμένος αριθμός τύπων project, που κάθε ένας έχει εντελώς διαφορετικά χαρακτηριστικά το άλλον. Πχ μερικοί τύποι project είναι τα hosting, domain, graphicDesign κλπ. Έχω δημιουργήσει έναν πίνακα για κάθε τύπο project.

    Επιπλέον κάθε εγγραφή στους παραπάνω πίνακες έχει 1 ή παραπάνω οικονομικές χρεώσεις που αποθηκεύονται στον πίνακα Financial. Έτσι λοιπόν αυτή τη στιγμή αναγκάζομαι να έχω έναν πίνακα Financial ο οποίος έχει την εξής δομή:

    id_financial, id_targetTable, targetTable, other_financial_data...

    Στο targetTable κρατάω το όνομα του πίνακα στον οποίο αντιστοιχεί η συγκεκριμένη χρέωση και στο id_targetTable κρατάω το id της εγγραφής του πίνακα.

    ΠΧ Έστω ότι έχω μια εγγραφή στην πίνακα Financial με κωδικό 1. Έστω ακόμα ότι η συγκεκριμένη χρέωση αντιστοιχεί σε μια εγγραφή του πίνακα hostingTable με κωδικό 12. Τότε η εγγραφή στον Financial είναι κάπως έτσι:

    1, 12, 'hostingTable', other_financial_data...

    Ο τρόπος αυτός δεν είναι καλός κατά την γνώμη μου γιατί δεν κάνει χρήση των ξένων κλειδιών της Βάσης και ψάχνω έναν καλύτερο. Σημειώνεται ότι δε γίνεται να βάλλω 1 πεδίο (ξένο κλειδί) id_financial στους πίνακες hostingTable, domainTable, graphicDesignTable κλπ γιατί οι χρεώσεις σε κάθε εγγραφή μπορεί να είναι από 1 έως n.

    Υπάρχει κάποιος καλύτερος τρόπος σχεδίασης της βάσης για το παραπάνω; Υπάρχει τρόπος να χρησιμοποιήσω πραγματικά ξένα κλειδιά;

    --

    Σημειώνεται η παρακάτω λύση δεν είναι καθόλου καλή:

    - Φτιάχνω έναν ενδιάμεσο πίνακα για κάθε έναν από τους πίνακες των project, στον οποίο σώζω την αντιστοιχία id_targetTable, id_financial (πχ για τον πίνακα hosting έχω το ζευγάρι id_hostingTable, id_financial)
    - Δείχνω το id_targetTable στο πρωτεύον κλειδί του πίνακα με το συγκεκριμένο τύπο project και το id_financial στο πρωτεύον κλειδί του πίνακα financial (πχ για τον ενδιάμεσο πίνακα hostingMiddle το id_hostingTable θα δείχνει στο κλειδί του hostingTable και το id_financial στο financial).

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

  •  15-11-2008, 02:04 46223 σε απάντηση της 46212

    Απ: Καλύτερος Σχεδιασμός Βάσης

    Συνημμένα: Σχέδιο 1.zip

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

    Από το κείμενό σου κατάλαβα ότι έχουμε τις εξής οντότητες:

    1. Clients
    2. Projects (Domain, Hosting etc)
    3. Financial

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

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

     

  •  15-11-2008, 05:33 46224 σε απάντηση της 46212

    Απ: Καλύτερος Σχεδιασμός Βάσης

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

    Η πρόταση μου θα ήταν να φτιάξεις έναν κεντρικό πίνακα (π.χ. Projects) και μέσα του να κρατάς τις κοινές πληροφορίες για όλα τα έργα (Πελάτης, τίτλος έργου, κτλ) και μία στήλη με τον τύπο του έργου (hosting, domain, etc).

    Στον financial πίνακά σου τώρα θα μπορείς να έχεις ένα foreign key αλλά θα πρέπει να φτιάξεις και συμπληρωματικούς πίνακες για κάθε κατηγορία έργου (έναν για τα hosting, έναν για τα domain, κτλ) τα οποία με σχέσεις 1-1 θα συνδέονται με τον κεντρικό πίνακα Projects.

    Με αυτό τον τρόπο μπορείς να έχεις γενικό reporting και drill-downs με λεπτομέρεια ανά "τύπο" έργου όπου χρειάζεσαι.

    Πάντως ότι approach και να ακολουθήσεις με 2 πίνακες αυτό που περιγράφεις (financial και projects) δεν γίνεται λόγω των διαφορετικών schemas που έχουν οι κατηγορίες των έργων σου. 

  •  17-11-2008, 22:27 46280 σε απάντηση της 46224

    Απ: Καλύτερος Σχεδιασμός Βάσης

    infoCenter, azazeal:

    Δυστυχώς δεν υπάρχει κανένα κοινό χαρακτηριστικό στα διάφορα Projects ώστε να δημιουργήσω έναν πίνακα Project με αυτά τα χαρακτηριστικά. Αλλά ακόμα και αν υπήρχε θα έπρεπε να βρω τρόπο να δείξω σε κάποιον άλλο πίνακα ανάλογα με τον τύπο του Project που θα περιέχει τα υπόλοιπα χαρακτηριστικά. Οπότε αυτό απλά μεταθέτει το πρόβλημα από το πώς δείχνεις στον Financial στο πως δείχνεις από τον Project στο κάθε ProjectType πίνακα.

    "Πάντως ότι approach και να ακολουθήσεις με 2 πίνακες αυτό που περιγράφεις (financial και projects) δεν γίνεται λόγω των διαφορετικών schemas που έχουν οι κατηγορίες των έργων σου. "
    Επομένως υποθέτω ότι το συγκεκριμένο πρόβλημα δε λύνεται με έναν γενικά αποδεκτό "καλύτερο" τρόπο.

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

    Αν σκεφτείτε κάποια άλλη λύση πείτε την:)
    Σας ευχαριστώ για την απάντηση.

  •  18-11-2008, 03:21 46286 σε απάντηση της 46280

    Απ: Καλύτερος Σχεδιασμός Βάσης

    Δεν νομίζω να κατάλαβα την αιτιολόγησή σου.

    Ίσως να μην έχεις καταλάβει το σχέδιο της βάσης που σου έστειλα. Όλα τα κουτάκια με ονομασίες μέσα τους είναι πίνακες. Ο λόγος για τον οποίο χρησιμοποιούμε τον πίνακα Projects είναι για να μπορεί ο πίνακας Financial να συνδεθεί με έναν πίνακα και έτσι να μπορείς να χρησιμοποιείς τις σχέσεις των κλειδιών.

    Ο πίνακας Projects θα μπορούσε να έχει τις εξής στήλες Id|ProjectId|ProjectName|ProjectType|ClientId

    Οι πίνακες Domain,Hosting θα έπαιρναν την αρίθμηση από τον πίνακα Projects και θα είχαν τα παραπάνω πεδία που θα περιέγραφαν το εκάστοτε project.

    Ο πίνακας Financial θα είχε τα εξής πεδία πέρα από διάφορα άλλα.

    Id|ProjectId|<etc>.

    Με την λύση αυτή και σχέσεις μπορείς να χρησιμοποιήσεις και αν θα θελήσεις να προσθέσεις νέο project στο μέλλος το μόνο που θα κάνεις θα είναι να προσθέσεις έναν νέο πίνακα.

    Ίσως πρέπει να δώσεις περισσότερο χρόνο πάνω στις λύσεις που σου δώσαμε (στην ουσία είναι ακριβώς ίδιες) και θα δεις ότι η εισαγωγή του πίνακα Projects μόνο τυχαία δεν είναι.

    Ίσως να υπάρχουν και άλλες λύσεις, αλλά δεν νομίζω να μην υπάρχει ένας αντίστοιχος πίνακας Projects σε αυτές.  

     

  •  18-11-2008, 03:24 46287 σε απάντηση της 46286

    Απ: Καλύτερος Σχεδιασμός Βάσης

    infoCENTER:

    Δεν νομίζω να κατάλαβα την αιτιολόγησή σου.

    Ίσως να μην έχεις καταλάβει το σχέδιο της βάσης που σου έστειλα. Όλα τα κουτάκια με ονομασίες μέσα τους είναι πίνακες. Ο λόγος για τον οποίο χρησιμοποιούμε τον πίνακα Projects είναι για να μπορεί ο πίνακας Financial να συνδεθεί με έναν πίνακα και έτσι να μπορείς να χρησιμοποιείς τις σχέσεις των κλειδιών.

    Ο πίνακας Projects θα μπορούσε να έχει τις εξής στήλες Id|ProjectId|ProjectName|ProjectType|ClientId

    Οι πίνακες Domain,Hosting θα έπαιρναν την αρίθμηση από τον πίνακα Projects και θα είχαν τα παραπάνω πεδία που θα περιέγραφαν το εκάστοτε project.

    Ο πίνακας Financial θα είχε τα εξής πεδία πέρα από διάφορα άλλα.

    Id|ProjectId|<etc>.

    Με την λύση αυτή και σχέσεις μπορείς να χρησιμοποιήσεις και αν θα θελήσεις να προσθέσεις νέο project στο μέλλος το μόνο που θα κάνεις θα είναι να προσθέσεις έναν νέο πίνακα.

    Ίσως πρέπει να δώσεις περισσότερο χρόνο πάνω στις λύσεις που σου δώσαμε (στην ουσία είναι ακριβώς ίδιες) και θα δεις ότι η εισαγωγή του πίνακα Projects μόνο τυχαία δεν είναι.

    Ίσως να υπάρχουν και άλλες λύσεις, αλλά δεν νομίζω να μην υπάρχει ένας αντίστοιχος πίνακας Projects σε αυτές.  

     

     

    Βαριόμουνα να γράψω οπότε: ό,τι είπε ο αποπάνω 

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