Gibt es Hoffnung, guten Code auf eine schrecklich gestaltete Datenbank zu schreiben?

18

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.

John Straka
quelle
2
Stellen Sie sich vor, Sie würden gegen eine Bibliothek programmieren, in der der Sonderfall "2 + 2" nicht 4 ergibt. Das ist nicht einfach.
8
Ich höre also, dass Sie 30 Tage Zeit haben, um einen anderen Job zu finden. versuchen Sie careers.stackoverflow.com ;-)
Steven A. Lowe
@gnat: Nicht einmal in der Nähe.
Robert Harvey

Antworten:

27

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.

Wayne Molina
quelle
1
+1 Ich habe in meiner Antwort im Wesentlichen dasselbe gesagt, bevor ich Ihre vollständig gelesen habe. Ich sehe jedoch keine Möglichkeit, meine Antwort zu löschen, da Ihre Antwort dasselbe Material abdeckt.
Ominus
Wie ich bereits anderen mit diesem Vorschlag kommentiert habe, ist es ein guter Vorschlag, aber es ist sehr wahrscheinlich, dass, wenn das Datenbankdesign Mist ist, der Anwendungscode ebenfalls Mist ist. Ich sehe keinen Grund, dieses Problem zu lösen, wenn der Anwendungscode ebenfalls überarbeitet werden sollte.
maple_shaft
3
@maple_shaft Einverstanden, aber das OP gibt an, dass er aufgefordert wurde, von Grund auf eine neue Anwendung zu erstellen, die mit der Datenbank interagiert. In einem solchen Fall ist es sinnvoll, die neue Anwendung ordnungsgemäß zu erstellen .
Wayne Molina
1
@maple_shaft, der einzige Mistteil der Anwendung ist der Teil, der mit der Mistdatenbank interagiert. Das ist der Punkt der N-Tier-Architektur und des SOC.
StuperUser
1
@maple_shaft Das Ziel wäre, die Datenbank in eine Art "Black Box" zu stellen und der Anwendung eine Schnittstelle zu geben, die idealer und nicht unbedingt repräsentativ für das Datenbankdesign ist.
Michael Dean
10

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.

Ominus
quelle
Wie können Sie Ihre eigenen Antworten löschen oder ist dies nicht möglich?
Ominus
Sie können Ihre eigenen Antworten löschen. Sie sehen sie immer mit einem getönten Hintergrund und es wird so etwas wie "vom Eigentümer gelöscht" angezeigt. Anders als Sie sehen es nur Leute mit Moderator-Befugnissen.
Marjan Venema
@Ominus: Es sollte möglich sein, aber warum möchtest du? Du hast 3 positive Stimmen!
FrustratedWithFormsDesigner
1
@Marjan: Moderatoren und alle mit mehr als 10.000 Repräsentanten.
Jerry Coffin
1
Warum solltest du diese Antwort löschen? Ich denke, es ist eine hervorragende Lösung.
Jim G.
6

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.

maple_shaft
quelle
Trotz der Unkenntnis der anderen mit der Programmierung habe ich deutlich gemacht, wie sich die Qualität dieser Codebasis auf die Wartbarkeit auswirkt. Sie sind mit einem enormen Umgestaltungsaufwand an Bord, um alles in einen geeigneteren Zustand zu bringen, sodass ich nicht in Gefahr bin, meinen Job zu gefährden, aber ich denke, dass es diesen Monat nicht passieren wird.
John Straka
3
Manchmal kann ein erfolgreicher Hack als erste Erfahrung mit dem Projekt Ihnen die Glaubwürdigkeit geben, in späteren Projekten für dieselbe Anwendung umzugestalten. Traurig aber wahr. Zuerst müssen sie glauben, dass Sie wissen, was Sie tun, bevor sie über radikale Veränderungen nachdenken. Das Poster hat es mit Sicherheit schwer.
HLGEM
1
@ John, das ist gut, dass sie die Notwendigkeit des Refactorings ERKENNEN. Es ist ein Zeichen für ein gutes langfristiges Management und der erste Schritt zum eigentlichen Refactoring.
maple_shaft
3
+1 für eine großartige, realistische Antwort. Sie haben einen Monat, aber eigentlich nur einen halben Monat, weil Sie in Halbzeit an Operationen arbeiten. Das sind 11-15 Tage, je nachdem, ob Sie am Wochenende abheben. Ich hasse es, es zu sagen, aber ich bin damit einverstanden, dass Sie am besten etwas zusammenschieben, das so schnell wie möglich funktioniert, und sich Notizen darüber machen, wie Sie es später verbessern oder umschreiben können, zumal Ihr Management sich mit dem Refactoring befasst.
Bob Murphy
6

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.

HLGEM
quelle
Das ist alles in Ordnung und gut, aber ich habe den starken Verdacht, dass, wenn das Datenbankdesign ein Chaos ist, der Anwendungscode wahrscheinlich auch wertlos ist.
maple_shaft
@maple_shaft, das könnte sein, obwohl es meiner Erfahrung nach sogar gute Anwendungsentwickler sind, die schreckliche Datenbanken entwerfen. In beiden Fällen wird das Chaos nur durch schrittweises Refactoring behoben. Er kann es nicht sofort ersetzen, obwohl ich mir sicher bin, dass er es möchte.
HLGEM
+1 @HLGEM, das sind gute Punkte. Ihr Rat ist gut, wenn der Anwendungscode gut gestaltet ist. Das teilweise Refactoring ist wahrscheinlich der beste Weg, aber in meiner gesamten Karriere habe ich noch nie erlebt, dass dies erfolgreich funktioniert. Möglicherweise lag es an einem schlechten Projektmanagement, nicht aber an einer falschen Idee.
maple_shaft
5

Erstellen Sie aktualisierbare Ansichten, um einen Teil der "Relationalität" wiederherzustellen und aussagekräftigere Spaltennamen zu erhalten.

Mike Sherrill 'Cat Recall'
quelle
Das wäre ein guter Anfang. Wenn die Datenbank denormalisiert ist, würde ich Trigger oder gespeicherte Prozeduren hinzufügen, um die Anwendung von der Denormalisierung zu isolieren.
Kevin Cline
4

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.

Jerry Sarg
quelle
+1, Dies kann auch eine gute Idee sein, solange der gesamte Datenzugriffscode der Anwendung ordnungsgemäß von anderen Ebenen getrennt ist und der Datenzugriffscode für die Arbeit mit dem neuen Schema
überarbeitet werden kann