Eine Aufzählung und eine Tabelle synchron halten

11

Ich erstelle ein Programm, das Daten in eine Datenbank sendet, und bin auf ein Muster gestoßen, das mir sicher bekannt ist: Eine kurze Tabelle der wahrscheinlichsten (sehr wahrscheinlich) festen Werte, die als Aufzählung dienen. Nehmen wir also die folgende Tabelle an Status:

  Status
  ID Beschreibung
  --------------
   0 unverarbeitet
   1 Ausstehend
   2 verarbeitet
   3 Fehler

In meinem Programm muss ich eine Status-ID für eine andere Tabelle ermitteln oder möglicherweise einen Datensatz mit einer neuen Status-ID aktualisieren.

Ich könnte die Status-IDs in einer Aufzählung fest codieren und hoffe, dass niemand jemals die Datenbank ändert. Oder ich könnte die Werte basierend auf der Beschreibung vorab abrufen (also diese stattdessen fest codieren ).

Was wäre der richtige Ansatz, um diese beiden, Aufzählung und Tabelle, synchron zu halten?

MPelletier
quelle
Warum halten Sie die Dinge synchron und nicht synchron? Synchronisieren (sagen Sie es) ist komisch!
MrFox
1
@suslik Sie werden beide gleich ausgesprochen. Synch und Sync .
MPelletier
1
Eine Aufzählung und die Datenbanktabelle sind Duplikate. Sofern die Datenbanktabelle nicht von anderen Anwendungen verwendet werden soll, würde ich auf die Tabelle verzichten und nur die Aufzählung verwenden. Wenn die Tabelle in mehreren Apps verwendet wird, laden Sie stattdessen zur Laufzeit die Status aus der Datenbank.
Peter Smith
Das hängt vom Kontext ab. In diesem Fall würde ich es vorziehen, als Workflow- oder Aufgabenstatuswerte dynamischer als statisch zu bleiben, da sich Prozesse häufig ändern. und neigen dazu, für Software-Release-Zeitpläne außerhalb des Bandes zu wechseln. Auf der anderen Seite, wenn es sich um einen stabilen Dienst handelt, bei dem es unwahrscheinlich ist, dass neue Zustände eingeführt oder bestehende entfernt werden, bin ich möglicherweise gezwungener, die Aufzählung fest zu codieren / zu denormalisieren (abhängig davon, wie die Datensätze später verwendet werden).
JustinC
@PeterSmith Die Datenbank kann keine Einschränkungen erzwingen, wenn sie sich nur in Ihrer Java-Enumeration und nicht in einer Tabelle befinden. Sie werden die Werte in Ihrer Datenbank einschränken, nicht wahr?
David Conrad

Antworten:

5

Ich würde die Aufzählung in Ihrem Programm hart codieren, da ich vermute, dass diese unterschiedlichen Status Ihre Programmlogik beeinflussen. Wenn Sie einen neuen Status haben, wie soll Ihr Programm auf diesen neuen Status reagieren?

Da die Datenbank Teil Ihrer Anwendung ist, halte ich es nicht für sinnvoll, eine zu beeinflussen, ohne andere zu konsultieren.

Matthew
quelle
Es geht nicht so sehr um neue Status (die definitiv eine Änderung der Datenbank und des Programms rechtfertigen würden), sondern um ID-Werte.
MPelletier
2
Ich verstehe nicht, warum Sie den ID-Wert ändern würden, ohne seine Bedeutung zu ändern. Diese Art von Aufzählungen wird nicht automatisch inkrementiert, und diese dienen nur der Lesbarkeit für Benutzer, die die Datenbank debuggen, da Ihre Anwendung normalerweise Abfragen durchführt und bereits weiß, für welche ID pendingsie bestimmt ist. Natürlich Statusgibt Ihnen eine Tabelle referenzielle Integrität, aber das ist der Punkt, den ich ansprechen möchte.
Matthew
Nun ja, das ist die Idee. Aber wenn ich die IDs auf einen Ort und auf einen anderen setze, gehe ich davon aus, dass beide richtig sind. Es ist eine lose Verbindung, nein?
MPelletier
3
Wir machen diese Annahmen immer wieder. Wenn Sie an eine Tabellendefinition denken, geht unser Programm davon aus, dass die Definition beim Schreiben einer Abfrage so ist. Die StatusTabelle sollte während der Laufzeit der Anwendung nicht als dynamisch betrachtet werden, und daher denke ich nicht, dass Sie sie als solche lesen sollten.
Matthew
8

