PostgreSQL-Datentyp hstore
Siehe auch:
'hstore' ist ein optionales Modul der PostgreSQL-Distribution Version 9 und Neuere (siehe Ref.1]). Der Name ist an Perl's Datentyp 'Hash' angelehnt. Weitere Namen dafür sind - je nach Computersprache - "Schlüssel-Wert-Speicher" (Entity-Attribute-Values (EAV) oder Key-Value Pairs (KVP) genannt), Dictionary (ISO?), Assoziatives Array (PHP) oder Map Collection (Java).
Einführung
Einführung adaptiert aus "HStore: key-value PostgreSQL" von Josh Berkus (Quelle Ref.2): Die Renaissance der nicht relationalen Datenbanken bzw. der "NoSQL-Bewegung" hatte auch einen Einfluss auf PostgreSQL. Ein Resultat davon ist das optionale Modul hstore in Version 9.0, das einen "Schlüssel-Wert-Speicher" (Dictionary) in PostgreSQL implementiert. hstore war schon in früheren Versionen von PostgreSQL verfügbar, war jedoch nur beschränkt nutzbar. Diese Beschränkungen sind jetzt weg zusammen mit neuen Funktionen z.B. zur Schlüssel-Manipulation.
Zum Beispiel, angenommen Sie wollten Benutzerprofil-Daten als eine Reihe von Schlüssel-Wert-Paare zu speichern. Zuerst muss man hstore in die Datenbank laden, da es ein optionales Modul ist. Als nächstes würde man eine Tabelle erstellen:
CREATE TABLE user_profile ( user_id INT NOT NULL PRIMARY KEY REFERENCES users(user_id), profile HSTORE );
Dann können sie Schlüssel-Wert-Paare in der Tabelle speichern:
INSERT INTO user_profile VALUES ( 5, hstore('"Home City"=>"San Francisco","Occupation"=>"Sculptor"');
Beachten Sie, dass das Format für die hstore-Strings ähnlich wie Hashes in Perl ist. Einfache JSON-Objekte werden wahrscheinlich in 9.1 unterstützt werden. Sie können jedoch auch ein Array-Format benutzen:
INSERT INTO user_profile VALUES ( 5, [["Home City"],["San Francisco"]][["Occupation"]["Sculptor"]]); -- TBD.
Man braucht wahrscheinlich einen Index für die schnelle Suche:
CREATE INDEX user_profile_hstore ON user_profile USING GIN (profile);
Nun kann man sehen, welche Keys enthalten sind:
SELECT akeys(profile) FROM user_profile WHERE user_id = 5;
Einzelne Keys holen:
SELECT profile -> 'Occupation' FROM user_profile;
Spezifische Keys löschen:
UPDATE user_profile SET profile = profile - 'Occupation' WHERE user_id = 5;
Und schliesslich eine Abfrage mit dem hstore-Datentyp in der WHERE-Klausel:
SELECT profile -> 'Home City' FROM user_profile WHERE profile @> hstore('Home City','San Francisco');
Tipps & Tricks
- ...
Funktionsweise von hstore
Quelle: "Key/Value Pair versus hstore - Benchmarking Entity-Attribute-Value Structures in PostgreSQL", von Michel Ott im Datenbank-Seminar im MSE an der HSR Hochschule für Technik Rapperswil. [1]
- tbd.
Dokumentation
- PostgreSQL 9.0.4 Documentation - Chapter F.13 "Appendix F. Additional Supplied Modules": [2]
- "PostgreSQL 9.0 arrives with many new features", by Josh Berkus, September 2010. Ankündigung http://lwn.net/Articles/406385/