2011-04-05 1 views
8

Si vous utilisez une base de données d'objets, que se passe-t-il lorsque vous devez modifier la structure de votre modèle objet? Par exemple, je suis en train de jouer avec le moteur Google App Engine. Par exemple, je joue avec Google App Engine. Pendant que je développe mon application, j'ai réalisé que dans certains cas, j'ai mal nommé une classe, et je veux changer le nom. Et j'ai deux cours que je pense avoir besoin de consolider.Lorsque vous utilisez une base de données d'objets, comment gérez-vous les modifications importantes apportées à votre modèle d'objet?

Cependant, je ne pense pas que je peux, parce que le nom de la classe est intuitivement lié dans le magasin de données, et il y a des données réelles stockées sous ces noms de classe. Je suppose que la bonne chose à propos de la "vieille façon" d'abstraire le modèle d'objet du stockage de données est que le stockage de données ne sait rien sur le modèle d'objet - c'est juste des données. Ainsi, vous pouvez changer votre modèle d'objet et simplement charger les données hors du magasin de données différemment. Donc, en général, lorsque vous utilisez une banque de données qui est intime avec votre modèle de données ... comment changer les choses?

Répondre

2

Si elle est classe juste que vous nommer êtes préoccupé, vous pouvez modifier le nom de classe sans changer le genre (l'identifiant qui est utilisé dans le magasin de données):

class Foo(db.Model): 
    @classmethod 
    def kind(cls): 
    return 'Bar' 

Si vous souhaitez renommer votre classe , implémentez simplement la méthode kind() comme ci-dessus, et faites-lui retourner l'ancien nom de genre.

Si vous devez apporter des modifications à la représentation réelle des données dans le magasin de données, vous devez exécuter un mapreduce pour mettre à jour les anciennes données.

1

De la même façon que vous le faites dans des bases de données relationnelles, à l'exception sans un joli simple script SQL: http://code.google.com/appengine/articles/update_schema.html

Aussi, tout comme les vieux jours, les objets sans les propriétés ne reçoivent pas automatiquement par défaut et les propriétés qui ne sont pas exister dans le schéma traînent encore comme des fantômes dans les objets.

Pour renommer une propriété, je pense que vous pouvez supprimer l'ancienne propriété (le fantôme se bloque) ajoutez le nouveau nom, remplissez les données avec une copie de l'ancienne propriété (fantôme). L'objet réécrite n'aura la nouvelle propriété

0

Vous pourriez être en mesure de le faire de la façon dont nous faisons dans notre projet:

Avant mettre à jour le modèle d'objet (schéma), nous exportons nos des données dans un fichier ou un blob au format json en utilisant une fonction d'exportation personnalisée et une balise de version sur le dessus. Une fois le schéma mis à jour, nous importons le fichier json avec une autre fonction personnalisée qui crée de nouvelles entités et les remplit avec les anciennes données. Bien sûr, la version d'importation doit connaître le format json associé à chaque numéro de version.

Questions connexes