2009-07-15 9 views
0

Ich bin gerade dabei, meine Datenbank zu refaktorieren, um ein Upgrade auf unser webbasiertes Tool zu unterstützen.SQL Refactoring - Eindeutige Namen für UniqueIdentifiers

Stellen Sie sich vor, ich habe vier Tabellen: Meilensteine, Kategorien, Fähigkeiten und PayRates. Unter dem alten Schema enthielt jede dieser Tabellen nur einen Namen, und dieser Name war der Schlüssel für die Tabelle.

Unter dem neuen Schema hat jede Tabelle nicht nur einen Namen, sondern auch einen generierten Uniqueidentifier, der als Schlüssel für die Tabelle dient.

Stellen Sie sich nun vor, dass ich eine Tabelle mit Aufgaben habe, wobei jede Aufgabe aus einem Namen, einem Meilenstein, einer Kategorie, einer Fertigkeit und einer PayRate besteht und diese aus ihren jeweiligen Tabellen ausgewählt werden. Unter dem alten Schema speichert diese Tabelle nur Namen. Unter dem neuen Schema, speichert diese Tabelle die IDs für die vier Tabellen anstelle der Namen, wie die folgenden:

 
TaskID TaskName MilestoneID CategoryID SkillID RateID 

wo TaskId ein für diese Aufgabe erzeugt ist Unique.

Jede dieser Tabellen enthält derzeit Daten, die aus dem alten Schema in das neue Schema übertragen werden müssen. Ich kann davon ausgehen, dass die Namen jeder der vier Komponenten von Aufgaben und die Namen von Aufgaben selbst im alten Schema eindeutig sind.

Meine Frage ist, was ist die einfachste Abfrage, um die Daten aus dem alten Schema in das neue zu verschieben?

Dies wird durchgeführt, um die Speicherung von zwei separaten Listen von Meilensteinen, Aufgaben usw. in derselben Datenbank zu unterstützen.

+0

Mit der einfachsten Abfrage fragen Sie nach Beispielen für Insert-Anweisungen, die Daten aus t aufnehmen würden Das alte Schema und das neue Schema? – northpole

+0

Angenommen, ich möchte keinen Einfügeeintrag für jeden Datensatz in Tasks erstellen. Gibt es einen generischen Weg, dies zu tun, ohne es rekordverdächtig zu machen? –

Antwort

3

würde ich folgende

  • Schritt Null tun: Sichern Sie Ihre Datenbank

  • Erster Schritt: Fügen Sie die eindeutigen Kennungen zu Meilensteine, Kategorien, Fähigkeiten und PayRates. Dies ist eine einfache Spaltenaddition mit dem Standardwert der nächsten ID. Dadurch werden Ihre IDs für die vorhandenen Namen generiert.

  • Schritt zwei: Fügen Sie der vorhandenen Aufgabentabelle die vier neuen Spalten hinzu (und fügen Sie den Quellentabellen ggf. Fremdschlüssel hinzu), ohne die alten Namenspalten zu löschen.

  • Schritt drei: Run (den alten, Name unter der Annahme, Spalten zeigen werden Milestone, Fähigkeit und so weiter genannt)

    update Tasks set MilestoneID = (
                select MilestoneID from Milestones where 
                Milestone = Tasks.Milestone 
               ), 
            CategoryID = (
                select CategoryID from Categories where 
                Category = Tasks.Category 
               ), 
            SkillID = (
                select SkillID from Skills where 
                Skill = Tasks.Skill 
               ), 
            PayRateID = (
                select PayRateID from PayRates where 
                PayRate = Tasks.PayRate 
               ) 
    
  • Schritt vier: überprüfen Sie alles an Ort und Stelle

  • Schritt fünf: Alte Spalten aus der Tabelle Aufgaben löschen, neue Felder nicht null machen

+0

Schritt 5.1: machen Sie alle neuen Felder nicht null (weil Sie in Schritt 2 wegen der vorhandenen Daten nicht konnten). –