2009-04-15 15 views
3

Ich bin dabei, ein Bereitstellungssystem für eine neue Webanwendung zu entwickeln, und ich frage mich, wo der beste Punkt im Prozess zur Verwaltung von Datenbankmigrationen ist (die Frage, wie die Migrationen durchgeführt werden, ist ein anderes Problem).Datenbankmigrationen: Verwalten mit Build-Skript oder automatisch beim Start der App?

Es scheint, gibt es zwei Wege zu gehen:

  1. einen Migrationsskript verwenden, die kann entweder manuell Linie oder als Teil der automatischen Bereitstellung von Befehl ausgeführt werden/Build-Prozess
  2. Führen Sie das Migrationen, wenn die App anläuft (I ASP.NET bin mit so diese kann verursacht eine lang laufende Benutzeranforderung ohne leicht genug gemacht werden)

Hat jemand irgendwelche Vorschläge/Einblicke/Erfahrungen mit diesen Ansätzen? Irgendwelche anderen Vorschläge?

Ich kann sehen, warum # 1 könnte attraktiver sein - es gibt mir die vollständige Kontrolle über, wenn die DB aktualisiert wird. Allerdings mag ich # 2 sehr, da es mir erlaubt, schnell zwischen Implementierungen zu iterieren und den manuellen Prozess zu reduzieren. # 2 könnte auch auf meiner Entwicklungsmaschine verwendet werden, um noch schnellere Iterationen zu ermöglichen. Hmm, beginnen zu denken, beide haben könnte eine gute Sache sein ...

Antwort

1

Ich mag Option # 1 besser, da es viel flexibler scheint. Anstatt Migrationen bei jedem Start der App durchzuführen, würde ich sicherstellen, dass das Datenbankschema (Versionsnummer?) Mit dem Code übereinstimmt, und wenn nicht, eine Warnung oder einen Fehler bezüglich eines nicht übereinstimmenden Datenbankschemas ausgeben.

2

Wir haben ein Sales-Force-System mit ~ 100 Client und wir aktualisieren Datenbank beim Start der Anwendung (True ist unsere Desktop-Anwendung.) Ich mag diesen Ansatz, es ist sicher und iterativ, wenn wir indeterministischen Startpunkt haben Client-Datenbank neu oder nur aktualisiert zu verison xyz?).

Aber auf Serverseite bevorzuge ich Ihre # 1 Option: Wir erstellen eine SQL-Abfragedatei auf unserer virtuellen Maschine (basierend auf der Kopie der ursprünglichen Datenbank) und führt diese Abfrage gegen den realen Server.

So IMHO:

  • Disconnected Kunden: Start iterative Skripte
  • Server: Abfrage auf VM erstellt auf der Grundlage der tatsächlichen und realen Datenbank

Also ich bin interessierten sich auch für dieses Problem und fanden einige (halbe) Frameworks als RikMigrations. Nach einigem googeln gibt es einen guten Startpunkt für DB Versioning/Migration Frameworks: .NET Database Migration Tool Roundup. Nicht unbedingt die Dokumentation, sondern die Teamblogs können interessant sein.

+0

Sie können sich auch Folgendes anschauen: http://code.google.com/p/octalforty-wizardby/ –

+0

interessante Sachen. Vielen Dank – cherouvim

0

Ich würde Option Nr. 1 aus einer Reihe von Gründen bevorzugen. Erstens erfordern Integrationstests normalerweise, dass Ihr DB-Schema auf dem neuesten Stand ist, und das Starten einer Website zum Aktualisieren des Schemas wird ein großer Zeitverlust sein. Zweitens können Sie das Datenbankschema nicht ändern, während Ihre Site läuft (z. B. ein paar Indizes hinzufügen, um die Dinge zu beschleunigen).

Was die Produktion betrifft, ist das Aktualisieren der Datenbank in MSI-artiger Transaktionsinstallation viel besser als der Versuch, bei jedem Start der Anwendung ein Upgrade durchzuführen, da Sie möglicherweise zu desynchronisierten Datenbankversionen gelangen.

Und wenn Sie nach dem Migrationsrahmen suchen, werfen Sie einen Blick auf Wizardby.

0

Wenn die Anwendung jemals auf dem Computer eines Kunden ausgeführt werden muss, kann die Migration beim Start viele Supportaufrufe verhindern - vorausgesetzt, Sie können eine nahtlose Migration ohne Benutzereingriff durchführen (ich hoffe, dass Sie Ihre Webanwendung normalerweise nicht mit Erlaubnis ausführen um die Datenbank zu modifizieren).

Wenn die Anwendung immer unter Ihrer Kontrolle ausgeführt wird, ist die automatische Migration weniger ein Problem - kann aber immer noch eine gute Funktion sein, insbesondere wenn Sie Ausfallzeiten und manuelle Bereitstellungsschritte minimieren möchten.