Die beste Möglichkeit, eine PostgreSQL-Datenbank als einfachen Schlüsselwertspeicher zu verwenden

8

Ich werde aufgefordert, eine postgreSQL-Datenbank zu verwenden, die meine derzeitige Verwendung von berkeleyDB ersetzt. Obwohl; Mir ist klar, dass dies keine ideale Situation ist, es liegt außerhalb meiner Kontrolle.

Die Frage ist also ... Wenn Sie postgreSQL zu einem Schlüsselwertspeicher machen müssten, wie würden Sie das machen, während Sie es so effizient wie möglich machen?

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

Ich nehme an, ich sollte einen Blob für meine Wert- und Primärschlüsselspalte mit dem Schlüssel verwenden, aber da ich mich gerade auf diese Reise wage, bin ich neugierig, ob jemand in der Stack-Überlauf-Community dies getan hat oder ob es bestimmte gibt "Gotchas" sollte ich achten.

    
dennisjtaylor 05.01.2010, 19:11
quelle

4 Antworten

18

Die Erweiterung in Postgresql, um dies richtig zu machen, heißt hstore. Es funktioniert in ähnlicher Weise, wie Sie es von anderen Schlüsselwert-Speichersystemen erwarten. Laden Sie einfach die Erweiterung. Die Syntax ist einzigartig, aber wenn Sie jemals redis oder mongo verwendet haben, werden Sie es schnell bekommen. Mach es nicht schwerer als es ist. Ich verstehe, dass wir oft nicht unsere Werkzeuge auswählen und auskommen müssen Hier ist die Dokumentseite:

Ссылка

    
Stradas 29.05.2012, 02:19
quelle
2

Wenn Sie gezwungen sind, eine relationale Datenbank zu verwenden, würde ich vorschlagen, eine Struktur in Ihren Daten zu finden, um die Tatsache auszunutzen, da Sie auf den Vorteil der Geschwindigkeit verzichten, die Sie mit unstrukturierten Daten und Schlüssel-Wert-Speichern bekommen. Je mehr Struktur Sie finden, desto besser profitieren Sie von Ihrer misslichen Lage. Auch wenn Sie nur Struktur in den Schlüsseln finden.

Berücksichtigen Sie auch, ob Sie nur sequenziellen oder wahlfreien Zugriff auf Ihre Daten benötigen und in welchem ​​Verhältnis und wie Sie Ihre Datenbank nach dieser Anforderung strukturieren. Werden Sie Abfragen für Ihre Werte beispielsweise nach Typ vornehmen? Jede dieser Fragen kann sich darauf auswirken, wie Sie Ihre Datenbank strukturieren.

Eine spezielle Überlegung über Blobs in Postgresql wird intern als pg_largetable (loid: oid, pageno: int4, data: bytea) dargestellt. Die Größe der Chunks wird durch LOBBLKSIZE definiert, aber typischerweise 2k. Wenn Sie also Bytearrays anstelle von Blobs in Ihrer Tabelle verwenden und die Größe Ihres Wertes / Schlüsselpaares unter Blocksize begrenzen können, können Sie diese Indirektion 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 Struktur in Daten und Mustern im Datenzugriff zu suchen und dann Ihre Frage erneut mit mehr Details zu stellen.

    
Jiri Klouda 05.01.2010 19:26
quelle
0

Es sollte wirklich davon abhängen, was der Schlüssel sein wird. Wenn es immer eine Zeichenkette unter 255 Zeichen ist, dann benutze ein Varchar als yoru PK und verwende dann einen Blob (unter Annahme eines großen Wertes) für den Wert. Wenn es immer eine Zahl ist, benutze int, etc.

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

    
cyberconte 05.01.2010 19:17
quelle
0

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

%Vor%

(vielleicht ist der TYPE eine Aufzählung). Das oben Gesagte würde jedoch nicht für binäre Daten wie serialisierte Objekte funktionieren, und vielleicht brauchen Sie dort ein BLOB.

Alternativ (und wahrscheinlich eine viel bessere Idee), habt ihr Apache Commons-Konfiguration gesehen? Sie können das mit einer Datenbank (über JDBC) sichern und Sie können Eigenschaften speichern, so dass Sie sie so abrufen:

%Vor%

Das kann Ihnen viel Kummer in Bezug auf die Implementierung ersparen. Sie können Probleme mit dem Speichern von Binärdaten haben, da Sie sie vor dem Einfügen und nach dem Abrufen serialisieren müssen. Aber ich habe das in der Vergangenheit benutzt, um Ints, Doubles und serialisierte Java-Objekte über XStream zu speichern, also kann ich bestätigen, dass es gut funktioniert.

    
Brian Agnew 05.01.2010 19:15
quelle