Viele Anwendungen enthalten "statische Daten": Daten, die sich während der Lebensdauer der Anwendung nicht wirklich ändern. Beispielsweise könnten Sie eine Liste von Verkaufsbereichen haben, die auf absehbare Zeit wahrscheinlich eine feste Liste ist.
Es ist nicht ungewöhnlich, diese statischen Daten in einer Datenbanktabelle zu finden (häufig, weil Sie in den Fremdschlüsseln anderer Tabellen darauf verweisen möchten). Eine einfache Beispieltabelle enthält eine ID als Primärschlüssel und eine Beschreibung. Beispielsweise enthält Ihre SalesArea-Tabelle (mindestens) eine SalesAreaId-Spalte und eine SalesAreaDescription-Spalte.
Im Code möchten Sie möglicherweise nicht jede Zeile der Tabelle gleich behandeln. Beispielsweise möchten Sie auf einigen Bildschirmen möglicherweise einen Standardverkaufsbereich festlegen, für einige Bereiche andere Zahlen angeben oder die Möglichkeiten der Benutzer in anderen Bereichen einschränken.
Wie kann man am besten auf diese statischen Daten im Code verweisen? Warum?
- Codieren Sie die Beschreibungen in Ihrem Code hart. Verwenden Sie diese Option, um die SalesAreaId bei Bedarf in der Datenbank nachzuschlagen.
- Kodieren Sie die IDs in Ihrem Code fest. Verwenden Sie diese Option, um die SalesAreaDescription bei Bedarf nachzuschlagen.
- Fügen Sie der Tabelle für jeden Zweck eine Spalte hinzu, z. B. eine "IsDefaultOnProductLaunchScreen" -Spalte usw. (es kann viele davon geben).
- Etwas anderes.
Gibt es weitere spezielle Überlegungen, die ich beim Umgang mit statischen Datenbankdaten treffen sollte? Zum Beispiel diesen Tabellen einen speziellen Namen geben?
quelle
Antworten:
Wie wäre es, wenn Sie diese beim Start der Anwendung in einen Cache laden (normalerweise als Hash-Tabelle implementiert)? Wenn Sie das tun, müssen Sie nicht einmal die Datenbank abfragen (also nicht mehr als einmal).
Ich würde auch empfehlen, auf das Hardcodieren zu verzichten. Fügen Sie Standardkennzeichen (anfangs in der DB-Tabelle und auch in der Cache-Struktur) für Bildschirme hinzu, die Standardwerte benötigen. Versuchen Sie, die Schlüssel, die nachgeschlagen werden sollen, in einer Konfigurations- oder Eigenschaftendatei zu speichern, falls dies möglich ist.
quelle
Eine Alternative zur Datenbank oder zur Hardcodierung ist die Verwendung einer Konfigurationsdatei, die beim Start gelesen wird. Sie können diese Daten dann in einer schreibgeschützten Struktur in Ihrem Code speichern.
In dem seltenen (aber nicht unmöglichen) Fall, dass Sie diese Daten bearbeiten, müssen Sie die App neu starten. Wenn dies nicht möglich ist, können Sie einen komplexeren Konfigurationsmanager schreiben, der jedes Mal, wenn auf die Daten zugegriffen wird, nach Änderungen in der Konfigurationsdatei sucht. Dies ist sehr effizient, da Sie nur einen Zeitstempel für die Datei überprüfen und dann alle Daten ungültig machen müssen wenn die Datei aktualisiert wird.
quelle
Wenn sich die Daten auf vorhandene Daten in Ihrer Datenbank beziehen, ist das Hinzufügen zur Datenbank wahrscheinlich genauso effizient wie das Hinzufügen zum Code. Wenn dies nicht der Fall ist, bin ich normalerweise versucht, "diese Kugel einmal zu nehmen" und sie bis zur ersten Änderung in den Code einzufügen.
Was wir für statisch halten, stellt sich oft als nicht statisch heraus. In diesem Fall müssen Sie nicht auf eine Code-Freigabe warten, bis eine Änderung durchgeführt wird. Sobald dies einmal passiert, legen Sie es in die Datenbank und schreiben Sie eine Administratorseite, um weitere Aktualisierungen vorzunehmen.
Wenn Sie beispielsweise bereits Verkaufsbereiche in der Datenbank haben, fügen Sie dort eine Beschreibung hinzu, und erstellen Sie keine Hash-Tabelle, um die Datenbankdaten mit fest codierten Listen in Beziehung zu setzen. Wenn Sie dann aber nicht unbedingt eine Hash-Tabelle mit Verkaufsbereichen erstellen, sondern bereit sind, verschieben Sie diese in die DB, wenn zum ersten Mal jemand eine Beschreibung ändert oder einen neuen Verkaufsbereich hinzufügt.
quelle
Warum nicht einfach alles hart codieren? Das Hauptproblem, das ich immer hatte, ist das Verweisen auf statische Werte aus der Datenbank im Anwendungscode. Es ist eine Sache, wenn Sie direkt eine Dropdown-Liste oder etwas aus statischen Werten erstellen, aber was ist, wenn eine Anwendungslogik von den Werten aus der Datenbank abhängt?
In einer einfachen App habe ich derzeit eine Liste mit Bearbeitungsstatus für Inhaltselemente: Entwurf, Veröffentlicht, Archiviert.
Die Inhaltselemente müssen je nach Status unterschiedlich behandelt werden. Wenn ich diese Statusdaten in der Datenbank mit den Werten 1, 2 bzw. 3 behalten würde, wie würde ich dann prüfen, ob sich etwas in Entwurf befindet Zustand?
if (content.State == 1)
oder
if (content.State == "Draft")
?Ich habe die Werte nur hart codiert!
Dasselbe gilt, wenn Sie eine Cache- / Hash-Tabelle verwenden: Sie müssen immer noch einen in Ihrem Code geschriebenen Wert als Schlüssel verwenden, um Ihre Daten nachzuschlagen.
Was sind die Nachteile des Hard-Coding-Ansatzes?
quelle
Ähnlich wie bei FrustratedWithFormsDesigner wird dies normalerweise mit einem Cache durchgeführt, da Sie die statischen Daten immer nur einmal laden müssen, sie jedoch dem OAOO-Muster folgen, dh, wir definieren die Daten nicht an zwei Stellen (Datenbank und in dein Code).
Ich weiß, dass der NHibernate ORM diese Funktionalität über einen 2nd Level Cache bietet . Sie können festlegen, dass Daten aus einer bestimmten Tabelle zwischengespeichert werden sollen und dass sie schreibgeschützt sind. Es wird das erste Mal geladen, wenn es benötigt wird. Danach wird die Datenbank nicht erneut aufgerufen, selbst wenn Sie von mehreren Sitzungen aus auf die Daten zugreifen.
quelle
IsDefaultOn...
) in eine Eigenschaft der Entität einfügen. Lassen Sie es für die eine Entität wahr zurückgeben. Auf diese Weise können Sie diese Entität in Anbetracht der gesamten Sammlung finden. Sie können auch eine Controller-Klasse verwenden, die der entsprechenden Entität einen Methodenaufruf bereitstellt.Dies ist im schlimmsten Fall eine vorzeitige Optimierung.
Erstens ruft jedes moderne DBMS blitzschnell Daten von kleinen Tabellen ab und alle verfügen über Caching-Algorithmen von gut bis hervorragend (je mehr Sie für das DBMS bezahlt haben, desto besser ist das Cachen!). Sie optimieren also etwas, das nur minimale Ressourcen verbraucht.
Zweitens haben Sie nur sehr wenig Erfahrung mit realen Geschäftsanwendungen, wenn Sie sich vorstellen, dass ein "Verkaufsbereich" statische Daten sind. Diese können sich mit jedem Wechsel des Marketing Director oder CEO ändern. Sie befinden sich also zwei Jahre später auf dem Weg in eine Welt der Schmerzen.
Hier gibt es nur zwei Möglichkeiten:
Speichern Sie es in einer Datenbank und greifen Sie mit "normalem" SQL auf die Daten zu.
Speichern Sie es in einer schicken XML-Konfigurationsdatei (möglicherweise über REST oder SOAP zugänglich), die bei jeder "strategischen Änderung der Richtlinie" einfach bearbeitet werden kann.
quelle
Es hängt davon ab, was Sie mit den Daten machen. Wenn es eine Liste von etwas ist, ziehe ich es normalerweise in ein Array. Wenn die Liste in einer anderen Version erweitert werden muss, können Sie sie einfach zur Datenbank hinzufügen und den Code ändern, um die zusätzlichen Daten im Array zu verarbeiten (was je nach Code möglicherweise nicht erforderlich ist, z. B. Auflisten der Daten mit einem for-Schleife unter Verwendung der oberen Grenze des Arrays). Wenn es sich um eine Liste von Einstellungen handelt, werde ich diese normalerweise hart codieren, da es normalerweise nicht viele gibt und dies einfacher und schneller ist als die Verwendung einer SQL-Anweisung. Wenn der Benutzer diese Einstellung ändern kann und ich die Auswahl für nachfolgende Starts speichern möchte, erstelle ich eine Tabelle, die als Registrierung verwendet wird, und rufe nach Bedarf einzelne Einträge zu Variablen auf.
quelle
Ich weiß, dass diese Antwort akzeptiert wurde, aber ich wollte mitteilen, wie wir dies in meinem letzten Webentwicklungs-Shop getan haben, in dem wir versucht haben, die Datenbank-E / A so weit wie möglich zu reduzieren.
Wir haben serverseitige Include-Dateien für so viele Datenstrukturen wie möglich verwendet. Dies war hauptsächlich für die Seitennavigation gedacht (einschließlich Unternavigation), wir haben es jedoch auch für so viele Dropdowns und Kontrollkästchen wie möglich verwendet (Bundesstaaten, Länder, Kategorien).
Ursprünglich haben wir all diese Daten aus der Datenbank gezogen. Da wir dem Kunden ein Administrations-Widget zur Verfügung gestellt haben, konnten sie diese Daten nach Belieben ändern, und wir wurden nie mit kleinen kleinen Änderungen konfrontiert. Meistens änderten sich diese Daten kaum, aber gelegentlich änderten sie sich.
Wir haben immer nach schnelleren Ladezeiten gesucht. Deshalb haben wir beschlossen, so viele statische serverseitige Textdateien wie möglich zu implementieren. Wir haben dies neben dem Admin-Widget getan. Bei jeder Aktualisierung einer Datenbanktabelle wurde die entsprechende statische Textdatei neu generiert. Dies gab uns ein sehr flexibles und schnelles Umfeld.
quelle
Meine Lösung hierfür, die möglicherweise nicht in allen Situationen funktioniert, besteht darin, die statischen Datenbankdaten an eine fest codierte zu binden
enum
. Da das Problem darin besteht, dass dynamische Daten (Datenbank) an statische Logik (Code) gebunden sind, machen Sie diese Bindung explizit (und locker), indem Sie eine Datenbanktabelle verwenden, die der zugeordnet istenum
. Ex:Schreiben Sie dann eine Benutzeroberfläche, mit der Sie die Liste der
LooseDBCodeBinding
Datensätze auf einfache Weise anzeigen undLooseDBCodeBinding
enum
Werte zuordnen können (einschließlich der Unterstützung von "defekten" Bindungen). Sie können dannenum
um den Tabellenschlüssel herum programmieren und die Datenbank entwerfen, und es ist nur diese eine Tabelle, die beide Kontexte kennt.quelle