2011-01-01 5 views
0

Ich benutze Server Side JavaScript - ja, ich benutze tatsächlich Server Side JavaScript. Um die Dinge noch komplexer zu machen, verwende ich Oracle als Backend-Datenbank (10g). Mit etwas verrückter XSLT- und mutantenähnlicher HTML-Generierung kann ich wirklich ausgefallene Webformulare erstellen - ja, ich kenne Rails und andere gleichermaßen Frameworks und wähle stattdessen den Weg des Horrors. Ich habe kein JQuery oder anderes fantastisches Framework zur Verfügung, einfach JavaScript, das von der zugrunde liegenden Engine namens Mozilla Rhino unterstützt werden sollte. Ja, es ist verrückt und ich liebe es.Benutzereinstellungen mit SQL und JavaScript

Also, ich habe eine Reihe von Tabellen zur Verfügung und einige von ihnen sind mit assoziativen Schlüsseln gefüllt, die auf Werte verweisen. Da ich ein Publikumsliebling bin, möchte ich einige raffinierte, benutzerfreundliche Lösungen hinzufügen.

Meine Benutzer haben alle eine eindeutige Benutzer-ID und diese Benutzer-ID ist während der gesamten Sitzung verfügbar.

Meine erste Idee ist eine Benutzerpräferenztabelle, wo ich "drei" Spalten habe: user_id, feature und pref_string. Mit einem Delimiter, wie: oder - (habe noch nicht über einen geeigneten nachgedacht), könnte ich einige Voreinstellungen als Liste speichern und seine Elemente in einem Array mit der .split-Methode speichern (ähnlich wie PHP) -explodierende Funktion). Die Feature-Spalte könnte wie der Tabellenname oder eine Kennung für das "Feature" sein, das ich auch mit Präferenzen verknüpfen möchte. Ich hasse Hardcoding-Objekte, vor allem, weil ich in der Lage sein möchte, diese zu sichern und diese Funktionalität anwendungsweit wiederzuverwenden. Natürlich würde ich bessere Ideen lieben, denken Sie daran, dass ich nicht einfach eine Bibliothek hinzufügen kann.

Diese Einstellungen könnten wie "verbunden" mit der Tabelle sein, so dass ich sie abfragen und ihre Werte verwenden kann.

Ich hoffe es klingt nicht zu komplex, denn naja .. es ist im Grunde etwas wirklich einfaches, was ich brauche.

Danke!

EDIT

Lets sagen, dass ich ein Dropdown-Feld ausfüllen möchten, die derzeit 10 dynamische Werte aufweist. Ich würde diese aus der Datenbank unter Verwendung einer einfachen SELECT-Anweisung erhalten:

SELECT pet, value FROM pets 

Es eine Tabelle wie folgt zurückkehren würde:

dog 1 
cat 2 
fish 3 

Ich würde dieses Feld in einem Drop-Down eingeben. Wenn ich jedoch möchte, dass Präferenzen zu dieser Tabelle hinzugefügt werden, würde wie Benutzer_ID 100 nur Säugetiere (Hund, Katze) und Benutzer_ID 200 nur Meeresbewohner (Fisch) sehen. Stellen Sie sich nun vor, dass der Tisch alle Kreaturen der Welt hat und ich viele Tische habe, die solche Vorlieben erfordern.

Da ich unbegrenzte Benutzer haben kann, müsste ich irgendeine Form von Metadaten anwenden. Lösungen, um dies zu tun, ist was ich suche.

+0

Ihre Präferenztabelle sollte auch eine Art "Präferenztyp" -Spalte haben. Einige Einstellungen sind einfache boolesche Werte, andere können Datumsangaben oder ganze Zahlen oder Zeichenfolgen sein. Möglicherweise möchten Sie auch andere Indikatoren hinzufügen, damit die Benutzeroberfläche der Voreinstellungen etwas automatisiert werden kann - es wäre ein Wartungsproblem für jede neue Einstellung, eine eigene UI-Codierung zu benötigen. – Pointy

+0

Oh, es ist auch nicht klar, worum du hier bittest. Ist mit Ihrer aktuellen Lösung etwas nicht in Ordnung? – Pointy

+0

Ich weiß, dass Präferenzen nicht leicht genommen werden sollten. Aber ich habe eher einen Anfang in einem Modell, das zumindest einige "Vorlieben" haben könnte; wie Anfangswerte oder sichtbare Gegenstände. Die letzteren könnten nur boolesche Typen verwenden. – Shyam

Antwort

2

Das klingt wie es nichts mit Server-Side JavaScript zu tun (was ich tun nicht denken eine verrückte Wahl ist) oder Ihr Mangel an einem Rahmen (die ich glaube ich ein wenig verrückt ist).Das ist das Design von Datenbanken und Tabellen.

Wie Sie eine Liste von Werten aus einer Tabelle kategorisieren, hängt von den Umständen ab. Zum Beispiel haben Sie möglicherweise eine PETS-Tabelle, die die Daten wie beschrieben enthält. Dann haben Sie möglicherweise eine Tabelle PET_ATTRIBUTE_LIST, die Daten haben könnte, die PETS besitzen könnte. Schließlich könnten Sie eine Tabelle PET_ATTRIBUTE haben, die diese beiden verbindet. Auf diese Weise sind die Attribute (Fische, Säugetiere, Wirbeltiere usw.) in einem Tisch, die Haustiere (Hund, Katze, Beta usw.) in einem anderen, und dann kann ein beliebiger Satz von Attributen mit einem Haustier verknüpft werden.

Für den Fall, dass Benutzer nur die Optionen sehen, die für sie wichtig sind, hätten Sie eine USER_PET_ATTRIBUTE-Tabelle, die Datensätze zwischen Ihrer Tabelle mit Benutzern und Ihrer PET_ATTRIBUTE_LIST-Tabelle verknüpft.

Es gibt viele Viele-zu-Viele-Beziehungen, die diese Methode verwenden, aber es ist wahrscheinlich die flexibelste.

+0

Sicher, ich stimme zu. Die Daten aus der Datenbank werden jedoch in JavaScript-Variablen geladen. Ich könnte eine Ansicht generieren, um ein Ergebnis speziell für diesen Benutzer zu erhalten. Haben Sie Referenzmaterial für solche Attributlisten (Beispiele, Best Practices)? – Shyam

+0

Richtig, Sie möchten das Daten-Heavy-Weighting auf der Datenbank/Backend-Seite durchführen. Sie können Ansichten oder gespeicherte Prozeduren ausführen, die die Filterung durchführen, bevor die Daten an das Frontend gesendet werden. Was immer Sie bevorzugen, wirklich, aber ich mag es, Dinge in Paketen/Prozeduren/Funktionen mit Ref-Cursor zu halten. –

0

Ich denke, dass Sie Ihren Punkt "nicht mit einem Framework" überdenken sollten. Helma/Ringo ist ein ausgereiftes und produktionsfertiges serverseitiges JavaScript-Framework auf Rhino-Basis. Eine Abstraktionsschicht ordnet JavaScript-Objekte einer relationalen Datenbank (jdbc connected) zu und bietet bereits einfache Methoden für Benutzerobjekte und Präferenzen.

+0

Ich überlege, einige Konzepte zu verstehen, bevor ich ein Framework hinzufüge. Ich liebe Abstraktion; aber ich liebe auch die hässlichen Teile. Ich lerne durch Übung, ich entdecke, wenn ich versage. Also, ein Framework einfach für die Leichtigkeit zu verwenden, würde mein Problem technisch lösen. Es würde meinen Hunger jedoch nicht befriedigen. – Shyam