2010-03-23 13 views
23

Ich entwickle einen Formulargenerator, und frage mich, ob es schlecht mojo wäre, JSON in einer SQL-Datenbank zu speichern?Speichern von JSON in einer MsSQL-Datenbank?

Ich möchte, dass meine Datenbank & Tabellen einfach halten, so wollte ich

`pKey, formTitle, formJSON` 

auf einem Tisch haben, und dann speichern

{["firstName":{"required":"true","type":"text"},"lastName":{"required":"true","type":"text"}} 

in formJSON.

Jede Eingabe wird geschätzt.

Antwort

29

Ich benutze JSON ausgiebig in meinem CMS (das hostet etwa 110 Seiten) und ich finde die Geschwindigkeit der Zugangsdaten sehr schnell. Ich war überrascht, dass es keine Geschwindigkeitsverschlechterung mehr gab. Jedes Objekt im CMS (Seite, Layout, Liste, Thema usw.) hat eine NVARCHAR (MAX) -Spalte namens JSONConfiguration. Mein ORM-Tool kann nach dieser Spalte suchen und sie bei Bedarf als Objekt wiederherstellen. Oder, je nach Situation, werde ich es einfach an den Client übergeben, damit jQuery oder Ext JS verarbeitet werden kann.

Was die Lesbarkeit/Wartbarkeit meines Codes angeht, könnte man sagen, dass es verbessert wurde, weil ich jetzt Klassen habe, die viele der in der Datenbank gespeicherten JSON-Objekte repräsentieren.

Ich habe JSON.net für alle Serialisierung/Deserialisierung verwendet. http://james.newtonking.com/default.aspx

Ich verwende auch eine einzelne Abfrage, um Meta-JSON mit den tatsächlichen Daten zurückzugeben. Wie bei Ext JS habe ich Abfragen, die sowohl die Struktur des Ext JS-Objekts als auch die Daten zurückgeben, die das Objekt benötigt. Dies macht einen Post-Back/SQL-Umlauf aus.

Ich war auch überrascht, wie schnell der Code war, um eine Liste von JSON-Objekten zu analysieren und sie in ein DataTable-Objekt zuzuordnen, die ich dann an eine GridView übergeben.

Der einzige Nachteil, den ich mit JSON gesehen habe, ist Indexierung. Wenn Sie eine Eigenschaft des JSON suchen müssen, müssen Sie sie als separate Spalte speichern.

Es gibt JSON DB's, die Ihre Bedürfnisse besser erfüllen könnten: CouchDB, MongoDB und Cassandra.

3

Es wird langsamer als das Formular in Code definiert, aber eine zusätzliche Abfrage sollte nicht viel Schaden verursachen. (Lassen Sie nicht 1 zusätzliche Abfrage werden 10 zusätzliche Abfragen!)

Edit: Wenn Sie die Zeile von formTitle statt pKey (ich würde, weil dann Ihr Code wird lesbarer sein), setzen Sie einen Index auf formTitle

1

Ich würde es nicht empfehlen.

Wenn Sie in Zukunft Berichte oder Abfragen basierend auf diesen Werten erstellen möchten, wird Ihr Leben um einiges schwieriger als einige zusätzliche Tabellen/Spalten.

Warum meiden Sie neue Tabellen? Ich sage, wenn deine Anwendung es erfordert, mach weiter und füge sie hinzu ... Auch wenn jemand deinen Code/db später durchgehen muss, wird es wahrscheinlich schwieriger für sie herauszufinden, was du gerade gemacht hast (abhängig davon, was für eine Art von Dokumentation, die Sie haben).

+0

Wir viel Zeit auf benutzerdefinierte Formulare ausgeben, die im Allgemeinen die gleichen Informationen enthalten, die meisten dieser Informationen wird in nur 3-4 verschiedene Tabellen gespeichert. SO, wenn ich die Formen programmatisch erzeugen und sie in ihre passenden Tabellen einreichen könnte, würde es viel Entwicklungszeit in der Zukunft sparen. – JKirchartz

+0

Ich denke, in dieser Situation wird es wahrscheinlich gut gehen. Wie Michael sagt, es wird nur eine zusätzliche Abfrage sein. Ich dachte, du würdest versuchen, Werte zusammen mit der Struktur der Form zu speichern. –

7

Eine brillante Möglichkeit, um eine Objektdatenbank von SQL Server zu machen.Ich mache das für alle Konfigurationsobjekte und alles andere, was keine spezifische Abfrage benötigt. Erweitern Sie Ihr Objekt - einfach, erstellen Sie einfach eine neue Eigenschaft in Ihrer Klasse und init mit dem Standardwert. Brauchen Sie keine Immobilie mehr? Löschen Sie es einfach in der Klasse. Einfaches Ausrollen, einfaches Upgrade. Nicht für alle Objekte geeignet, aber wenn Sie eine Stütze extrahieren, müssen Sie sie indexieren - verwenden Sie sie weiterhin. Sehr moderne Art der Verwendung von SQL Server.

+18

Ich habe viele Gelegenheiten erlebt, in denen ich nach einer Lösung suche und mich hier zurechtfinde. Bei der Suche nach der Lösung finde ich manchmal anderswo eine bessere Antwort und vielleicht mit neueren Technologien als dem, was zu der Zeit beantwortet wurde. Es ist nicht nur Ihre Frage zu beantworten, sondern für alle, die in die gleiche Situation geraten wie Sie in der Zukunft. Und wie KOPEHb werde ich höflich genug sein, um zu aktualisieren oder sogar bessere Lösungen zu bieten, als beantwortet wurde. – Levitikon

2

Sie sollten SisoDb dafür verwenden können. http://sisodb.com

+0

Hat jemand eine Meinung nach der Verwendung von SisoDB? Es sieht vielversprechend aus, aber diese Art von Bibliothek kann wirklich getroffen werden, wenn sie in der Praxis verwendet wird ... –

+1

Hallo, ich bin voreingenommen, seit ich SisoDB gebaut habe, aber wir verwenden es in einem kommerziellen Produkt, das heute entwickelt wird. Es dient zur Pflege von Readmodels in einer CQRS-Umgebung. – Daniel

3

Wir haben eine modifizierte Version von XML für genau den Zweck verwendet, den Sie für sieben oder acht Jahre beschreiben, und es funktioniert großartig. Die Formularanforderungen unserer Kunden sind so unterschiedlich, dass wir niemals mit einem Tabellen/Spalten-Ansatz Schritt halten könnten. Wir sind zu weit unten auf dem XML-Weg, um sich sehr leicht zu ändern, aber ich denke JSON würde genauso gut funktionieren und vielleicht sogar besser.

Reporting ist kein Problem mit ein paar guten Parsing-Funktionen und ich würde jedem trotzen, einen signifikanten Leistungsunterschied zwischen unseren Reporting/Analytics und einer Tabellen-/Spaltenlösung für diesen Bedarf zu finden.

1

Ich denke, es ist keine optimale Idee, um Objektdaten in einer Zeichenfolge in SQL zu speichern. Sie müssen die Umwandlung außerhalb von SQL durchführen, um sie zu parsen. Das stellt ein Leistungsproblem dar, und Sie verlieren die Hebelwirkung der SQL-nativen Datenanalysefunktion. Ein besserer Weg wäre, JSON als XML-Datentyp in SQL zu speichern. Auf diese Weise können Sie zwei Fliegen mit einer Klappe schlagen: Sie müssen nicht eine Menge von Tabellen erstellen und trotzdem alle systemeigenen Abfragen von SQL nutzen.

XML in SQL Server 2005? Better than JSON in Varchar?