postgresql Hstore-Schlüssel / Wert im Vergleich zur herkömmlichen SQL-Leistung

8

Ich muss ein Schlüssel / Wert-Backend entwickeln, etwa so:

%Vor%

Ich habe von PostgreSQL hstore mit GIN / GIST gehört. Was ist besser (leistungsbezogen)? Dies auf herkömmliche Weise mit SQL-Joins und separaten Spalten (Schlüssel / Wert)? Hält PostgreSQL hstore in diesem Fall besser?

Das Format der Daten sollte ein beliebiger Schlüssel sein = & gt; beliebiger Wert. Ich möchte auch eine Textanpassung durchführen, z. suche teilweise nach (LIKE% in SQL oder unter Verwendung der Hstore-Entsprechung). Ich plane, ungefähr 1M-2M Einträge darin zu haben und wahrscheinlich irgendwann zu skalieren.

Was empfehlen Sie? Wird der SQL-traditionelle Weg / PostgreSQL-H-Speicher oder irgendein anderer verteilter Schlüssel / Wert-Speicher mit Persistenz verwendet?

Wenn es hilft, ist mein Server ein VPS mit 1-2GB RAM, also keine ziemlich gute Hardware. Ich dachte auch darüber nach, eine Cache-Schicht zu haben, aber ich denke, dass es das Problem eher verkompliziert. Ich will nur gute Leistung für 2M Einträge. Updates werden oft durchgeführt, suchen aber noch häufiger.

Danke.

    
florinp 28.02.2012, 18:33
quelle

2 Antworten

8

Ihre Frage ist unklar, weil Sie sich nicht klar über Ihr Ziel sind.

Der Schlüssel hier ist der Index (Wortspiel beabsichtigt) - wenn Sie mit einer großen Menge von Schlüsseln umgehen, die Sie in der Lage sein möchten, sie mit den wenigsten Lookups zu erhalten und ohne nicht zusammenhängende Daten zu ziehen.

Kurze Antwort ist, dass Sie hstore wahrscheinlich nicht verwenden möchten, aber schauen Sie sich das genauer an ...

  • Hat jedes id viele Schlüssel / Wert-Paare (hunderte +)? Verwenden Sie nicht hstore .
  • Enthält einer Ihrer Werte große Textblöcke (4 KB +)? Verwenden Sie nicht hstore .
  • Möchten Sie nach Schlüsseln in Platzhalterausdrücken suchen können? Verwenden Sie nicht hstore .
  • Möchten Sie komplexe Joins / Aggregation / Reports erstellen? Verwenden Sie nicht hstore .
  • Aktualisieren Sie den Wert für einen einzelnen Schlüssel? Verwenden Sie nicht hstore .
  • Mehrere Schlüssel mit demselben Namen unter id ? % Co_de% kann nicht verwendet werden.

Also, was nutzt hstore ? Nun, ein gutes Szenario wäre, wenn Sie Schlüssel / Wert-Paare für eine externe Anwendung halten möchten, in der Sie immer alle Schlüssel / Werte abrufen möchten und die Daten immer als Block speichern ( dh es wird nie direkt bearbeitet. Gleichzeitig wollen Sie etwas Flexibilität, um diese Daten - Albiet sehr einfach zu durchsuchen - anstatt sie in einem Block von XML oder JSON zu speichern. In diesem Fall, da die Anzahl der Schlüssel / Wert-Paare klein ist, sparen Sie Platz, weil Sie mehrere Tupel in ein hstore komprimieren.

Betrachten Sie dies als Ihre Tabelle:

%Vor%     
Elliot Chance 04.07.2012 05:05
quelle
1

Ich denke, das Design ist schlecht normalisiert. Versuchen Sie etwas mehr wie folgt:

%Vor%

Wenn die Eigenschaften klein sind und Sie sie nicht häufig in Joins oder mit ausgefallenen Auswahlkriterien verwenden müssen, kann hstore ausreichen. Elliot legte einige vernünftige Dinge vor, die in dieser Hinsicht in Betracht gezogen werden sollten.

Ihr Hinweis auf Benutzer deutet darauf hin, dass dies unvollständig ist, aber Sie haben nicht wirklich genug Informationen gegeben, um zu suggerieren, wo diese hingehören. Sie könnten mit einem Array in t1 auskommen, oder Sie könnten mit einer separaten Tabelle besser dran sein.

    
kgrittn 10.07.2013 15:33
quelle

Tags und Links