Ich baue eine Inventardatenbank auf, in der Computerausrüstung und andere Hardwaregeräte erfasst werden. Irgendwann im Leben eines Geräts wird es ausgemustert und archiviert. Nachdem es archiviert wurde, muss es nachverfolgt werden, wenn es außer Betrieb genommen und ordnungsgemäß entsorgt wird. Ich habe den Archivierungsmechanismus ursprünglich unter Verwendung einer exakten Replik der aktiven Datenbank entworfen, die ihre Daten mithilfe eines Auslösers beim Löschen aus der aktiven Datenbank empfangen würde. Die Archivdatenbank enthält Replikate aller zugehörigen Tabellen, da bestimmte fremdbezogene Datensätze nicht mehr relevant sind und für Benutzer mit neuen Geräten nicht zugänglich sein sollten, sondern für die referenzielle Integrität und die Abfrage mit den Archivtabellen erforderlich sind. Denken Sie daran, dass das Konzept des Archivs hier nicht nur darin besteht, einen Verlauf oder ein Protokoll zu führen. Das Archiv ist Teil des Geschäftsprozesses.
Die folgende ERD verwendet die Inventory.DeviceType
Tabelle als Beispiel, in der alle Einträge und Aktualisierungen in die Archive.DeviceType
Tabelle kopiert werden. Wenn Benutzer keine Inventardatensätze eines bestimmten Gerätetyps mehr eingeben können, werden diese aus der Inventory.DeviceType
Tabelle gelöscht , verbleiben jedoch in der Archivtabelle. Dieses Muster wird für alle Tabellen verwendet, um sicherzustellen, dass die Archive auf gültige Daten verweisen, daher die Replik aller Tabellen.
Beispiel für eine aktive Tabelle (andere verwandte Tabellen weggelassen)
Beispiel für eine Archivtabelle (andere verwandte Tabellen weggelassen)
Problem
Ich versuche herauszufinden, wie ich die Datenbank abfragen würde, wenn ich nicht weiß, ob ein Gerät aktiv oder archiviert ist. Zum Beispiel, wenn ein Benutzer eine Seriennummer hat und Informationen über das Gerät herausfinden möchte und nicht weiß, ob es archiviert wurde.
Option 1: Erstellen Sie eine Ansicht basierend auf einer Union all?
Option 2: Die aktive Datenbank abfragen und dann das Archiv abfragen, wenn die erste Abfrage nichts zurückgibt?
Die Saga geht weiter ...
Ein Mitarbeiter schlug vor, die Archivdatenbank zu entfernen und ein Soft-Delete-Schema zu verwenden. Mit dieser Idee baute ich ein Modell und stieß dann auf eine Reihe anderer Probleme.
Hier sind die gleichen Tabellen, die das Soft-Delete-Schema verwenden.
Beispiel für weiches Löschen
Bei diesem Setup werden Geräte archiviert, indem das IsArchived
Feld auf true gesetzt und ein eingegeben wird ArchivedDate
. Ich könnte jedes Gerät leicht abfragen, ob es aktiv oder archiviert ist. (Bitte ignorieren Sie das IsActive
Feld, da dies für ein nicht verwandtes Konzept verwendet wird.)
Beachten Sie die Subtyp-Tabelle "Telefon", in der ich einen Index der Geräte-ID und des IsArchived-Flags weitergeben musste, da Telefonnummern für aktive Geräte eindeutig sein müssen. Ich muss dies auch mit anderen Subtyp-Tabellen tun. Ich weiß nicht, ob dies ein gutes oder ein schlechtes Design ist.
Dieser Teil verwirrt mich wirklich ...
Was sind Best Practices für den Umgang mit weichen Löschvorgängen, bei denen Fremdschlüsselwerte als gelöscht markiert werden können? Ich kann mir nur vorstellen, eine Routine zu erstellen, die nach allen Datensätzen sucht, die sich auf gelöschte Daten beziehen, und einen Bericht für Benutzer zu erstellen, um die Diskrepanzen zu beheben. Wenn beispielsweise eine Standorttabelle mit der Gerätetabelle verknüpft ist und einige Standorte weich gelöscht werden, beziehen sich die Geräte auf Standorte, die nicht mehr vorhanden sind und verschoben werden müssen.
Übrigens verwende ich MS SQL Server 2008 R2 und plane, Entity Framework 4 in meiner Anwendung zu verwenden. Ich schätze die Wartbarkeit der Datenbank gegenüber der Leistung.
Danke fürs Lesen.