kann mir jemand helfen weiterhelfen?
ich verstehe " key value datenbank" nicht kann mir jemand an einem beispiel erklären
vielen dank im voraus
lg lisa
Um das noch mal anders zu erklären: Key-Value Datenbanken sind z.B. Redis. Siehe
http://de.wikipedia.org/wiki/Redis.
Sie speichern Daten in einem sehr einfachen Model: ein Schlüssel und ein Wert -> Key Value. Der Schlüssel ist z.B. Dein Benutzeraccount, der Value z.B. in einem Onlineshop Dein Einkaufswagen. Value wird dann natürlich etwas komplexer sein, damit die Artikel, deren Anzahl und weitere Merkmale da alle zusammen drinne stehen. Dafür nimmt man of JSON-Dokumente, siehe
http://de.wikipedia.org/wiki/JavaScript_Object_Notation. Das kann man natürlich in jeder normalen SQL-DB so als Key-Value speichern (Textfelder), aber Redis ist bei sowas erheblich schneller, und ein Webshop soll schnell sein. Redis ist, das sehe ich @work, grad recht im kommen.
Um jetzt wieder den bei mir fälligen Bogen zu PostgreSQL zu bekommen: von
https://github.com/nahanni/rw_redis_fdw habe ich mir für PostgreSQL einen sog. Foreign Data Wrapper geholt und gebaut, damit kann ich aus PostgreSQL heraus auf eine Redis-Datenbank schreibend und lesend zugreifen.
Ich habe also jetzt einen Redis-Server lokal am laufen und diesen in PostgreSQL eingebunden:
Code:
est=*# select * from pg_foreign_server ;
srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions
--------------+----------+--------+---------+------------+--------+----------------------------
redis_server | 16384 | 18838 | | | | {host=127.0.0.1,port=6379}
(1 row)
Dazu habe ich eine Foreign Table definiert:
Code:
test=*# \d test_redis
Foreign table "public.test_redis"
Column | Type | Modifiers | FDW Options
--------+------+-----------+-------------
key | text | |
value | text | |
Server: redis_server
FDW Options: (tabletype 'string', key 'key')
Nun erstelle ich eine normalle Tabelle und einen Trigger, der bei Änderungen (Insert und Update) der normalen Tabelle die Daten nach der Redis-Datenbank kopiert:
Code:
test=# create table redis_source (key text, val text);
CREATE TABLE
Time: 4,365 ms
test=*# create or replace function redis_update() returns trigger as $$begin insert into test_redis values (new.key, new.val); return new; end; $$language plpgsql;
CREATE FUNCTION
Time: 0,532 ms
test=*# create trigger trg_redis after insert or update on redis_source for each row execute procedure redis_update();
CREATE TRIGGER
Time: 0,439 ms
test=*# insert into redis_source values ('new_key','new_value');
INSERT 0 1
Time: 0,809 ms
test=*# select * from test_redis where key = 'new_key';
key | value
---------+-----------
new_key | new_value
(1 row)
Time: 0,615 ms
test=*# update redis_source set val = 'hot new val' where key = 'new_key';
UPDATE 1
Time: 0,630 ms
test=*# select * from test_redis where key = 'new_key';
key | value
---------+-------------
new_key | hot new val
(1 row)
Wenn ich jetzt mit meinem Redis-Client die Redis-DB abfrage, sehe ich:
Code:
127.0.0.1:6379> get new_key
"hot new val"
Das ist nun alles natürlich trivial, hier ist noch kein JSON oder so dabei, aber das kann PostgreSQL ja bekanntermaßen auch perfekt.
Und so hat man mit PostgreSQL eine robuste 'richtige' SQL-DB, die wunderbar mit NoSQL-Datenbanken wie Redis zusammenarbeiten oder auch ersetzen kann (JSON-Verarbeitung geht in PostgreSQL 9.4 z.T. erheblich schneller als in MongoDB)