2009-02-28 12 views
5

Ich bin auf der Suche nach einer Tabelle für Benutzereinstellungen und kann nicht die beste Möglichkeit, es zu tun. Die Art und Weise, in der ASP.NET dies standardmäßig tut, erscheint äußerst peinlich und möchte dies vermeiden. Derzeit verwende ich eine Zeile pro Benutzer, wobei ich für jede Benutzereinstellung eine andere Spalte habe (nicht normalisiert, weiß ich)."Benutzereinstellungen" Datenbank Tabelle Design

Also, die andere Idee, die ich hatte, war, die Einstellungen selbst in ihre eigene Tabelle aufzuteilen, und dann eine Zeile PER Präferenz PER Benutzer in einer Benutzervoreinstellungstabelle zu haben; dies würde jedoch bedeuten, dass jede Präferenz genau der gleiche Datentyp sein müsste, der für mich auch nicht besonders ansprechend klingt.

Meine Frage ist also: Was ist der beste/logischste Weg, eine Datenbank so zu entwerfen, dass sie Benutzerpräferenzwerte enthält?

Antwort

3

Einige der Ideen, die ich bei der Datenbankarbeit vermeiden möchte, sind Datenduplizierung und unnötige Komplikationen. Sie möchten auch "insert, update, and deletion anomalies" vermeiden. Nachdem das gesagt ist, werden Benutzereinstellungen in einer Tabelle gespeichert, wobei jede Zeile = ein Benutzer und die Spalten, die verschiedenen verfügbaren Präferenzen, sinnvoll sind.

Wenn Sie nun sehen, dass diese Einstellungen in einer anderen Form oder in Ihrer Datenbank verwendet werden, wie mehrere Objekte (nicht nur Benutzer), die die gleichen Einstellungen verwenden, sollten Sie Ihre zweite Route und die Referenz verwenden Präferenzen mit FK/PK-Paaren.

Was Sie beschrieben haben, sehe ich keinen Grund, warum die erste Route nicht funktioniert.

2

ich tue dies in der Regel:

Users table (user_id, .... etc.) 
. 
Options table (option_id, data_type, ... etc.) 
(list of things that can be set by user) 
. 
Preferences table (user_id, option_id, setting) 

Ich verwende den neuen SqlVariant Datentyp für das Einstellungsfeld, so dass es unterschiedliche Datentypen sein kann und den Datentyp der Option als Teil der Option Definition in der Aufnahme Options-Tabelle, um sie bei der Abfrage zurück an den richtigen Typ zu übertragen.

+0

Also, in diesem Fall, was wäre data_type? Hätten Sie eine andere Tabelle, die alle Datentypen enthält, also ist dies ein FK? – NSX

+0

data_type könnte eine Zeichenfolge wie "dezimal (4,2)" oder nur eine Zahl sein, die Sie mit einer Enumeration in Ihrer App definieren ... nur damit Ihre App bestimmen kann, wie das Ergebnis in einen gemeinsamen Datentyp umgewandelt wird. –

+0

Nun, es muss keine Zeichenfolge sein. Sie könnten eine Gruppe gültiger Datentypen definieren und eine Tabelle Typ erstellen. Das wäre meiner Lösung ähnlich. – BobbyShaftoe

0

Echt schnell, eine Methode:

User(UserID, UserName, ...) 

PreferenceDataType(PreferenceDataTypeID, PreferenceDataTypeName) 

PreferenceDataValue(PreferenceDataValueID, PreferenceDataTypeID, IntValue, VarcharValue, BitValue, ...) 

Preference(PreferenceID, PreferenceDataTypeID, PreferenceName, ...) 

UserHasPreference(UserID, PreferenceID, PreferenceDataValueID) 
+0

@GregD, danke. :) – BobbyShaftoe

2

Wenn Sie alle Ihre Benutzereinstellungen in einer einzelnen Zeile eines User-Tabelle haben Sie eine Wartung Alptraum!

Verwenden Sie eine Zeile pro Voreinstellung und pro Benutzer und speichern Sie den Präferenzwert als Varchar (Länge 255 oder ein Wert, der groß genug ist, um Ihre Anforderungen zu erfüllen). Sie müssen die Werte in/aus dieser Spalte offensichtlich konvertieren.

Die einzige Situation, in der dies nicht funktioniert leicht ist, wenn Sie einige große binäre Daten als Benutzerpräferenz speichern möchten, aber ich habe nicht gefunden, dass eine gemeinsame Anforderung sein.

+0

Allerdings klingt es so, als würde man mit einer Zeile pro Voreinstellung pro Benutzer ein EAV-Modell erstellen, das ich immer gelesen habe, sollte um jeden Preis vermieden werden. – NSX