Αυτόματες αλλαγές του σχήματος της βάσης δεδομένων

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Αυτόματες αλλαγές του σχήματος της βάσης δεδομένων

Δημοσίευση από mrpc » 10 Απρ 2011 13:57

Αρκετές φορές όταν έχουμε μια δική μας εφαρμογή να τρέχει σε πολλά site (π.χ. ένα cms), ένα από τα πιο βαρετά πράγματα είναι το deployment. Πως δηλαδή όταν κάνουμε κάποιες αλλαγές και βγάλουμε μια νέα έκδοση, αυτή θα μεταφερθεί εύκολα σε όλες τις εγκαταστάσεις της εφαρμογής.

Αν και υπάρχουν διάφορες εξειδικευμένες κλάσεις και εφαρμογές για αυτό, στις μικρές εφαρμογές πολλές φορές απλά κάνουμε overwrite τα αρχεία με αυτά της νέας έκδοσης.

Τι γίνεται όμως με τις αλλαγές που κάνουμε στο σχήμα της βάσης δεδομένων; Αυτό είναι ένα πρόβλημα το οποίο έχει λυθεί με πολύ απλό τρόπο σε διάφορες έτοιμες εφαρμογές όπως π.χ. το wordpress που αναβαθμίζεται με ένα απλό overwrite (αν και δεν είναι η πιο ασφαλής λύση :p).

Παρακάτω λοιπόν έχω έναν πολύ απλό τρόπο για να πετύχουμε κάτι παρόμοιο:

Αρχικά δημιουργούμε στη βάση μας ένα table:

Κώδικας: Επιλογή όλων

CREATE TABLE IF NOT EXISTS `dbversion` (
  `when` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ver` varchar(255) NOT NULL,
  PRIMARY KEY (`ver`)
) 
Πολύ απλό, ένα field για την έκδοση της εφαρμογής / βάσης δεδομένων, και ένα field για το πότε εγκαταστάθηκε.

Η λογική μας είναι ότι κάθε φορά που τρέχει η εφαρμογή, κάνει έναν έλεγχο σε αυτό το table αν έχουν περαστεί όλες οι τελευταίες αλλαγές.

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

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

Κώδικας: Επιλογή όλων

function checkversion($version=''){

        if ($version == ''){
            $version = '1.000'; //Αυτό το σημείο το αλλάζουμε σε κάθε έκδοση. Μπορούμε να το κάνουμε να διαβάζεται από κάποιο αρχείο.
        }
	
	$result = mysql_query("SELECT * FROM `dbversion` where `ver` = '$version' limit 1")
	or die(mysql_error());  
        if (mysql_num_rows($result) == 0){
            return false; //Δεν έχει περαστεί στη βάση ότι έχει γίνει αυτή η αλλαγή, οπότε γυρνάει false
        }
        return true;
    }
και η function για την αναβάθμιση:

Κώδικας: Επιλογή όλων

function upgrade(){
        if (checkversion('1.000') === false){
	    mysql_query("CREATE TABLE μπλα μπλα μπλα"); // Εδώ βάζουμε ότι αλλαγες θέλουμε
	    mysql_query("insert into `dbversion` (`ver`) values ('1.000')"); //Ενημερώνουμε ότι έγινε η αλλαγή ώστε να μην ξαναπροσπαθεί η εφαρμογή κάθε φορά
	}	

        return true;
    }

Έτσι, ουσιαστικά το μόνο που έχουμε να κάνουμε είναι στην αρχή της εφαρμογή μας να καλούμε την checkversion και η βάση μας θα είναι πάντα ενημερωμένη. Καλό είναι βέβαια να προσθέσουμε και μια extra function που να βάζει το site σε maintainance mode και να κάνει κάποιο backup της βάσης πρώτα, αλλά έτσι κι αλλιώς το tutorial είναι για να πάρουμε μια ιδέα.

Σημειώστε ότι αυτό λειτουργεί σωστά μόνο αν η εφαρμογή έχει το table από την αρχή, αλλιώς θα πετάξει error. Αν θέλουμε να προσθέσουμε αυτή τη λειτουργικότητα σε μια υπάρχουσα εφαρμογή, τότε πολύ απλά προσθέτουμε έναν παραπάνω έλεγχο στην checkversion, ο οποίος όμως πρέπει να τρέχει πρώτος. Κάτι τέτοιο:

Κώδικας: Επιλογή όλων

$result = mysql_query("SHOW TABLES FROM `dbname` = 'dbversion'")
	or die(mysql_error());  
	if (mysql_num_rows($result) == 0){
		mysql_query("CREATE TABLE IF NOT EXISTS `dbversion` (
		  `when` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
		  `ver` varchar(255) NOT NULL,
		  PRIMARY KEY (`ver`)
		) ");
	}

Ξεκινόντας με αυτή τη λογική μπορείτε να αναπτύξετε πολύ πιο πολύπλοκους τρόπους αναβάθμισης της εφαρμογής.
Happy Coding!

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Αυτόματες αλλαγές του σχήματος της βάσης δεδομένων

Δημοσίευση από pimpogio » 10 Απρ 2011 14:42

Η ιδεα σου πολυ καλη..

παντως να πουμε οτι ενα καλο σχημα δεν αλλαζει
απο εκδοση σε εκδοση...

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Αυτόματες αλλαγές του σχήματος της βάσης δεδομένων

Δημοσίευση από mrpc » 10 Απρ 2011 14:45

Αν έχει γίνει σωστός σχεδιασμός από την αρχή και ξέρουμε εκ' των προτέρων όλες τις ανάγκες του πελάτη, όχι. Αλλά συνήθως that's not the case.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης