Hier ist meine Lage. Eines von mehreren Programmen, die ich kürzlich geerbt habe, enthält eine schreckliche Datenbank im Backend. Die geschätzten Schöpfer schätzten offenbar keine relationalen Konzepte. Eine Tabelle für jeden Kunden, benannt als eindeutige Kunden-ID. Dreiundachtzig kryptisch benannte Felder. Der Code ist vollständig prozedural und enthält Dutzende verketteter Inline-SQL-Anweisungen.
Da uns keine wichtige Zusatzanwendung zur Verfügung gestellt wurde, die auf derselben Datenbank ausgeführt wird, wurde ich beauftragt, sie von Grund auf neu zu erstellen. Ich bin ein einziger Entwickler, was nicht einmal meine Hauptverantwortung ist, da mindestens die Hälfte meiner Zeit für das operative Geschäft aufgewendet wird. Es gibt eine unvermeidbare Frist für 30 Tage ab jetzt.
Trotz meiner Unerfahrenheit bin ich mir sicher, dass ich diese Datenbank und die vorhandene Anwendung viel besser hätte gestalten können als sie, aber ich denke nicht, dass es für mich realistisch ist, die Datenbank zu ändern, die vorhandene Anwendung anzupassen und sicher zu sein, dass ich es nicht getan habe. ' Keine Unterbrechung, wenn die zusätzliche Anwendung so schnell erstellt werden muss.
Nehmen wir also an, ich stecke in der schrecklichen Datenbank fest. Wenn ich mit einer so schlechten Struktur arbeiten muss, würde irgendetwas, das ich schreibe, das dieser Struktur entspricht, nur zu dem Haufen technischer Schulden beitragen, der beiseite geschoben werden muss, bis etwas völlig kaputt geht oder neue Funktionen benötigt werden? Wie könnte ich mich dieser Situation nähern und etwas Gutes daraus machen, abgesehen von einer hoffentlich funktionierenden Anwendung?
bearbeiten: Falls jemand interessiert ist, haben wir diese schreckliche Datenbank und die Anwendung, die darauf lief, verschrottet. Wir haben die Erstellung des Zusatzantrags (an dessen Einrichtung ich nicht beteiligt war) an letztendlich zwei verschiedene Auftragnehmer ausgelagert, die beide auf uns durchgefallen sind und nichts erreicht haben. Es endete damit, dass ich in drei Tagen einen schrecklichen, teilweise funktionierenden Hack eines Fixes ausführen musste, der heute noch in Gebrauch ist.
quelle
Antworten:
Es gibt Hoffnung, aber es ist ein harter Kampf, besonders wenn niemand merkt, dass das Datenbankdesign schrecklich ist. Sie können versuchen, die Gemeinheit mit Abstraktionsebenen zu beseitigen, aber es besteht die Möglichkeit, dass sich der Kampf nicht lohnt.
Mein Rat wäre, genügend Abstraktionen über die Datenbank zu erstellen, damit die Anwendung selbst sauber und richtig gestaltet ist. Auf diese Weise ist die Anwendung nicht betroffen , wenn Sie die Datenbank jemals reparieren können, da es egal ist, wie die Datenbank entworfen wurde.
Dies ist der Ansatz, den ich normalerweise verwende, wenn ich mich mit einer Datenbank befasse, die vorhanden ist und meistens mit null Gedanken entworfen wurde. Einige ausgewählte Anwendungen des Repository- oder Gateway-Musters mit einigen Service-Layern für die Kommunikation mit dem Gateway / Repository sollten dazu beitragen, das schlechte Design in Quarantäne zu stellen.
quelle
Erstellen Sie eine Schnittstellenebene, die alle DB-Inhalte verarbeitet, und schreiben Sie dann Ihre App, um eine Schnittstelle dazu zu erstellen. Für den Fall, dass die Datenbank jemals "repariert" wird, ersetzen / aktualisieren Sie einfach Ihre "Schnittstelle". Dieser Ansatz hat mir eine Menge Zeit gespart, wenn ich mit einer fehlerhaften Datenbank oder einer Datenbank zu tun habe, die andere Anwendungen fütterte und mit der ich nicht herumspielen konnte.
quelle
Autsch ... Sie haben ein Albtraum-Durcheinander geerbt, haben 30 Tage Zeit, um es für Ihr Unternehmen nutzbar zu machen, und der halbe Tag ist mit operativen Aufgaben belegt?
Ich bin mir sicher, dass Sie umgestalten konnten, aber sicher nicht in dieser Zeit.
Um Ihre Frage zu beantworten, glaube ich nicht, dass Sie tatsächlich guten Code für ein solches Design schreiben können. Die technische Verschuldung ist bereits zu hoch. Wenn ich Sie wäre, würde ich die Funktionen hacken, die ich könnte, und auf eine vollständige Umgestaltung zu einem späteren Zeitpunkt drängen, wenn Sie mehr Zeit und Leute in Ihrem Team haben, um dies besser anzugehen.
Seien Sie einfach vorsichtig, um das Refactoring voranzutreiben. Manchmal entscheidet sich ein Vorgesetzter dafür, einen Quellcode und Eigentumsrechte für ein Produkt zu kaufen, und sie möchten nicht glauben, dass sie ihr Geld vollständig für Müll verschwendet haben. Dies war bei einem Job der Fall, den ich hatte. Unglücklicherweise treffen Manager Entscheidungen über den Kauf von Software wie diese und erhalten niemals technische Unterstützung, um zu bewerten, was sie kaufen, und um festzustellen, ob es wartbar ist und eine große Menge an technischen Schulden aufweist. In diesem Fall ist die schlechte Entscheidung eine politische Entscheidung, und wenn Sie auf eine Umgestaltung drängen, kann dies Ihre Arbeit gefährden.
quelle
Datenbanken können wie anderer Code umgestaltet werden. Korrigieren Sie den Teil, der von dem Code betroffen ist, den Sie schreiben müssen, und schreiben Sie Tests, um sicherzustellen, dass nichts anderes kaputt geht. Machen Sie wie bei jedem anderen Refactoring ein kleines Stück nach dem anderen. Es gibt ein gutes Buch über das Umgestalten von Datenbanken, das Ihnen dabei helfen könnte, das Chaos zu beseitigen. http://www.amazon.com/Refactoring-Databases-Evolutionary-paperback-Addison-Wesley/dp/0321774515/ref=sr_1_1?ie=UTF8&qid=1307025831&sr=8-1
Es gibt auch andere, aber ich persönlich habe diese Techniken gelesen und damit gearbeitet.
Und vergessen Sie nicht, dass Sie die Art und Weise, wie Sie die Datenbank abfragen müssen, neu strukturieren können, indem Sie Ansichten erstellen, um die mühsame Transformationsarbeit für Sie in eine Struktur umzuwandeln, die einfacher abzufragen ist.
quelle
Erstellen Sie aktualisierbare Ansichten, um einen Teil der "Relationalität" wiederherzustellen und aussagekräftigere Spaltennamen zu erhalten.
quelle
Eine Möglichkeit wäre, eine zweite Datenbank einzurichten, die strukturiert ist (zumindest näher), wie Sie es möchten, und die Replikation zwischen den beiden Datenbanken einzurichten. Dann können Sie Ihren Code in die neue Datenbank schreiben und die vorhandene Datenbank (und Anwendung) intakt lassen, um sie zu bearbeiten, wenn Sie mehr Zeit haben.
Ehrlich gesagt, es ist immer noch offen für eine Menge von Fragen , ob Sie , dass in ~ 15 Tagen Arbeit tun können. Insbesondere hängt es wahrscheinlich davon ab, ob Sie eine bidirektionale Replikation benötigen (dh, Ihre neue Anwendung aktualisiert die Daten tatsächlich) oder nur eine Möglichkeit (Ihre neue Anwendung lässt nur Benutzer die Daten anzeigen). Der letztere Fall ist (natürlich) dramatisch einfacher zu behandeln.
Wenn Sie eine bidirektionale Replikation benötigen, reicht die Zeit dafür wahrscheinlich nicht aus. Insbesondere ist die bidirektionale Replikation, bei der die Struktur im Wesentlichen transformiert wird, nie trivial, und die verfügbaren Tools unterstützen sie häufig nur unzureichend (z. B. müssen Sie alle SQL-Anweisungen für alle Datentransformationen in beide Richtungen manuell schreiben).
Wenn Sie nur eine Einbahnstraße benötigen, ist sie genau an dem Punkt, an dem sie möglicherweise an ihre Grenzen stößt. Es hängt auch stark davon ab, ob Sie Geld ausgeben dürfen oder nicht - es gibt eine ganze Reihe von Data-Warehousing-Anwendungen, die genau für diese Art von Aufgaben vorgesehen sind und die wahrscheinlich die Arbeit etwas beschleunigen und vereinfachen zu verwalten - aber die meisten von ihnen sind nicht billig.
quelle