Ich habe dies in der Vergangenheit auf zwei Arten getan - eine einzelne Zeilentabelle und eine Schlüssel / Wert-Paartabelle - und jeder Ansatz hat positive und negative Aspekte.
Einzelne Reihe
- positiv: Die Werte werden im richtigen Typ gespeichert
- positiv: es ist einfacher, mit Code umzugehen (aus den oben genannten Gründen)
- positiv: Standardwerte können für jede Einstellung einzeln angegeben werden
- negativ: Zum Hinzufügen einer neuen Einstellung ist eine Schemaänderung erforderlich
- negativ: Die Tabelle kann sehr breit werden, wenn viele Einstellungen vorhanden sind
Schlüssel / Wert-Paar
- positiv: Für das Hinzufügen neuer Einstellungen ist keine Schemaänderung erforderlich
- positiv: Das Tabellenschema ist eng, wobei zusätzliche Zeilen für neue Einstellungen verwendet werden
- negativ: Jede Einstellung hat den gleichen Standardwert (null / leer?)
- negativ: alles muss als Strings gespeichert werden (dh nvarchar)
- negativ: Wenn Sie sich mit den Einstellungen im Code befassen, müssen Sie wissen, um welchen Typ es sich bei einer Einstellung handelt, und sie umwandeln
Die Option für eine einzelne Zeile ist bei weitem die am einfachsten zu handhabende. Dies liegt daran, dass Sie jede Einstellung in der Datenbank in ihrem richtigen Typ speichern können und nicht die Typen der Einstellungen sowie deren Suchschlüssel im Code speichern müssen.
Eine Sache, mit der ich mich befasst habe, war die Verwendung mehrerer Zeilen in der "speziellen" Einzeilentabelle für einzelne Zeilen. Ich habe dies überwunden durch (in SQL Server):
- Hinzufügen einer neuen Bitspalte mit dem Standardwert 0
- Erstellen einer Prüfbedingung, um sicherzustellen, dass diese Spalte den Wert 0 hat
- Erstellen einer eindeutigen Einschränkung für die Bitspalte
Dies bedeutet, dass nur eine Zeile in der Tabelle vorhanden sein kann, da die Bitspalte den Wert 0 haben muss. Aufgrund der eindeutigen Einschränkung kann jedoch nur eine Zeile mit diesem Wert vorhanden sein.
Sie sollten (zumindest) eine Tabelle mit einer Spalte für den Informationstyp und den Informationswert erstellen. Auf diese Weise müssen Sie nicht jedes Mal neue Spalten erstellen, wenn neue Informationen hinzugefügt werden.
quelle
Eine einzelne Zeile funktioniert einwandfrei. es wird sogar starke Typen haben:
Ein Nachteil ist, dass eine Schemaänderung (
alter table
) erforderlich ist, um eine neue Einstellung hinzuzufügen. Eine Alternative ist das Normalisieren, bei dem Sie eine Tabelle wie die folgende erhalten:Dies hat schwache Typen (alles ist ein Varchar), aber das Hinzufügen einer neuen Einstellung bedeutet nur das Hinzufügen einer Zeile, was Sie nur mit Datenbank-Schreibzugriff tun können.
quelle
Persönlich würde ich es in einer einzigen Zeile speichern, wenn das funktioniert. Overkill, um es in einer SQL-Tabelle zu speichern? wahrscheinlich, aber es schadet nicht wirklich.
quelle
Wie Sie vermutet haben und mit Ausnahme der einfachsten Situationen, hat das Platzieren aller Konfigurationsparameter in einer einzelnen Zeile viele Nachteile. Es ist eine schlechte Idee ...
Eine bequeme Möglichkeit zum Speichern von Informationen zum Konfigurations- und / oder Benutzerpräferenztyp ist XML . Viele DBMS unterstützen den XML-Datentyp. Die XML-Syntax ermöglicht es Ihnen, die "Sprache" und Struktur zu verwenden, die die Konfiguration beschreibt, wenn sich diese Konfiguration weiterentwickelt. Ein Vorteil von XML ist die implizite Unterstützung der hierarchischen Struktur, die es beispielsweise ermöglicht, kleine Listen von Konfigurationsparametern zu speichern, ohne diese mit einem nummerierten Suffix benennen zu müssen. Ein möglicher Nachteil des XML-Formats besteht darin, dass das Suchen und allgemeine Ändern dieser Daten nicht so einfach ist wie bei anderen Ansätzen (nichts Kompliziertes, aber nicht so einfach / natürlich).
Wenn Sie näher am relationalen Modell bleiben möchten, benötigen Sie wahrscheinlich das Entity-Attribute-Value-Modell , wobei die einzelnen Werte in einer Tabelle gespeichert werden, die normalerweise wie folgt aussieht:
Wobei die AttributeId ein Fremdschlüssel für eine Tabelle ist, in der beispielsweise jedes mögliche Attribut (in Ihrem Fall "Konfigurationsparameter") definiert ist
Schließlich können Sie mit der EntityId eine Entität identifizieren, die diese verschiedenen Attribute "besitzt". In Ihrem Fall kann es sich um eine Benutzer-ID handeln oder nur um eine implizite, wenn Sie nur eine Konfiguration verwalten müssen.
Abgesehen davon, dass die Liste der möglichen Konfigurationsparameter mit der Entwicklung der Anwendung erweitert werden kann, platziert das EAV-Modell die "Metadaten", dh die Daten, die sich auf das Attribut selbst beziehen, in Datentabellen, wodurch die häufig verwendete harte Codierung von Spaltennamen vermieden wird wenn die Konfigurationsparameter in einer einzelnen Zeile gespeichert sind.
quelle
Sie müssen Ihr Schema sicherlich nicht ändern, wenn Sie einen neuen Konfigurationsparameter im normalisierten Ansatz hinzufügen, aber Sie ändern wahrscheinlich immer noch Ihren Code, um den neuen Wert zu verarbeiten.
Das Hinzufügen einer "Änderungstabelle" zu Ihrer Bereitstellung scheint kein so großer Kompromiss für die Einfachheit und Typensicherheit des Einzelzeilenansatzes zu sein.
quelle
Ein Schlüssel-Wert-Paar ähnelt einer .Net App.Config, in der Konfigurationseinstellungen gespeichert werden können.
Wenn Sie also den Wert abrufen möchten, können Sie Folgendes tun:
quelle
Ein üblicher Weg, dies zu tun, besteht darin, eine "Eigenschaften" -Tabelle zu haben, die einer Eigenschaftendatei entspricht. Hier können Sie alle Ihre App-Konstanten oder nicht so konstante Dinge speichern, die Sie nur benötigen.
Sie können die Informationen dann nach Bedarf aus dieser Tabelle abrufen. Wenn Sie feststellen, dass Sie eine andere Einstellung speichern müssen, können Sie diese hinzufügen. Hier ein Beispiel:
property_entry_table
Auf diese Weise können Sie die Daten speichern, die Sie haben, und die Daten, die Sie nächstes Jahr haben werden und von denen Sie noch nichts wissen :).
In diesem Beispiel können Ihr Gültigkeitsbereich und Ihre Referenz-ID für alles verwendet werden, was Sie im Back-End möchten. Wenn also propertyType "ADMIN" den Gültigkeitsbereich 0 refId 2 hat, wissen Sie, welche Präferenz dies ist.
Der Eigenschaftstyp kommt zum Tragen, wenn Sie eines Tages auch hier Informationen außerhalb des Administrators speichern müssen.
Beachten Sie, dass Sie Warenkorbdaten nicht auf diese Weise speichern oder nachschlagen sollten. Allerdings , wenn die Daten - System spezifisch, dann können Sie sicher diese Methode verwenden.
Beispiel: Wenn Sie Ihre DATABASE_VERSION speichern möchten, verwenden Sie eine solche Tabelle. Auf diese Weise können Sie beim Aktualisieren der App anhand der Eigenschaftentabelle feststellen, über welche Version Ihrer Software der Client verfügt.
Der Punkt ist, dass Sie dies nicht für Dinge verwenden möchten, die den Warenkorb betreffen. Halten Sie Ihre Geschäftslogik in genau definierten relationalen Tabellen. Die Eigenschaftentabelle dient nur zur Systeminfo.
quelle
Ich bin nicht sicher, ob eine einzelne Zeile die beste Implementierung für die Konfiguration ist. Möglicherweise ist es besser, eine Zeile pro Konfigurationselement mit zwei Spalten (configName, configValue) zu haben, obwohl hierfür alle Ihre Werte in Zeichenfolgen und zurück umgewandelt werden müssen.
Unabhängig davon schadet es nicht, eine einzelne Zeile für die globale Konfiguration zu verwenden. Die anderen Optionen zum Speichern in der Datenbank (globale Variablen) sind schlechter. Sie können dies steuern, indem Sie Ihre erste Konfigurationszeile einfügen und dann Einfügungen in der Tabelle deaktivieren, um mehrere Zeilen zu verhindern.
quelle
Sie können das Schlüssel / Wert-Paar ohne Konvertierungen durchführen, indem Sie für jeden Haupttyp eine Spalte und eine Spalte hinzufügen, in der angegeben ist, in welcher Spalte sich die Daten befinden.
Ihr Tisch würde also ungefähr so aussehen:
Es verbraucht etwas mehr Platz, aber Sie verwenden höchstens ein paar Dutzend Attribute. Sie können eine case-Anweisung aus dem Wert column_num verwenden, um das rechte Feld abzurufen / zu verbinden.
quelle
Tut mir leid, ich komme Jahre später. Aber was ich mache, ist einfach und effektiv. Ich erstelle einfach eine Tabelle mit drei () Spalten:
Bevor ich eine neue Konfigurationsspalte erstelle, aktualisiere oder lese, serialisiere ich den "Wert"! Auf diese Weise bin ich mir des Typs sicher (Naja, PHP ist :))
Zum Beispiel:
Ich hoffe das hilft :)
quelle
i:1988
Anscheinend versuchen Sie, zwei Informationen in einer einzigen Spalte zusammenzufassen.echo (int) $var
für eine ganze Zahl und andere für andere Typen zu tun ?Haben Sie eine Schlüsselspalte als varchar und eine Wertespalte als JSON.
1
ist numerisch, während"1"
es sich um eine Zeichenfolge handelt.true
undfalse
sind beide boolesch. Sie können auch Objekte haben.quelle