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

 

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

Migrations σε sql server

Îåêßíçóå áðü ôï ìÝëïò KCorax. Τελευταία δημοσίευση από το μέλος KCorax στις 17-06-2007, 17:23. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-06-2007, 18:43 32971

    Migrations σε sql server

    Γειά,

    Σχεδιάζω μια εφαρμογή που θέλω να τρέχει σε clients και να πακετάρει τη βάση της μαζί. Επειδή είναι σημαντικό για εμάς το συνολικό πακέτο να είναι μικρό είχα χτίσει το μοντέλο μας γύρω απο τον ms sql server compact (πρώην everywhere πρώην ce).

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


    Άλλα constraints είναι οτι:
    - θέλω οι εφαρμογές πελάτη να συγχρονίζουν με μια κεντρική βάση πράγμα που έλυσα με υπηρεσίες συγχρονισμού
    - το συνολικό footprint πρέπει να είναι πολύ μικρό (αυτή τη στιγμή 2mb installer). Δεν έχω βρεί τρόπο να πακετάρω ένα μικρό runtime για sql express με την εφαρμογή άρα...
    - για το θεό μη μου πείτε να πάω σε άλλη βάση
    - το deployment θα ήταν βολικό να γίνεται με clickonce, πράγμα που νομίζω οτι απλοποιεί κάπως τα πράγματα.
    GK
    http://theopenfund.com
    Δημοσίευση στην κατηγορία: ,
  •  16-06-2007, 21:01 32977 σε απάντηση της 32971

    Απ: Migrations σε sql server

    Η χρήση του NHibernate και οποιουδήποτε ORM δεν σε απαλλάσσει από το να μάθεις SQL, το αντίθετο μάλιστα. Πρέπει να ξέρεις καλά SQL και τη βάση σου για να μπορέσεις να ελέγξεις ότι τα SQL statements που δημιουργούνται από τα query σου δεν έχουν πρόβλημα, να δημιουργήσεις τα κατάλληλα indexes αλλά και για να υλοποιήσεις reporting queries ή άλλα μυστήρια τα οποία απλά δεν γίνονται με ORM. Με δεδομένο ότι τα "εύκολα" queries τα κάνει το ORM, σου μένουν τα δύσκολα queries. Άσε που ένα καλό object model συνήθως δεν οδηγεί σε ένα καλό database schema.

    Όσον αφορά τώρα το migration, εύκολη λύση δεν υπάρχει. Ο λόγος είναι ότι δεν αρκεί να αλλάξεις το σχήμα, αλλά πρέπει να κάνεις κάτι με τα δεδομένα. Τα πράγματα είναι σχετικά απλά αν προσθέτεις νέα πεδία (απλά τα βάζεις null ή default), αλλά περιπλέκονται όταν π.χ. σπας ένα πεδίο σε δύο, ή διαγράφεις ένα πεδίο. Τί κάνεις τότε? Γενική λύση δεν υπάρχει.
    Γενικά, όταν δημιουργείς μία νέα έκδοση της βάσης δεδομένων πρέπει να δημιουργήσεις και τα αντίστοιχα sql scripts για να αλλάξεις το σχήμα. Για τις εύκολες περιπτώσεις, μπορείς χρησιμοποιήσεις κάποιο εργαλείο όπως το SQL Compare και το SQL Data Compare για να δημιουργήσεις τα update scripts αλλά για τις δύσκολες περιπτώσεις θα πρέπει να γράψεις τον κώδικα εσύ.

    Αν θέλεις να δουλέψεις μόνο με κώδικα, το NHibernate σου δίνει μία μικρή βοήθεια, καθώς μπορείς να δημιουργήσεις μία νέα βάση με την κλάση NHibernate.Tool.hbm2ddl.SchemaExport. Μετά μπορείς να μεταφέρεις με κώδικα τα δεδομένα από την παλιά βάση στη νέα βάση. Η διαδικασία αυτή όμως θα είναι σίγουρα αργή. Το Hibernate έχει κλάσεις για να κάνει migration ενός σχήματος, το NHibernate όμως όχι. Το γεγονός πάντως ότι υπάρχει και κεντρική βάση κάνει τα πράγματα πιο περίπλοκα, καθώς θα πρέπει να κάνεις update και τις δύο βάσεις.

    Έχω μία απορία πάντως. Απ' όσα περιγράφεις υποθέτω ότι θέλεις οι clients να δουλεύουν disconnected, γι αυτό έχεις μία κεντρική βάση SQL Express ή παραπάνω και μεταφέρεις όταν χρειάζεται τα δεδομένα της στους clients με replication? Ή κάτι άλλο? Σε κάθε περίπτωση, θα πρέπει να αλλάξουν με τη μία το σχήμα της κεντρικής βάσης, των clients αλλά και τα replication scripts όταν υπάρχουν αλλαγές στα πεδία. Αν δεν θέλεις όμως να δουλεύεις σε disconnected mode θα ήταν πάρα πολύ ευκολότερο οι clients να επικοινωνούν απευθείας με το server.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-06-2007, 17:23 32990 σε απάντηση της 32977

    Απ: Migrations σε sql server

    (εκνευρίστηκα το tinymce έφαγε το post μου)

    Παναγιώτη ευχαριστώ πολύ για την αναλυτική απάντηση και δη Σάββατο.

    Οι σχέσεις στα αντικείμενά μου είναι απλές, είναι άλλωστε τη διπλωματική μου σαν προπ.
    Στη γενική διαβάζω μια περιγραφή (xmlschema) συνθέτω μια κλάση με reflection, της φτιάχνω ότι πίνακες χρειάζεται για να αποθηκευτεί 1-1, τρέχω ένα template του mygeneration για nhibernate, το μεταγλωττίζω και αυτό και συνθέτω τέλος επίσης on the fly ένα UI ικανό να παρουσιάσει την κλάση μου.
    Ειλικρινά αν υποστήριζε sprocs ο sql compact θα προτιμούσα dOOdads αντί για nh που είναι και δραματικά πιο απλό.

    Το γενικό σενάριο χρήσης μου έχει ως εξής: πελάτες φεύγουν απο τν κεντρική βάση παίρνοντας μια μερίδα απο records κατάλληλων πινάκων ο καθένας. Ο κάθε πελάτης μπορεί να φτιάξει στη βάση του νέους πίνακες κλπ. Συγκρούσεις εδώ ευτυχώς δεν έχω. Τώρα το θέμα είναι οτι εάν γίνουν αλλαγές στο σχήμα της κεντρικής βάσης όταν επιστρέψουν οι πελάτες πριν συνειφέρουν ό,τι έχουν μαζέψει, πρέπει να αλλάξουν το δικό τους σχήμα. Η αλλαγή αυτή μπορεί να γίνει προφανώς με
    - .net κώδικα. Απλό, αλλά αργό λες ; Αν πχ σαρώνω όλες τις κλάσεις παλαιού τύπου και αδειάζω τα περιεχόμενά τους σε νέες θα μιλάμε πχ για καθυστέρηση +50% ή πχ τάξεις μεγέθους ;
    - sql πράγμα επικίνδυνο γιατί είμαι ανεπαρκής. Τα εργαλεία που ανέφερες μου παράγουν script τα οποία θα μπορώ πχ να τρέχω στους πελάτες και να κάνουν τις αλλαγές που χρειάζονται ; Γιατί σε ένα review που πέτυχα τα είδα να συγκρίνουν και τα records ( ;!;! ).

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

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