Frage

Ich schreibe ein einfaches Dokumenten-Management-System für meine Arbeit. Ich bin nur ein Bastler, aber haben jetzt für eine Weile zu programmieren. Mein Problem ist folgendes. Wenn ich eine Reihe von Dokumenten durch meine App löschen, muss ich dann die entsprechenden Datenbankeinträge entfernen. Was ist der beste Weg, um dies zu realisieren, ohne Dateien ohne Datenbank-Datensatz enden, oder Aufzeichnungen auf Dateien zeigen, die nicht existieren, wenn es eine Ausnahme ausgelöst wird?

War es hilfreich?

Lösung

Speichern Sie die Dateien in der Datenbank. Dann können Sie referenzielle Integrität haben, ohne die Komplexität zu erhöhen (MSMQ usw.) für Ihre Anwendung. Ja, das wird die Größe Ihres db erhöhen. Aber die Dateien bereits auf dem Server, so ist es nur die gleichen Bits an einem anderen Ort.

Andere Tipps

Dies ist eine Art von „verteilte Transaktion“ -System. Sie wollen wahrscheinlich eine Konsolidierungs Routine schreiben und es ab und laufen, Sie wird irgendwann Inkonsistenzen haben.

Du hast gesagt, "durch meine app". Bedeutet dies, sie können nur Dateien über die Anwendungsschnittstelle entfernen? Wenn ja, dann wickeln Sie die Löschung in einer benutzerdefinierten Transaktion sowohl die Datei entfernen und den db Eintrag entfernen. Wenn eine Seite ausfällt, rollen die anderen zurück.

Wenn Sie wollen, dass sie erlauben, Dateien aus dem Dateiverzeichnis zu entfernen und dann die DB-Datensätze automatisch entfernen, werden Sie viele Dinge tun könnte, einschließlich der regelmäßigen Säuberungsaktionen und / oder ein Dateiverzeichnis Watcher Windows-Dienst, der die Aktivität überwacht in ein Verzeichnis und Säuberungsaktionen startet.

Vielen Dank für Ihre Antworten. Ich dachte schon an dem BLOB Weg zu gehen, war aber nicht sicher, ob mein Chef es gehen würde. Er mag eine gute Verzeichnisstruktur, weißt du? Wie für verteilte Transaktionen, wusste ich nichts über sie, aber sie scheinen wie die meisten professionellen Art und Weise zu nähern. Aber ich bin ein Bastler und es scheint alles zu kompliziert, so werde ich meinen Chef Runde auf der BLOB Front gewinnen. Prost.

Sie sollten eine verteilte Transaktion verwenden, die Datenbank und MS Messaging Queue (MSMQ) enthalten wird. Überprüfen Sie, ob Ihre Datenbank kann in einer verteilten Transaktion mit Microsoft Distributed Transaction Coordinator (DTC) eingeschrieben werden.

Programm alle Dateioperationen mit MSMQ.

Das verlinken könnte Ihnen helfen

Ich habe eine ähnliche Funktionalität in einigen meiner apps.

Was ich tue, ist die Datei zuerst durch die ap löschen und gelöscht dann den Datenbankeintrag, die einen Link / Zeiger auf die Datei hat. Wenn Benutzer ein Dokument beantragen (was bedeutet, den Link zu der Datei noch in der Datenbank vorhanden ist), die App überprüft die Datei zuerst, und wenn es aus irgendeinem Grunde nicht da ist, wie sie es sein erwarten, reinigt es den Datenbankeintrag nach oben an diesem Punkt und informiert den Benutzer über den „Fehler“ anmutig.

„verwaiste“ Dokumente passieren nicht viel sowieso, aber diese Methode wird sichergestellt, dass die Datenbank ständig als normaler Teil der Ausführung des App gereinigt wird.

Es gibt viele andere Möglichkeiten, diese Handhabung, aber diese funktioniert für mich.

Datensätze in der Datenbank löschen ersten und Audit-Repository gelegentlich. Durch die Prüfung für Dateien suchen das Repository Ich meine, die keine Datenbank-Datensatz haben. Wenn Sie den Datensatz DB löschen zuerst wird Ihr Code nicht der Suche nach Dokumenten, die nicht wirklich da sind.

Wie viele Dokumente, und welche Art von Dokumenten planen Sie zu speichern?

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