# Ablage von Benutzereinstellungen in einer DB



## Thomas Lorenz (16. Okt 2010)

Servus Gemeinde, 

bislang habe ich die persönlichen Einstellungen von Anwendern in einer Textdatei gespeichert.
Diese wurde zu Beginn in die Anwendung geladen, eigentlich das Übliche.

Jetzt soll das aber in eine Datenbank (hier verwende ich zur Zeit Derby).
Es handelt sich etwa um 400 Zeilen / pro User für diese persönlichen Einstellungen.

Die Anzahl der User ist zunächst nicht begrenzt, es könnten also auch gut 1500 werden. 
Es handelt sich um eine Firmenanwendung, der Teilnehmerkreis ist also begrenzt.
Derby wird auch nicht die letzte Schlussfolgerung sein.



Nun meine Frage : 
Sollte ich für jeden User eine Tabelle innerhalb meiner DB anlegen, oder
eine UserTabelle für alle Anwender, in der pro Spalte ein Feld vorhanden ist, welches die Benutzereinstellungen in binärer Form
aufbewahrt.

z.B. 

für die 1. Variante:

User1_Table

Property               Value
Background           green
showSplashScreen  false
..
.


für die 2.Variante

All_User_Table

Name             Properties

User1             userBinär1
User2             userBinär2
..
.

Vielleicht gibt es auch noch andere Varianten.
Bin auf Eure Vorschläge gespannt.


----------



## SlaterB (16. Okt 2010)

eine Tabelle für jeden User kommt nicht in Frage, wenn dann den User als zusätzliches Attribut:

User, Property, Value
Fritz, Background, green
Fritz, showSplashScreen, false
...
Oma, Background, blau
Oma, showSplashScreen, true
...

evtl. typsicherer:
User, Property, ValueBoolean, ValueInt, ValueText
Fritz, Background, false, 0, green
Fritz, showSplashScreen, false, 0, null
...
Oma, Background, false, 0, blau
Oma, showSplashScreen, true, 0, null

evtl. kann man die möglichen Property etwas strukturieren, 
in einer zweiten Tabelle die begrenzte Anzahl verschiedener Property vorgeben + Typ (boolean, int, Text) + optional oder Pflicht usw.,
dann aus der ersten Tabelle ein Fremdschlüssel auf Property,
die DB kann die Bedingungen aber kaum bis gar nicht nachprüfen, wenn es im Java-Programm schon entsprechende Strukturen gibt, dann kann das auch gut reichen

---
Alternative ist eine richtig breite Tabelle:

User, Background, showSplashScreen, .. 400 Attribute, nur schlecht erweiterbar
Fritz, green, false, ...
Oma, blau, true, ...

vielleicht mehrere mittelbreite für verschiedene Bereiche


----------



## Guybrush Threepwood (16. Okt 2010)

Wie wäre es, eine Tabelle anzulegen, die z. B. als Spalten lediglich eine ID, den Namen und dann ein Blob enthält, in das das User-Objekt serialisiert wird?


----------



## SlaterB (16. Okt 2010)

steht ja im ersten Post als eine der Varianten


----------



## Landei (16. Okt 2010)

Datenbanken entsprechend dem aktuellen SQL-2003 Standard besitzen auch einen XML-Datentyp, das wäre eine etwas strukturiertere Möglichkeit als ein Blob.


----------



## Thomas Lorenz (16. Okt 2010)

Slater's erste Variante gefällt mir am besten.
Sie ist ja eine Erweiterung eine meiner beiden Beispiele.

Das einzige Problem sehe ich vielleicht in der Datenmenge.
Es kommt nämlich noch etwas hinzu 

Es gibt die Möglichkeit bestimmte Begriffe als User selber und in nicht begrenzter Anzahl (realistisch sind aber max. 150)
anzulegen.
Ich gebe ein Beispiel : 
- Kuchen backen
- Eier rühren
- Sahne schlagen

so in dieser Richtung kann der User halt eigene Begriffe, die denselben Propertynamen (z.B. Tätigkeiten in der Küche)
tragen hinzufügen.
Aber eigentlich ist die Größe der Datenbank ja nur durch die Servergröße begrenzt, oder?


----------



## JohannisderKaeufer (16. Okt 2010)

Von der Datenstruktur, könnte ich mir auch gut vorstellen, daß eine NoSql-Datenbank das passende ist.

Hier denke ich an ein Dokumentenorientiertes System wie zum Beispiel CouchDB.

Pro User ein Dokument und darin dann Key-Value-Paare ablegen.

Ein Dokument könnte dann so aussehen:

```
{"_id":"Fritz",
"background":"green",
"splashscreen":"false",
"Tätigkeiten in der Küche":
    {
        "Kuchen":"Backen",
        "Eier":"Rühren"
    }
}
```

oder so, wenn man einzelne Dokumente für jedes Property nimmt.


```
{"_id":"123zufallszahlen",
"user":"Fritz", 
"background":"green"
}
{"_id":"456zufallszahlen",
"user":"Fritz", 
"splashscreen":"false"
}
{"_id":"789zufallszahlen",
"user":"Fritz", 
"Tätigkeiten in der Küche":
    {
        "Kuchen":"Backen",
        "Eier":"Rühren"
    }
}
```

oder so


```
{"_id":"123zufallszahlen",
"user":"Fritz", 
"key":"background",
"value":"green"
}
{"_id":"456zufallszahlen",
"user":"Fritz", 
"key":"splashscreen",
"value":"false"
}
{"_id":"789zufallszahlen",
"user":"Fritz", 
"key":"Tätigkeiten in der Küche",
"value": {
        "Kuchen":"Backen",
        "Eier":"Rühren"
    }
}
```

Um ein Ergebnis zu erhalten wird das ganze dann mit einer Map-Funktion aggregiert. Und um auf die Ergebnisse zuzugreifen wird JSON verwendet wofür es diverse Implementierungen gibt.

Oder man nutzt einen reinen Key-Value-Store. Mit denen habe ich allerdings noch nicht gearbeitet.


----------



## Thomas Lorenz (18. Okt 2010)

Danke für Eure Antworten. 
Das ist hier ein prima Forum.


----------

