2016-07-10 7 views
0

Hier ist die Art von Daten, mit denen ich arbeite: Es gibt Benutzerdaten wie E-Mail-ID, Alter etc:Relational Database Design für wiederholte Daten in wenigen Spalten

Und es gibt Daten App spezifische Einstellungen (Opazität, Geschwindigkeit , Lautstärke usw.), für die es Standardwerte gibt, aber der Benutzer kann die Standardeinstellungen ändern und die App an seine Bedürfnisse anpassen.

Ich möchte die Option haben, die Standardwerte für vorhandene Benutzer zu ändern, ohne für die Benutzertabelle pro Benutzer einzeln ändern zu müssen.

Was wäre ein guter Ansatz zu nehmen?

  1. Sollte ich alle Daten in einer Tabelle zusammen mit einer Konfigurationsdatei mit den Standardwerten und einem Flag namens default_settings (ja/nein) haben.
Table: USERS 

user_data_1|user_data_2| ... |setting_1|setting_2| ... |default_settings 
  1. Oder sollte ich in einer Tabelle, die alle Benutzerdaten haben und verknüpfen es mit einem entsprechenden Einstellungsdaten auf einer anderen Tabelle mit der ersten Reihe von Einstellungen Tabelle mit Standardwerten. Es gibt keine Kategorisierung von Einstellungen. Entweder ist es die Standardeinstellungen oder eine Reihe von benutzerdefinierten Werte
Table: USERS 

user_data_1|user_data_2| ... |setting_id 

Table: SETTINGS 

setting_id|setting_1|setting_2| ... 

Danke.

+0

Nr. Und Nr. Siehe Normalisierung. – Strawberry

Antwort

1

Ihr erstes Design ist relationaler. Jede Einstellung gehört in eine eigene Spalte mit dem entsprechenden Spaltennamen, Datentyp und einer DEFAULT. Es gibt keine Notwendigkeit für eine letzte Spalte default_settings meiner Meinung nach. Jede Spalte hat entweder den Wert DEFAULT oder einen anderen Wert als den Standardwert.

Dieses Design hat jedoch den Nachteil, dass Sie jederzeit, wenn Sie eine neue Einstellung vornehmen müssen, ALTER TABLE verwenden müssen, um eine neue Spalte hinzuzufügen. Und es gibt eine praktische Grenze für die Anzahl der Spalten in einer Tabelle. Möglicherweise gibt es mehrwertige Einstellungen, die in einer einzelnen Spalte schwer zu modellieren sind.

Meistens, was ich für Benutzereinstellungen sehe, ist eine zweite Tabelle, die auf die erste verweist. Jeder Benutzer verfügt über viele Zeilen in der zweiten Tabelle, eine Zeile pro Einstellung:

Table USERS 
user_data_1|user_data_2| ... 

Table SETTINGS 
user_id|setting_name|setting_value 

Dieser Entwurf ist für eine unbegrenzte Anzahl von neuen Einstellungen kann pro Benutzer aktiviert werden, indem einfach eine neue Zeile einzufügen, ohne ALTER TABLE neu hinzufügen Säulen.

Die Standardwerte werden im Anwendungscode beibehalten. Das bedeutet, dass der Anwendungscode für jede Einstellung einen angemessenen Standardwert annimmt, wenn er in der Datenbank für einen bestimmten Benutzer nicht vorhanden ist.

Diese Einstellungen Tabelle ist im Grunde ein „Schlüsselwert“ zu speichern, die unterschiedlichen Probleme:

  • Jede Einstellung Name redundant gespeichert ist, in einer Reihe statt als Spaltenüberschrift. Die Schreibweise des Einstellungsnamens kann inkonsistent werden, z. "Farbe" vs. "Farbe".
  • Sie müssen einen Datentyp für den Einstellungswert auswählen, der jede Einstellung unterstützt, sodass Sie die Unterstützung von SQL für die Durchsetzung von numerischen oder Datumsformaten verlieren. I.e. alles wird zu einer Schnur.
  • Sie verlieren die Möglichkeit, DEFAULT in der Spaltendefinition zu speichern.
  • Sie verlieren die Möglichkeit, SQL-Einschränkungen wie NOT NULL, UNIQUE oder FOREIGN KEY zu verwenden.

Dennoch ist dieses Muster immer noch sehr beliebt für dieses Szenario.

+0

danke. Die Probleme, die für den "Schlüsselwert" -Shop erwähnt werden, scheinen vom Entwickler besondere Vorsicht zu erfordern und sind anfälliger für ungültige Einträge, die der Datenbank hinzugefügt werden, wenn der Entwickler nicht vorsichtig ist. Wenn man bedenkt, dass Teammitglieder sich ständig ändern, hätte ich lieber SQL-Einschränkungen. Der Grund dafür, eine ** default_settings ** (BOOLEAN) -Spalte in Kombination mit einer Konfigurationsdatei zu haben, ist so, dass wenn die Standardeinstellung geändert werden muss, diese einfach in der Konfigurationsdatei geändert werden kann Einstellungen für die Benutzer, für die ** default_settings ** wahr ist. Ihre Ansichten? –

+0

Das Ändern von Standardeinstellungen in der Konfiguration ist ein guter Grund, dies zu tun, aber ich würde es vorziehen, NULL in jeder der Einstellungsspalten zu verwenden, um "Standard verwenden" zu bezeichnen. Auf diese Weise können Sie festlegen, dass der Benutzer den Standardwert für die einzelnen Einstellungen festlegen kann. –

+0

Guter Punkt! Ich hätte nie gedacht, dass ich "default" pro Einstellung verwenden könnte. Wird diesen Ansatz übernehmen. Danke für all deine Vorschläge. –

0

Basierend auf @ BillKarwins Vorschlag. Ich habe beschlossen zu gehen mit Option 1.

Table: USERS 

user_data_1|user_data_2| ... |setting_1|setting_2| ... 

Die Standardwerte in der Spalte Einstellungen bedeuten würde NULL, dass diese Einstellungen aus der Konfigurationsdatei gelesen werden müssen. Wenn der Benutzer die Einstellung anpasst, wird NULL durch den benutzerdefinierten Wert ersetzt. Dies ermöglicht es, die Standardwerte an einer Stelle für alle Benutzer pro Einstellung zu ändern.