Wie tauche ich in eine hässliche Datenbank ein?


26

Ich bin sicher, viele von Ihnen haben / hatten es mit einer hässlichen Datenbank zu tun. Sie wissen, diese Datenbank, die überhaupt nicht normalisiert ist, diese Datenbank, in der Sie eine große, schmerzhafte Abfrage durchführen müssen, um die trivialsten Daten zu erhalten, diese Datenbank, die in Produktion ist und die Sie nicht ein bisschen ändern können ... Sie wissen , "Das hier".

Meine Frage ist, wie gehst du damit um?

  • Versuchen Sie, eine neue Datenbank zu erstellen?
  • Sie geben auf und lassen es in Ruhe?
  • Welchen Rat können Sie geben?

Antworten:


29
  • Als erstes erstelle ich ein Entity-Relationship-Diagramm (ERD). Manchmal können Sie die Metadaten einfach mit Befehlszeilentools beschreiben, aber um Zeit zu sparen, gibt es einige Tools, die ein Diagramm automatisch generieren können.

  • Überprüfen Sie als zweites jede Tabelle und Spalte, um sicherzustellen, dass ich die Bedeutung dessen erfahre, was darin gespeichert ist.

  • Als drittes überprüfe jede Beziehung und stelle sicher, dass ich verstehe, wie die Tabellen zueinander in Beziehung stehen.

  • Viertens: Lesen Sie alle Ansichten oder Trigger, um die Durchsetzung der benutzerdefinierten Datenintegrität oder Kaskadierungsvorgänge zu verstehen.

  • Fünftens lesen Sie alle gespeicherten Prozeduren. Lesen Sie auch SQL-Zugriffsrechte, wenn solche vorhanden sind.

  • Sechstens, lesen Sie Teile des Anwendungscodes durch, die die Datenbank verwenden. Hier werden einige zusätzliche Geschäftsregeln und Datenintegritätsregeln durchgesetzt.


Update: Ich habe gerade einen interessanten Artikel " 9 Dinge, die zu tun sind, wenn Sie eine Datenbank erben " mit einer guten Checkliste gelesen .

Zusammenfassung:

  1. Backups
  2. Recherche (die oben erwähnten Schritte zur Schemadokumentation)
  3. Sprechen Sie mit den ehemaligen Entwicklern
  4. Eine Bug-Datenbank
  5. Quellcode-Kontrolle
  6. Sprechen Sie mit den Benutzern und / oder Geschäftsinhabern
  7. Stellen Sie die Glaubwürdigkeit bei den Benutzern her, indem Sie einige Probleme beheben oder Verbesserungen vornehmen
  8. Erstellen Sie eine Entwicklungsumgebung
  9. Löschen Sie veraltete Objekte

13

Dies ist nicht immer möglich, aber in bestimmten Situationen hat es sich bewährt, einige Tabellen durch Views zu ersetzen. Sie können dann die darunter liegenden Tabellen aufräumen und in einigen Fällen die Ansichten löschen. Wie gesagt, funktioniert nur in einigen Fällen.


In Oracle Materialized Views kann dies ebenfalls hilfreich sein.
Leigh Riffel

9

Das Datenwörterbuch ist dein Freund. Versuchen Sie auch, die Datenbank mit dem Reverse Engineering-Tool in Visio zu rekonstruieren und eigene Diagramme zu erstellen. Da Reverse Engineering interaktiv ist - Sie erstellen die Diagramme -, ist es viel ansprechender als das Lesen eines Datenwörterbuchs. Die Aktivität des Prozesses ist sein Vorteil und ich finde es ziemlich entspannend, dies zu tun.

Die meiste Arbeit erledige ich im Bereich Data Warehousing, wo das Stöbern in den Datenbankschemata des Quellsystems eine Kernaktivität darstellt. Ich habe so etwas schon öfter gemacht und finde, dass es wirklich gut funktioniert.

Visio Pro ist nicht so teuer und mit dem Visio-Modellierungsmodul können Sie ein Modell für mehrere Diagramme freigeben. Als Bonus können Sie fehlende Fremdschlüssel in die Diagramme einfügen und erhalten am Ende eine nützliche Dokumentation für das System.


6

Zusätzlich zu den Ideen von Bill Karwin schlage ich vor, mit den Benutzern zu sprechen - gelegentlich wissen die Benutzer ziemlich genau, wofür ihre Datenbank verwendet wird, insbesondere, wenn sie daraus Berichte erstellen.


6

