Frage

Das mit einem Legacy-Datenbank-Schema fest, das nicht mehr Ihr Datenmodell spiegelt Alptraum eines jeden Entwicklers ist. Doch mit all dem Gerede von Refaktorierungscode für Wartbarkeit habe ich nicht viel von Refactoring veraltete Datenbankschemas gehört.

Was sind einige Tipps, wie man ein besseres Schema zu überführen, ohne den gesamten Code zu brechen, die auf dem alten beruht? Ich werde ein spezifisches Problem schlage ich habe meinen Standpunkt zu erläutern, aber das Gefühl, kostenlose Beratung über andere Techniken zu geben, die nützlich erwiesen -. Diejenigen wahrscheinlich auch praktisch sind,


Mein Beispiel:

Meine Firma erhält und liefert Produkte. Nun wird ein Produktzugang und ein Produkt Versand haben einige sehr unterschiedliche Daten mit ihnen verbunden sind, so dass die ursprünglichen Datenbank-Designer eine separate Tabelle für Belege und für Sendungen erstellt.

In meinem ein Jahr lang mit diesem System arbeitet ich zu der Erkenntnis gekommen, dass das aktuelle Schema nicht einen Lick von Sinne macht. Immerhin sowohl eine Quittung und eine Sendung sind im Grunde eine Transaktion, sie jeweils um die Menge eines Produkts, im Innersten ändert nur das +/- Zeichen anders. Tatsächlich müssen wir häufig den Gesamtbetrag finden, das das Produkt über einen Zeitraum von Zeit verändert hat, ein Problem, für das dieser Entwurf geradezu unlösbar ist.

Offensichtlich ist die geeignete Konstruktion wäre eine einzelne Transaktionen Tisch zu haben, mit der Id ein Fremdschlüssel entweder aus einem ReceiptInfo oder einer Tabelle VERSANDINFO zu sein. Leider hat das falsche Schema bereits seit einigen Jahren in Produktion und Hunderte von gespeicherten Prozeduren hat, und Tausende von Codezeilen aus der es geschrieben. Wie kann ich das Schema Übergang richtig zu arbeiten?

War es hilfreich?

Lösung

Hier ist ein ganzer Katalog der Datenbank Refactorings:

http://databaserefactoring.com/

Andere Tipps

Das ist eine sehr schwierige Sache, um zu arbeiten; Ein paar schnelle Optionen nach der Datenbank Refactoring sind:

  • Erstellen Sie Ansichten, die das ursprüngliche Schema passen, aber von dem neuen Schema ziehen; Sie können Trigger hier müssen so alle Aktualisierungen zu den Ansichten gehandhabt werden kann.
  • Erstellen Sie das neue Schema und setzt in Triggern auf jeder Seite, die andere Seite zu halten.
  • Dieses Buch (Refactoring Datenbanken) eine war von Gott senden ich, wenn sie mit Legacy-Datenbank-Schemata zu tun, auch wenn ich hatte mit fast genau dem gleichen Frage für unsere Inventar-Datenbank zu behandeln.

    Auch ein System eingerichtet, mit Änderungen am Datenbankschema zu verfolgen (wie eine Reihe von alter Skripte, die int er Quellcodeverwaltungsrepository gespeichert ist) hilft ungemein in herauszufinden, Code-zu-Datenbank-Abhängigkeiten.

    Stored Procedures und Views ist dein Freund hier. Auch wenn das System sie nicht verwenden, ändern Sie es, sie zu benutzen, dann Refactoring die Datenbank unter.

    Ihre Einnahmen und Sendungen dann Ansichten werden.

    Beachten Sie, Quittungen und Sendungen sind eigentlich zwei sehr unterschiedliche Tiere in den meisten Systemen, die ich mit gearbeitet haben. Die Einnahmen werden an den Lieferanten verbunden ist, während Lieferungen an Kunden (oder Kunden / Schiff zu Standorten) verbunden sind. Auf dem Lagerbestand, werden sie vertreten oft die gleiche.

    Sie alle Datenzugriff auf gespeicherte Prozeduren beschränkt? Wenn nicht, könnte die Aufgabe fast unmöglich sein. Wenn ja, müssen Sie nur sicher, dass Ihre Datenmigration Skripte funktioniert gut von der alten auf das neue Schema übergeht, und dann Ihre gespeicherten Prozeduren ehren stellen Sie sicher, theur Ein- und Ausgänge.

    Hoffentlich keiner von ihnen hat „select *“ Abfragen. Wenn sie das tun, verwenden Sie ‚sp_help Tabellenname‘ die komplette Liste der Spalten zu bekommen, dass abschreiben und jede ersetzen * mit der kompletten Spaltenliste, nur um sicherzustellen, dass Sie nicht Client-Code brechen.

    Ich würde empfehlen, die Änderungen nach und nach zu machen und tun viele Integrationstests. Es ist schwer, eine bedeutende Umgestaltung zu tun, ohne ein paar Fehler eingeführt werden.

    Das erste, was ist das Tabellenschema zu erstellen. Ich habe bereits, dass für eine Legacy-Datenbank mit Enterprise Architect. Sie können die DB auswählen und es wird Sie alle Tabellen / Felder erstellen. Dann müssen Sie alles in Kategorien aufgeteilt. Exemple alle Ihre empfängt und liefert Produkte zusammen, Client Sachen in einer anderen Kategorie. Sobald alles aufklären, werden Sie in der Lage sein Feld Refactoring durch neue Tabelle erstellen, neuen releashionship und neue Felder. Natürlich wird dies viel ändern müssen, wenn alles ohne gespeicherte Prozedur zugegriffen wird.

    Ich glaube nicht, seine offensichtlich, dass die ID der Transaktionen Tabelle entweder ReceiptInfo oder VERSANDINFO einen Fremdschlüssel sein sollte. Denken Sie umgekehrt. In einem objektorientierten Modell sollten Sie eine Transaktionstabelle haben und die ReceiptInfo oder sollte einen VERSANDINFO Fremdschlüssel für die Transaktionstabelle haben. Wenn Sie Glück haben, wird es nur noch 1 oder 2 Punkte in Code sein, wo neue Datensätze in ReceiptInfo oder VERSANDINFO gemacht werden. Dort sollen Sie Code hinzufügen, in dem Sie einen Eintrag in der Transaktionstabelle hinzufügen und danach den Eintrag in ReceiptInfo oder VERSANDINFO mit dem Fremdschlüssel zur Transaktion erstellen.

    Manchmal kann man neue Tabellen erstellen, die eine bessere Strukturen haben und erstellen Sie Ansichten mit den Namen Ihrer alten Tabellen sind aber auf die Daten in den neuen Tabellen basieren. Auf diese Weise kodieren Sie tut Pause, während Sie auf eine bessere Struktur zu bewegen beginnen. Seien Sie vorsichtig mit Thsi obwohl, wie man manchmal aus einem nicht-relationalen Tabelle in einer relationalen Struktur bewegen, wo Sie mehrere Datensätze haben, während der Code nur eine erwartet wird. Dies ist particulalry wahr, wenn Sie Entwickler haben, die Unterabfragen verwenden.

    Dann wird, wie jedes Ding geändert wird, wird es bewegt sich von den Ansichten der realen Tabelle entfernt. Schließlich können Sie die Ansichten fallen. Das zumindest können Sie inkrementell arbeiten Dinge weiter zu arbeiten, wie Sie Sachen bewegen, aber beginnen die Dinge zu reparieren ein besseres Design zu verwenden.

    Lizenziert unter: CC-BY-SA mit Zuschreibung
    Nicht verbunden mit StackOverflow
    scroll top