2012-03-27 10 views
2

Was ist in einer relationalen Datenbank die beste Methode, um ein Objekt aus dem Objektdiagramm zu entfernen, während die referenzielle Integrität erhalten bleibt? Irgendwann muss das passieren. Entweder durch ein Soft- oder Hard-Delete.Objekt aus Objektdiagramm entfernen, während Integrität beibehalten wird

Zum Beispiel - wenn ein Produkt entfernt wird, was ist der beste Ansatz, um sicherzustellen, dass die Bestellungen, die dieses Produkt enthalten, immer noch relevant sind oder dass Rechnungen mit Bestellungen, die dieses Produkt enthalten, noch relevant sind?

+0

Diese Frage ist von Bedeutung, und das Problem wurde von einigen * sehr * glaubwürdigen Quellen anerkannt. –

Antwort

2

Grundsätzlich gibt es 3 "Standardlösungen":

Lösung 1

Sie das Produkt benötigen (wie in Ihrem Fall, weil die Rechnungen Referenzierung es). Dies bedeutet, dass die Daten VALID sind und die einzige Änderung darin besteht, dass sie "aus dem Lager" oder "aus dem Portfolio" wird. In jedem Fall müssen Sie in Ihrem Geschäftsprozess häufig RMA-Situationen oder IRS-bezogene Angelegenheiten behandeln ... das bedeutet, dass das Produkt nicht gelöscht werden darf. Dies ist nur ein anderer "Zustand" des Produkts, der von Ihrem DB-Datenmodell usw. widergespiegelt werden muss.

Wenn Sie sich mit Leistung befassen, machen Sie ein Profiling ... wenn nötig, haben Sie eine Vielzahl von Optimierungsmöglichkeiten. .. diese sind in der Regel RDBMS-abhängige, eine Technik zu sein „Partitionierung“ - jedes RDBMS hat seine eigene Mechanik, die usw. in Flexibilität unterscheiden

Lösung 2

Sie brauchen nicht irgendwelche Daten an alles ... mach einfach ein kaskadiertes Löschen und sei damit fertig ...

Lösung 3

Sie benötigen nur historische Daten, aber kein "zukünftiger Geschäftsprozess" wird jemals diese Entität benötigen (d. H. Produkt) wieder ... in diesem Fall ist es eine übliche Lösung, Archivtabellen zu haben, die gefüllt werden, bevor ein kaskadiertes Löschen auf den "aktiven/produktiven Tabellen" durchgeführt wird. Eine leichte Variante dieses Schemas ist das Kopieren der benötigten Informationen in die "abhängigen Zeilen" (Rechnung in Ihrem Fall) und einfach die aktive/produktive Zeile (d. H. Das Produkt in Ihrem Fall) zu löschen.

Fazit

Komplexe Systeme befassen sich mit vielen verschiedenen Geschäftsprozesse/Anwendungsfälle und neigen daher dazu, alle oben genannten Techniken zu beschäftigen - jeder hat seinen Platz depeding beteiligt an die spezifischen Geschäftsprozesse/Anwendungsfälle. ..

0

Hier ist eine Antwort, die ich von einer nicht genannten Quelle erhielt. Ich werde das sagen, er wird ziemlich respektiert, und um respektvoll zu sein, werde ich seinen Namen nicht veröffentlichen.

Ich werde meine eigene Antwort hier nicht akzeptieren, oder die Prämie umgehen, aber zeige nur seine Antwort.

"Mit einem RDBMS mit vollem Funktionsumfang können Sie die Tabelle in der Spalte" deleted_or_not "partitionieren, wodurch alle Live-Produktionszeilen kompakt gespeichert werden. Wenn Sie nicht möchten, dass veraltete Daten angezeigt werden Geben Sie einfach der vollständigen Tabelle einen obskuren Namen wie customers_inclusive_deleted_rows ein und erstellen Sie eine Ansicht "customers" (die nur die aktiven Zeilen enthält), von der die meisten Anwendungscodes abfragen. Dies setzt natürlich voraus, dass ein gewisser Wert vorhanden ist die alten Daten herum."