Frage

Ich muss eine PostgreSQL-Datenbank verwenden und diese wird meine derzeitige Verwendung von berkeleyDB ersetzen.Obwohl;Mir ist klar, dass dies keine ideale Situation ist, sie liegt außerhalb meiner Kontrolle.

Die Frage ist also...Wenn Sie PostgreSQL in einen Schlüsselwertspeicher umwandeln müssten, wie würden Sie dabei vorgehen und es gleichzeitig so effizient wie möglich gestalten?

Meine Werte sind Byte-Arrays und meine Schlüssel sind Zeichenfolgen. Ich könnte die Länge dieser Zeichenfolgen einschränken.

Ich gehe davon aus, dass ich einen Blob für meinen Wert und eine Primärschlüsselspalte verwenden sollte, die den Schlüssel enthält, aber da ich mich gerade erst auf diese Reise begebe, bin ich neugierig, ob jemand in der Stack-Overflow-Community dies getan hat oder ob es bestimmte „Fallstricke“ gibt. Ich sollte aufpassen.

War es hilfreich?

Lösung

Die Erweiterung in PostgreSQL, um dies ordnungsgemäß zu tun, heißt HSTore. Es funktioniert auf ähnliche Weise, wie Sie es mit anderen Schlüsselwert-Store-Systemen erwarten würden. Laden Sie einfach die Erweiterung. Die Syntax ist einzigartig, aber wenn Sie jemals Redis oder Mongo verwendet haben, erhalten Sie es schnell. Mach es nicht schwieriger als es ist. Ich verstehe, wir können oft nicht unsere Werkzeuge auswählen und müssen dies machen.
Hier ist die Dokumentseite:

http://www.postgresql.org/docs/9.1/static/hstore.html

Andere Tipps

Wenn Sie gezwungen sind, relationale Datenbanken zu verwenden, würde ich Ihnen empfehlen, zu versuchen, eine Struktur in Ihren Daten zu finden, um diese Tatsache auszunutzen, da Sie auf den Geschwindigkeitsvorteil verzichten, den Sie mit unstrukturierten Daten und dem Schlüsselwertspeicher haben.Je mehr Struktur Sie finden, desto besser können Sie aus Ihrer misslichen Lage herauskommen.Auch wenn Struktur nur in den Tasten zu finden ist.

Überlegen Sie auch, ob Sie nur sequentiellen oder wahlfreien Zugriff auf Ihre Daten benötigen und in welchem ​​Verhältnis und strukturieren Sie Ihre Datenbank entsprechend dieser Anforderung.Werden Sie Ihre Werte beispielsweise nach Typ abfragen?Jede dieser Fragen könnte Auswirkungen darauf haben, wie Sie Ihre Datenbank strukturieren.

Eine besondere Überlegung zu Blobs in Postgresql: Sie werden intern als pg_largetable (loid:oid,pageno:int4,data:bytea) dargestellt.Die Größe der Blöcke wird durch LOBBLKSIZE definiert, beträgt jedoch normalerweise 2 KB.Wenn Sie also Byte-Arrays in Ihrer Tabelle anstelle von Blobs verwenden und die Größe Ihres Wert-/Schlüsselpaars unter „Blockgröße“ begrenzen können, können Sie diese Umleitung durch die zweite Tabelle vermeiden.Sie können die Blockgröße auch erhöhen, wenn Sie Zugriff auf die Konfiguration der Datenbank haben.

Ich würde vorschlagen, nach Strukturen in den Daten und Mustern beim Datenzugriff zu suchen und Ihre Frage dann noch einmal detaillierter zu stellen.

Es sollte wirklich davon abhängen, was der Schlüssel sein wird. Wenn es sich immer um eine Zeichenfolge unter 255 Zeichen handelt, verwenden Sie einen Varchar als Yoru PK und verwenden Sie dann einen Blob (unter der Annahme eines großen Werts) für den Wert. Wenn es sich immer um eine Nummer handelt, verwenden Sie INT usw.

Mit anderen Worten, brauchen Sie weitere Informationen, um Ihnen wirklich eine gute Antwort zu geben :)

Was müssen Sie als Wert speichern? Saiten? INTs? Objekte (z. B. serialisierte Java -Objekte). Eine einfache Implementierung würde mit einer 3 -Spalten -Tabelle funktionieren, die wie folgt aussieht:

NAME(VARCHAR)   TYPE(VARCHAR)   VALUE(VARCHAR)

(Vielleicht ist der Typ eine Aufzählung). Das obige würde jedoch nicht für binäre Daten wie serialisierte Objekte funktionieren, und vielleicht brauchen Sie dort einen Blob.

Alternativ (und wahrscheinlich a viel Bessere Idee), hast du gesehen Apache Commons -Konfiguration ? Sie können diese mit einer Datenbank (über JDBC) unterstützen und Eigenschaften speichern, sodass Sie sie so abrufen:

// get a property called 'number'
Double double = config.getDouble("number");
Integer integer = config.getInteger("number");

Das kann Ihnen viel Trauer in Bezug auf die Implementierung ersparen. Du kann Machen Sie ein Problem mit der Speicherung von Binärdaten, da Sie sie vor dem Einfügen und nach dem Ersatz serialisieren müssten. Aber ich habe dies in der Vergangenheit für die Speicherung von INTs, Doppel und serialisierten Java -Objekten über Xstream verwendet, damit ich bestätigen kann, dass es gut funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top