Wie Sie verhindern, dass verwaiste Datensätze in der detail-Tabellen der normalisierten Datenbank?

StackOverflow https://stackoverflow.com/questions/448592

  •  19-08-2019
  •  | 
  •  

Frage

Ich Pflege eine alte Datenbank, die nicht ordnungsgemäß normalisiert.Zum Beispiel gibt es eine Tabelle Projekt geworden ist (oder vielleicht Pilze aus dem Boden), um 5 oder mehr verschiedenen Datum-Spalten, für die unterschiedliche Meilensteine des Projekts von der Bestellung bis zur Auslieferung.Es gibt auch mehrere Tabellen, die jeweils mit Spalten für street-Adressen, mail-Adressen oder web-links.

Ich möchte zu normalisieren, die Struktur, erstellen von Tabellen für Adressen, Termine und dergleichen, und die erforderlichen Tabellen zu erlauben für 1:N-Beziehungen (Adresse pro Kunde, Fälligkeit pro Projekt und so weiter).

Jetzt bin ich Total unsicher, wie Sie zu behandeln änderungen an den Daten in den detail-Tabellen.Betrachten Sie zum Beispiel die änderung eines vom Kunden angegebene Lieferanschrift.Ändern der Daten in der Tabelle "Adressen" wird aus der Frage, weil mehr als ein Datensatz (möglicherweise in mehr als einer Tabelle) könnten Referenz-Datensatz.Hinzufügen einen neuen Adresseintrag verlassen konnte den alten Rekord, der verwaiste, wenn keine andere Reihe hat eine foreign-key-Beziehung zu ihm.

Ich habe nachgedacht über die folgenden Möglichkeiten, damit umzugehen:

  • Fügen Sie ein neues detail-Datensatz, und der check-in einen update-trigger für die master-Tabelle, ob die alte detail-Datensatz gelöscht werden muss.Dies würde erfordern Kenntnisse über alle Tabellen mit Beziehungen in der detail-Tabelle, in der alle von Ihnen oder in einer sproc.Ich weiß nicht, wie dieser Verlust der Trennung.Es würde auch mehr Tabellen in die aktive Transaktion ein.

  • Lassen Sie den trigger zu löschen versuchen, das alte detail-Datensatz, und fangen Sie eventuelle Fehler.Das fühlt sich einfach falsch.

  • Live mit den verwaisten Eintrag, und haben eine regelmäßige Instandhaltungsmaßnahmen reinigen alle detail-Tabellen.

Was ist der bevorzugte Weg, um Daten zu behandeln änderungen im detail-Tabellen verknüpft sind mehrere master-Tabellen?Tipps zum Lesen auf diesem?

War es hilfreich?

Lösung

Ein Teil des Problems kann sein, das ursprüngliche schema design:der Fremdschlüssel zeigen die falsche Weise zu behandeln-Adressen, Telefonnummern, etc.als master statt detail.Dies kann praktisch sein, wenn Sie möchten, dass alle Verwendungen einer bestimmten Adresse zu update auf einmal, aber meiner Erfahrung nach ist es immer geht in zu vielen schwierigen Ausnahmefällen, zum Beispiel einer person, an einem Ort so bewegt, dass Sie brauchen, um zu brechen Ihren link vs gesamten Haushalt oder Büro bewegen, so dass Sie den vorhandenen Datensatz aktualisieren.Wenn Sie versuchen, dies zu verbergen Details aus der Benutzer auf die CRUD-Bildschirm, werden Sie am Ende mit einer situation, wo es einfach nicht tun, was Sie wollen.

Wenn es fertig ist so einfach zu Zusammenbruch doppelte Werte, es ist effektiv eine Denormalisierung der Datenbank:die bloße Existenz der Adresse Zeile ist sinnlos.Der einzige Unterschied ist, dass im Gegensatz zu den meisten denormalizations, versucht es zu erlangen, Raum Effizienz statt Geschwindigkeit.Erstellen einer link-Tabelle an dieser Stelle einfach verschärft das problem.

Wenn Sie wollen, für Beispiel, mehrere Adressen pro Kontakt, stellen Sie die Adressen ein detail-Tabelle mit einem Fremdschlüssel verweist zurück an die Eltern wenden, und Mach dir keine sorgen über dupliziert Adresse Werte auf, da Sie sind nur Werte.Sonst, stellen Sie die Adresse ein reales Wesen:fügen Sie einen Titel oder in der Beschreibung-Feld und eine CRUD-Bildschirm, so dass es stehen kann auf seine eigenen als eine Einheit.

Andere Tipps

Live mit den verwaisten Eintrag, und haben eine regelmäßige Instandhaltungsmaßnahmen reinigen alle detail-Tabellen.

Ich glaube, Sie verwischen den delete-und update-Fällen.

Wenn Sie client a und client b, und die beide die gleiche Adresse verwenden, würde reflektiert werden, durch Datensätze in einer relationalen Tabelle (sagen ClientAddresses, obwohl, wenn Sie speichern-Adressen für mehrere Personen, ich bin sicher, es wird komplexer sein, als, dass)

Ich würde denken, dass, wenn zwei clients freigeben und Adresse und es ist falsch für die Kunden einer, es wäre falsch für client b sowie (dh Daten Eintrag Fehler), aber wenn Sie sicher sind, dass Sie nicht möchten, dass Kunden eine änderungen an der vorgenommen, um die Basis-Adresse, info, entfernen Sie den Verband record (löschen von ClientAddresses) und eine neue Adresse hinzufügen.Wenn Sie führen Sie das löschen aus der relationalen Tabelle (vermutlich aus einer gespeicherten Prozedur) überprüfen, um zu sehen, ob es irgendwelche anderen Einträge bezogen auf den adressdatensatz wird entkoppelt, wenn sich nicht löschen aus der Basistabelle.

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