2009-07-03 3 views
1

Würdest du es als schlechte Praxis betrachten, verschiedene Benutzerdaten in einer Datenbank als serialisierte Binärdatei zu speichern? Ist es eine gute, schlechte oder wirklich hässliche Idee?C#, SQL: Speichern beliebiger Benutzerdaten in einer Datenbank als serialisierte Binärdatei

Ich spreche über ziemlich willkürliche Dinge, wie die letzte Splitterentfernung auf einem Formular, den letzten Wert in einem Suchtextfeld, zuvor ausgewählte Checkbox-Indizes und so weiter. Dinge, die in Erinnerung bleiben sollten, sind nicht kritisch, wenn sie vergessen werden.

Ich mag es irgendwie, da ich dann nur eine Tabelle mit zB vier Spalten brauche: userid, source, key und value. Und wenn ich eine nette Wrapper-Klasse zum Speichern und Laden von Werten in diese Tabelle erzeuge, könnten die Dinge ziemlich gut funktionieren. Zum Beispiel würde ich die Datenbank nicht immer reparieren müssen, wenn eine neue Art von Einstellung ins Spiel kommt.

Es würde natürlich nicht mit Suchen und Ordnen und solchen Dingen funktionieren, aber das wäre sowieso nicht nötig, da Sie nur direkt von ihrem Index (Benutzer-ID + Quelle + Schlüssel) auf diese Schlüsselwertpaare zugreifen würden. Die Spalten wären auch nicht für Menschen lesbar, aber das wäre auch nicht wirklich ein Problem. Die Daten wären Daten, die ohne große Probleme gelöscht werden könnten.

Irgendwelche Rückmeldungen zu dieser Idee? Ist es ein schrecklicher? Ist es ein guter? Hast du etwas ähnliches gemacht?

Antwort

3

Da Sie nicht suchen, wäre es keine schlechte Idee - es ist ein undurchsichtiger Container für verschiedene Benutzerdaten, und wie Sie sagten, enthält es keine kritischen Informationen. Und Sie haben Recht, Sie müssen die Datenbank nicht ändern, um eine neue Konfiguration von Einstellungen zu unterstützen.

0

Ich habe gerade daran erinnert, dass ich über die ASP.NET 2.0 Profile API gelesen habe.

Lassen Sie mich aus der MSDN zitieren

Die ASP.NET-Profilfunktion assoziierten Informationen mit einem einzelnen Benutzer und speichert die Informationen in einem persistenten Format. Mithilfe von Profilen können Sie Benutzerinformationen verwalten, ohne dass Sie eine eigene Datenbank erstellen und verwalten müssen. Darüber hinaus stellt die ASP.NET-Profilfunktion die Benutzerinformationen mithilfe einer stark typisierten API zur Verfügung, auf die Sie von überall in Ihrer Anwendung aus zugreifen können.

Sie können Objekte aller Art mithilfe von Profilen speichern. Die Profilfunktion bietet eine generische Speicherfunktion, mit der Sie fast alle Arten von Daten definieren und verwalten können, während die Daten immer noch typsicher bereitgestellt werden.

Grüße,

hadi teo

+0

Gibt es etwas Ähnliches für normale C# -Anwendungen? – Svish

+0

@Swish, Leider wird dies nur auf ASP.NET Web Apps angewendet. Es tut uns leid. –

3

Ich benutze diese die ganze Zeit, weil unsere Objekte pro Client/Installation sehr angepasst sind. Auf diese Weise kann ich hinzufügen & Eigenschaften entfernen, ohne die Datenbank zu aktualisieren.

Ich brauche etwa 200-300 Eigenschaften pro Zeile. Ich habe festgestellt, dass dieser Ansatz mir eine gute Flexibilität gibt.

Ich schließe immer Versionsnummer in meine Binärstruktur ein. Ich weiß also, welche Daten ich daraus abrufen kann.

Auf einigen Unterobjekt ich auch den Typname, so dass ich Objekte aus einem Vererbungsbaum speichern können. (Ich hoffe du verstehst was ich meine).

+0

Wie verwenden Sie die Versionsdaten? In meinem Fall würde ich einfach auf einen Standardwert zurückfallen und den alten Wert überschreiben, wenn Unvereinbarkeiten auftreten würden. – Svish

+0

+1 für Version und Typname. Ohne es wird es schwierig, alte Daten sicher zu deserialisieren –

+0

@Svish, mache ich das gleiche, wenn die Daten nicht vorhanden sind, nehme ich einen Standardwert. – GvS

1

Es wäre besser, wenn Sie für XML-Serialisierung und nicht binäre Serialisierung gehen. Wie im ersten Fall müssen Sie nicht besonders auf Rückwärtskompatibilität achten, da sich Ihre Klasse im Laufe der Zeit weiterentwickelt.

0

Ich wollte nur in einer konträren Stimme zur Diskussion hinzuzufügen:

Indem in serialisierte Objekte, Sie Sicht auf die Daten (natürlich) zu verlieren, aber Sie es auch plattformabhängig machen. Indem Daten in relationalen Tabellen gespeichert werden, können Daten jetzt von jedem beliebigen Client gelesen werden. Wenn Sie sich entscheiden, in Zukunft zu ändern (oder auch nur einen anderen hinzuzufügen), verlieren Sie die Möglichkeit, dieselben Daten wiederzuverwenden. Halten Sie den Client und die Daten getrennt.