Ich habe es mit einer sehr hässlichen für die Software eines Anbieters zu tun. Abgesehen davon, dass ich Vorschläge mache, kann ich nicht viel tun, um sie zu ändern. Ich bin immer bemüht, die Dinge zu ändern, aber da es außerhalb meiner Kontrolle liegt, bin ich mit dem Müll festgefahren.

Eines der Dinge, mit denen ich schnell angefangen habe, da die Datenbank absolut keine Beziehungen hat, ist eine allgemeine Namensabfrage für das Schema:

--Find Column named like 'blah' in a specific table
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V') AND O.Name like '%TableName%'
ORDER by O.Name

oder

--Find all Columns in DB with name like 'blah'    
SELECT O.NAME, O.ID, C.NAME, O.XTYPE
FROM SYSOBJECTS O LEFT JOIN SYSCOLUMNS C ON O.ID=C.ID
WHERE C.NAME LIKE '%SearchFor%' AND O.XTYPE IN ('U','V')
ORDER by O.Name

Da einige der Tabellen zu viele schlecht benannte Spalten und viel zu viele Spalten haben, um nachzuschlagen, was ich möglicherweise zum Bilden von Beziehungen zwischen Tabellen verwenden kann.

Ich weiß, dass dies im Neugestaltungsteil der Frage nicht viel hilft, aber es ist sehr hilfreich beim Verstehen und Entschlüsseln des schlechten Schemas.


6

SchemaCrawler ist mein Tool zur Datenbankermittlung, das eine Reihe von Funktionen bietet, mit denen sich eine hässliche Datenbank auf einfache Weise erkunden lässt. SchemaCrawler verfügt über eine "grep" -ähnliche Funktionalität, mit der Sie mithilfe regulärer Ausdrücke nach Tabellen und Spalten suchen können. Beispielsweise könnten Sie mit "ACCOUNT" als Teil ihres Namens nach Tabellen und Spalten suchen, und sie würden wahrscheinlich in irgendeiner Weise zusammenhängen.

SchemaCrawler leitet auch Fremdschlüsselbeziehungen ab, selbst wenn keine Fremdschlüssel vorhanden sind. Dies geschieht, indem "schwache Assoziationen" unter Verwendung allgemeiner Namenskonventionen gefunden werden, z. B. sind Tabellen Namen in der Regel Pluralform, Spaltennamen jedoch nicht, und Spaltennamen können das Präfix _ID haben. Sie können verwandte Tabellen anhand dieser abgeleiteten Beziehungen finden.


5

Kommt darauf an, wie hässlich es ist und wie viel Kontrolle Sie über das Design haben und was damit interagiert. Ich musste im Laufe der Jahre bei meinem derzeitigen Job mit einer Reihe von hässlichen Datenbanken interagieren. Und so bin ich damit umgegangen:

Mitarbeiterdaten

Es gibt die Datenbank, die Mitarbeiterdaten enthält. Da es sich um eine Anbieterdatenbank handelt, habe ich keinen Einfluss darauf. Zum Glück habe ich keinen direkten Zugriff darauf. Ich bekomme jeden Morgen einen DTS-Dump.

Das Beste, was mir gelungen ist, ist, ein Skript zu schreiben, das die Eingaben vom Speicherauszug am Morgen löscht (ja, die Wortwahl war beabsichtigt), und es in ein nützlicheres Format zu migrieren und aus den gelöschten Daten zu arbeiten.

Selbst wenn ich es ändern könnte, würde ich es wahrscheinlich nicht tun - nur weil es eine große Anzahl anderer Programme gibt, die sich darauf verlassen, dass es so eingerichtet ist, wie es ist, und ich kann keine Änderung erzwingen.

Online-Trainingsdaten

Dies war ein Durcheinander meines eigenen Designs. Ich habe es frisch aus dem College gebaut, ohne dass mir ein Mentor dabei geholfen hätte. Seitdem habe ich es ein bisschen nach dem anderen repariert. Da ich das einzige Programm kontrolliere, das auf die Daten zugreift, aktualisiere ich beim Aktualisieren von Teilen der Site die Konfiguration der Datenbank. Ich schreibe ein Transformationsskript und teste es intensiv auf einer Kopie, damit sichergestellt ist, dass alle erforderlichen Änderungen vorgenommen werden.

Es war ein langer Prozess, aber es kommt gut voran.

Schulungsdaten im Klassenzimmer