Normalerweise würde ich diese Daten in einen statischen Cache laden (normalerweise in eine HashMap oder ähnliches), wenn die Anwendung gestartet wird. Es muss nicht neu kompiliert werden, nur weil die Aufzählung auf irgendeine Weise geändert wurde.

FrustratedWithFormsDesigner
quelle
2

Da dies Status sind, sollten sie in der Anwendung fest codiert sein, um sicherzustellen, dass keine DB-Änderung Ihr Programm beschädigt (zumindest nicht leicht). Dies ist wichtig, da jeder Status, der hinzugefügt werden muss, zuerst codiert und nicht einfach zur Datenbank hinzugefügt werden muss.

Sie sollten diese Statuswerte weiterhin mit ihren korrekten Beschreibungen in die Datenbank schreiben lassen, falls Sie beispielsweise einen Bericht abrufen müssen.

Normalerweise habe ich ein kleines Code-Snippet, das eine Verbindung zur Datenbank herstellt und überprüft, ob die in einer bestimmten Tabelle aufgeführten Status alle dieselben ID- / Namenswerte haben, die ich im Speicher fest codiert habe. Wenn sie nicht übereinstimmen, werde ich die Ausführung der Software abbrechen.

Abhängig von Ihren Anforderungen möchten Sie möglicherweise etwas andere Verhaltensweisen implementieren, aber insgesamt ist es eine gute Idee, diese Status trotzdem fest zu codieren.

Alex
quelle
2

Wir haben ähnliche Probleme in meinem Projekt (Legacy-Code, Hurra!). Das Hauptproblem ist, dass sich "die Aufzählungstabellen nie ändern", bis sie es tun und der Code kaputt geht. Ich habe zwei Strategien, um zu mildern, auf die ich langsam zugewandert bin.

Erstens und am besten ist es, wenn immer möglich, direkte Verweise auf diese Werte zu entfernen. Fragen Sie immer: "Warum muss ich den Aufzählungswert direkt verwenden?" In vielen Fällen ist dies ein Zeichen dafür, dass der Code zu viele fest codierte Annahmen enthält oder versucht, die Daten zu stark zu manipulieren. Überprüfen Sie, ob Sie keine besseren Beziehungen in der Datenbank oder keinen flexibleren Code herstellen können, um mit den Manipulationen umzugehen.

Wenn das nicht funktioniert, gehe ich zu Plan B: Codegenerierung. Da sich die Tabellen selten ändern und wir regelmäßig neue Builds veröffentlichen, kann ein Codegenerator die Aufzählungstabellen lesen und den Aufzählungscode schreiben. Diese dynamisch generierte Bibliothek wird dann im Projekt verwendet. Wenn sich die Datenbank ändert, wird der nächste Build nicht kompiliert. Dies ist viel besser, als mysteriöse Laufzeitfehler zu erhalten.

CodexArcanum
quelle
Wie würden Sie Verweise auf eine Aufzählung entfernen? In diesem Fall sortieren oder suchen Sie beispielsweise nach einem Status. Einen magischen Wert in der DB zu haben, passt auch nicht gut zu mir. Dafür sind Nachschlagetabellen da.
Nportelli
In der Vergangenheit habe ich das Gegenteil getan. Immer wenn sich in Enum beim Start der Anwendung ein Code ändert, werden diese Werte mit der Datenbank synchronisiert. Hier ist Code die Quelle der Wahrheit. Datenbank ist eine Darstellung davon. Normalerweise ignoriere ich Werte in der Datenbank, die der Code nicht verstehen kann, aber auf diese Weise erhalte ich einen Mechanismus, um die Datenbank bei Bedarf automatisch zu bereinigen.
Anshul