Postgresql bereichert die Welt von OpenSource Datenbanken schon seit langem, führte allerdings bisher eher ein Schattendasein und überließ MySQL das Feld – Allerdings völlig zu unrecht. Postgresql orientiert sich mehr am SQL Standard und fördert deutlich stärker die Kompatibilität mit anderen Systemen. Das ganze System fühlt sich auch mehr nach „echter“ Datenbank an, z.B. durch Namespaces, Sequenzen, Partitionierung oder die interne Verwaltung. Durch stärkere Kontrolle der Datenhaltung gewinnt man viel Performance und Transparenz bei der Entwicklung von Software oder den Betrieb von Plattformen auf Basis von Postgresql. Mir haben ein paar Sachen besonders gut gefallen die ich gerne Vorstellen würden:
Table Inheritance
Postgresql unterstützt Vererbungen. Damit ist es Möglich Objektrelationen aus der Softwareentwicklung auf die Datenbank zu übertragen ohne sich verbiegen zu müssen. Die Vererbung kann auch zur Partitionierung benutzt werden da die Attributwerte des ganzen Datensatz in den jeweiligen Tabellen landen.
create sequence universal_seq;
CREATE TABLE Base(
oid INT8 PRIMARY KEY DEFAULT nextval('universal_seq'),
name varchar(100) NOT NULL CHECK (name <> '')
);
CREATE TABLE asset(
vendor VARCHAR(100),
assetid uuid NOT NULL DEFAULT uuid_generate_v4()
) inherits (base);
create table server(
description varchar(255),
ipaddress cidr
) inherits(asset);
Arrays
Will man ein paar Werte in einem Feld abspeichern und nicht gleich eine abhängige Relation durch Fremdschlüssel anlegen eigenen sich simple Arrays. Die Arrays werden in der Datenbank als native Datentypen behandelt.
create table rezepte(
id SERIAL,
titel varchar(100),
tags VARCHAR(100)[]
);
insert into rezepte(titel, tags) VALUES('Spinatauflauf', '{"spinat", "vegetarisch", "feta"}');
insert into rezepte(titel, tags) VALUES('Spaghetti bolognese', '{"tomaten", "hackfleisch"}');
insert into rezepte(titel, tags) VALUES('Spanakopita', '{"spinat", "vegetarisch", "feta"}');
insert into rezepte(titel, tags) VALUES('Gyros', '{"tzatziki", "knoblauch"}');
select * from rezepte WHERE 'spinat'=ANY(tags);
HSTORES
Hier prallen eigentlich zwei Welten aufeinander: Relationale Datenbanken und NOSQL. HSTORES ist ein Datentyp welcher ein Dictionary enthält. Interessant ist auch hier das es sich um einen ‚internen‘ Typ handelt der speziell indiziert werden kann.
create table attributes(uid SERIAL, dict HSTORE);
create table attributes(uid SERIAL, dict HSTORE);
insert into attributes(dict) VALUES('"f"=>"Eduart", "l"=>"Zimmermann"');
CREATE INDEX attr_dict_lastname
ON attributes
((attributes.dict -> 'l'));
select dict -> 'f' as firstname from attributes where dict -> 'l' = 'Zimmermann';
Zugegeben, es ist nicht wirklich alles neu aber es lohnt sich ein Blick über den See. Wer ungebunden ist und die Möglichkeit besitzt sich auf ein System festzulegen, kriegt mit Postgresql gleich eine komplette Fabrik zum Werkzeugkasten hinzu.
0 Kommentare
Trackbacks/Pingbacks