Nehmen wir zum Beispiel an, ich hätte eine Social-Networking-Site für Filmfans. Einige Leute listen "Rocky" als ihren Lieblingsfilm, andere Listen "Rocky 1", andere immer noch "Rocky I". Das Offensichtliche ist, die drei zusammenzuführen und die zugehörigen Tabellen zu aktualisieren. Für jede offensichtliche Lösung gibt es jedoch ein Designmuster, das 1) komplizierter ist und 2) einige zusätzliche Vorteile bietet. Gibt es ein Entwurfsmuster zum Zusammenführen doppelter Datenbankeinträge? Insbesondere etwas, das Überprüfbarkeit oder Reversibilität bietet?
Sobald du sagst "Reversibilität", denke ich Command Pattern.
Das typische Beispiel ist die Unterstützung von Rückgängig-Stil-Verhalten, aber ich denke, dass dies auch gut zur Überprüfbarkeit passt - besonders, da die einzelnen "Schritte" (aus Mangel an einem besseren Wort) so klein und einfach darzustellen sind Code%).
Wie würde ich das Befehlsmuster zu tatsächlich funktionieren für Ihr Szenario?
Nun, dies bleibt in der RDBMS-Arena und nicht in der OO-Modellierung. Wenn Sie bereits die Tabellen {Merged "Rocky I" -> "Rocky" }
und USER_FAVORITE
haben, würde ich eine neue Tabelle MOVIE
mit Spalten hinzufügen:
USER_FAVORITE_MOVIE_MERGE_COMMAND
id
date
user_id
old_favorite_movie_title
Ihr nächtliches Bereinigungsskript (oder was auch immer) läuft über die new_favorite_movie_title
-Tabelle und sucht nach nicht-standardmäßigen Filmtiteln. Jedes Mal, wenn eine gefunden wird, wird sie korrigiert und die relevanten Fakten in der Tabelle USER_FAVORITE
aufgezeichnet.
Ihr Audit Trail ist genau dort, und wenn Sie den Bereinigungsjob rückgängig machen müssen, "spielen" Sie die Zeilen in umgekehrter chronologischer Reihenfolge ab und ersetzen Sie USER_FAVORITE_MOVIE_MERGE_COMMAND
durch new
.
Beachten Sie, dass Sie sowohl im temporal -Sinn Reversibilität als auch Überprüfbarkeit haben (zB der Batch-Lauf der letzten Nacht ist um 2.12 Uhr merkwürdig geworden, lassen Sie uns alle zurückrollen) Danach <)> und im pro Benutzer Sinn.
Ist das etwas, wonach Sie suchen?
Tags und Links design-patterns database-design