Mein Pilotprojekt bestand darin, Daten aus drei verschiedenen Datenbanken zu integrieren, die alle von meinem Vorgänger, einem Krankenpfleger, der an ein oder zwei Programmierkursen teilgenommen hat, leicht unterschiedlich gestaltet wurden.

Das war ein weiterer langsamer Prozess. Seit ich die volle Kontrolle über die Programme habe, die auf die Daten zugreifen, ändere ich sie nach und nach wie die Online-Trainingsdaten.

Rückblickend wäre dies ein Hauptkandidat für einen sauberen Start gewesen ... die Sicht nach hinten ist immer 20/20.

Schlussendlich...

Ich weiß nicht, wie hilfreich dies war, und ich kann mehr erläutern (bis zu einem gewissen Punkt, firmeneigenes yada yada und alles). Die endgültige Antwort lautet "Es hängt davon ab".


5

Nachdem ich alle Ihre Antworten gelesen habe, gebe ich Ihnen meine:

Zuerst suche ich nach der "Master-Tabelle", dann beginne ich mit Stift und Papier, die Beziehungen zu anderen Tabellen abzubilden, und wenn es einen App-Code zu sehen gibt, beginne ich, einige Rohskizzen über den Datenfluss anzufertigen.

Nachdem ich ein schönes Bild davon bekommen habe, wie die Datenbank funktioniert, beginne ich, nach Orten zu suchen, an denen sich etwas ändern lässt. Das ist es.

Ich weiß nicht warum, aber ich bevorzuge Papier gegenüber jeder Datenbankmodellierungssoftware.


5

Aufgrund der Verwendung durch eine externe Anwendung können Sie die "Schnittstelle" der Datenbank nicht ändern. Ich weiß nicht, welche Art von Datenbank Sie verwenden (Oracle, MySQL, MSSQL), aber ich sehe dies als eine der Möglichkeiten:

  • Erstellen einer Datenbankschnittstelle unter Verwendung von Objekttypen als Ansicht und gespeicherte Prozeduren.
  • schrittweises Refactoring (Normalisieren, Umbenennen von Feldern ...)
  • Ändern der Client-Anwendung (falls erforderlich)

Ansichten, gespeicherte Prozeduren verbergen interne Datenbankänderungen.


4

Neben der Ermittlung der Struktur der Datenbank habe ich festgestellt, dass es auch wichtig ist, die Datenqualität zu untersuchen . Sobald Sie die Bedeutung der einzelnen Spalten verstanden haben, können Sie nach Stellen suchen, an denen viele Werte fehlen. Wenn Sie mit den Daten vertraut sind, können Sie auch untersuchen, wo Inkonsistenzen zwischen den Werten in verschiedenen Spalten bestehen.


4

Es hängt davon ab, wie Sie interagieren müssen. In Anwendungsszenarien, in denen die Stapelverarbeitung akzeptabel ist, hat es sich häufig als am kosteneffektivsten erwiesen (was die Entwicklungszeit und damit die Kosten für den Kunden angeht), die Daten in eine benutzerfreundlichere Struktur abzustapeln und dagegen zu arbeiten.


4

Wenn Sie das Problem in Probleme aufteilen können, um die Sie Ihr Gehirn kümmern können, können Sie sie einzeln angreifen. Wenn Sie wissen, dass ein Tisch nicht voll besetzt ist, können Sie manchmal einen Brückenkopf finden, an dem Sie arbeiten können. Auf diese Weise erweitern Sie Ihren "Clean Spot", um mehr Datenbank in Blöcken zu erfassen.


4

Wenn Sie Visio (ein Teil von Microsoft Office) haben, können Sie die Reverse Engineering- Funktion ausprobieren . Es ist nicht schön, aber es gibt Ihnen zumindest einen Anfang (zu einem Bruchteil der Kosten für "echte" Tools wie Rational Rose).



3

Bill gab eine ausgezeichnete Antwort. Ich würde hinzufügen, dass ich mich als Testbenutzer an der Benutzeroberfläche anmelde und versuche, genau zu verstehen, was die Benutzer mit den Daten tun. Es wird Ihnen helfen zu verstehen, warum hinter einigen der gespeicherten Prozesse oder Designs. Für das Verständnis einer Datenbank ist es wichtig zu verstehen, was die Daten bedeuten und wofür sie verwendet werden.

