Die Speicherung von verschachtelten Hashes in PostgreSQL mit Rails 4 (und Hstore)
Ich habe eine Rails-app, die aggregiert eine Menge von Daten aus Google-APIs. Ich Speichere die JSON Antworten in MongoDB derzeit (so meine Rails-app hat sowohl pg und mongo). Heute jedoch, habe ich stieß PostgreSQL Hstore-Erweiterung, und ich habe beschlossen, es zu versuchen.
Leider habe ich lief in ein problem. JSON gegeben, die von API ' s ist, die mehrere Ebenen tief ist, so Ruby-Hash nach JSON.parse
enthält hashes, welche die neuen hashes. Allerdings Hstore
ist string key/value-store, und es geht nur 1 Ebene tief. So hashes innerhalb der ersten hash-nur strings.
Wirklich bösen hack fand ich zu tun ist, um eval
die hashes, die gedreht wurden, in strings:
eval("{ "foo" => "bar" }")
Ich nicht, wie diese. Irgendwelche Tipps, was zu tun ist? Sollte ich mit MongoDB oder gibt es eine bessere Möglichkeit zum speichern von multi-level-Tiefe hashes in PG?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie versuchen, mithilfe von JSON-Erweiterung für Postgresql. Es wird genau das tun, was Sie wollen: validieren und speichern von JSON. Ursprünglich JSON-Erweiterung wurde Hinzugefügt, 9.2. Postgres 9.3 Hinzugefügt mehr Funktionen für JSON-Erweiterung inklusive neuer Operatoren und Funktionen. Und postgres 9.4 erweiterte Indizierung Unterstützung für JSON, so dass Sie zukunftsorientiert mit diesem setup.
Weiterführende links:
http://www.postgresql.org/docs/9.3/static/functions-json.html
http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3#JSON:_Additional_functionality
Verschachtelte Hstore ist ein Juwel, das verschachtelte hashes (und arrays und andere Arten) in hstores, erzielen so etwas ähnliches wie ein Dokument speichern, wie MongoDB. Es verwendet eine hybride hstore und JSON-Serialisierung. Es wurde noch nicht getestet auf Rails 4, obwohl.
Als Dokumentation der Hstore-Staaten, Schlüssel und Werte in Hstore sind einfach nur text-strings. Hstore nicht speichern kann multi-level-json-Objekte, noch ist es bedeutete, für diesen Zweck.
So, um es einfach, Sie können nicht das ersetzen, MongoDb mit PostgreSQL einfach mit Hstore. Stattdessen müssen Sie zum erstellen von Tabellen für jede Art von Objekten, wie in jeder anderen relationalen Datenbanken. Falls das schema Objekte sind sehr dynamisch, es wäre besser, um mit MongoDB.
Als ein Nachtrag zu der Frage, es scheint, dass der Postgresql 9.4 hat ein paar tolle goodies zu bieten:
Quelle
Verwenden die json-Datentyp zum speichern von json, nicht hstore.
Wenn Euch das nicht interessiert, in der Sie Ihre multi-level-json in Objekte, die gespeichert werden können in postgres, packen Sie alles in eine
text
Feld in postgres und serialisieren/Deserialisieren aus einer json-Zeichenfolge wenn Sie auf der Suche für eine multi-level-Schlüssel/Wert-Speicher außerhalb von mongo.Wie bereits erwähnt, Hstore nicht tun, was Sie wollen.
serialize
Modell Helfer, verwendet es:text
db-Feld, aber konvertiert von-Ruby-Hash in text um und Umgekehrt automatisch.