Befindet sich die Datenbank in einer geschäftlichen Funktion oder einem Fach, mit dem Sie im Allgemeinen nicht vertraut sind (z. B. Flugplanung und Sie haben zuvor nur Finanzanwendungen bearbeitet), bitten Sie die Benutzer um Lesematerial zum Fach oder gehen Sie in die Bibliothek Sie sich selbst oder suchen Sie im Internet nach dem Thema. Fragen Sie die Benutzer, ob es rechtliche oder behördliche Probleme gibt, die Sie beachten müssen. Wieder können einige dieser Hintergrundinformationen erklären, was seltsame Designentscheidungen zu sein scheinen.


3

Wenn es sich um eine Anbieterdatenbank handelt (und ich habe einige wirklich schlechte gesehen), können Sie sich nur beim Anbieter darüber beschweren.

Bei hausinternen Anwendungen sind in der Regel nur einige Schulungen für die Entwickler erforderlich, und Sie können das Schema ändern, um die Leistung zu verbessern. Es braucht Zeit und ist normalerweise ein langsamer Prozess.

Nach meiner Erfahrung ist das Erstellen einer neuen Datenbank nicht wirklich eine Option, da das Verschieben von Hunderten von GBs oder TBs an Daten nicht so einfach ist.

Es in Ruhe zu lassen ist normalerweise auch keine Option. Wenn die Datenmenge in der Datenbank zunimmt, wird die Leistung immer schlechter (wenn ich die Probleme sehe, sind sie normalerweise verdammt schlecht). Möglicherweise können die Benutzer die Anwendung nicht verwenden, da die Leistung so schlecht ist.


3

Ah ... die Hässliche Datenbank. Je größer das Unternehmen ist, desto mehr veraltete Datenbanken werden wir finden.

  • Leistungsoptimierung Menschen beschweren sich erst dann über solche Datenbanken, wenn sie Leistungsprobleme feststellen. Daher identifizieren wir in unserer Organisation einzelne Abfragen und optimieren sie als Patch.
  • Durch die Begrenzung der Daten wissen wir jetzt, wo der stinkende Müll ist. Versuchen Sie also, den Datenfluss durch solche Datenbanken zu vermeiden. Erstellen Sie Staging-Datenbanken, und leiten Sie Ihre Daten zunächst in diese Tabellen um, und verwenden Sie die alten als Datendumps.
  • Vermeiden Sie das Horten von Daten. Archivieren / kürzen Sie alte Daten, die nicht mehr benötigt werden. Es sollte ein Team geben, das entscheidet, wie lange die Daten in einer Datenbank benötigt werden. Danach können Sie es in flache Dateien oder sogar auf Bandlaufwerke verschieben.
  • Phase es aus , wenn Sie die Datenumleitung und Abschneiden erreichen können. Überzeugen Sie die anderen Teams, die neue Datenbank zu verwenden.

Es funktioniert nicht immer, aber wenn wir uns nicht anstrengen, wird es nur noch schlimmer. Ich versuche, Datenbanken zusammen mit den Anwendungen neu zu gestalten, da dies bei der Datenmigration möglicherweise mehr Arbeit für mich bedeutet, aber die Leistung ist ein Zaubertrick, den ich mir immer vorgenommen habe.

Viel Glück mit deiner hässlichen Freundin;)


2

Prüfen Sie, ob die Option für eine Wissenstransfersitzung für Sie verfügbar ist, und nutzen Sie sie in diesem Fall in vollem Umfang.

Viele DBMS werden mit Tools geliefert, mit denen Sie das Datenbankschema mit einigen hilfreichen Informationen (z. B. Fremdschlüssel) zeichnen / drucken können.

Darüber hinaus können Sie (von NXC gestohlen) die Datenbank mithilfe von Tools wie Visio zurückentwickeln.


2

Ich möchte einen Abfrageprofiler starten und beobachten, was auf einem Produktionssystem passiert. Gibt mir eine Vorstellung davon, welche Tabellen "heiß" sind und welche Art von Abfragen sie betreffen.


1

Legen Sie eine Sicherungskopie auf einem Sandbox-Server ab und beginnen Sie mit dem Schreiben und Ausführen von Testabfragen. Ich finde ein komplexes System immer verständlicher, wenn ich es in die Hand bekomme und mir keine Sorgen mache, es zu beschädigen.

Außerdem möchte ich The Daily WTF in einem Browserfenster öffnen. Die Übernahme des Designs einer anderen Person beinhaltet normalerweise eine Menge "Ich kann nicht glauben, dass sie WTF gemacht hat" -Momente, und es ist hilfreich, einen Ort zu haben, an dem die Leute Ihren Schmerz verstehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.