Performance: Rules, Funktionen oder doch Trigger

Hallo liebes Forum,

mein Datenbankentwurf neigt sich dem Ende. Ich habe nun noch folgende Frage:

Ich hate ja eine Tabelle “cms_restaurant”. Wenn dort Objekte angelegt werden und neue objekt_id vergeben wird,
dann sollen automatisch auch gleichzeitig in den Tabellen “cms_restaurant_oeffnungszeiten”, “cms_restaurant_grunddaten
und “cms_restaurant_bilder” die entsprechende Spalte mit derselben objekt_id aufgefüllt werden.

Prinzipiell klappt das mit folgenden Möglichkeiten auch ganz gut:

1.Rule anlegen

CREATE RULE einfuegen_cms_kneipe_untertabellen AS ON INSERT TO cms_kneipe Do 
(INSERT INTO cms_kneipe_oeffnungszeiten (objekt_id) VALUES 
(currval('cms_kneipe_objekt_id_seq'::regclass));INSERT INTO cms_kneipe_grunddaten
 (objekt_id) VALUES (currval('cms_kneipe_objekt_id_seq'::regclass));
INSERT INTO cms_kneipe_bilder (objekt_id) VALUES (currval('cms_kneipe_objekt_id_seq'::regclass)));
  1. oder aber:
    Funktion schreiben:
CREATE FUNCTION einfuegen_cms_kneipe_untertabellen()
RETURNS VOID
AS 'INSERT INTO cms_kneipe_oeffnungszeiten (objekt_id) VALUES (currval(''cms_kneipe_objekt_id_seq''::regclass));'
LANGUAGE 'sql';

…und dann mittels

INSERT INTO cms_kneipe (name) VALUES (NULL) ;
SELECT einfuegen_cms_kneipe_untertabellen();

…aufrufen.

  1. Es würde natürlich auch gehen ein Trigger zu definieren, der dann eine Funktion aufruft.

Ich frage mich nun: Was davon ist das performanteste?
Sind Regeln schneller als Funktionen?
Oder ist ein Trigger schneller der dann auf eine Funktion zurückgreift?
Wie kann ich den die Performanz messen?
Es geht mir letztlich um den Speed in der Anwendung.


Beste Grüße, Kai

Aus dem Bauch heraus würde ich sagen, nehme eine Lösung, die unabhängig davon funktioniert, ob die Anwendung weiß, was zu tun ist, oder es nicht weiß. Also, entweder via RULE oder TRIGGER. Die Performance dürfte sich nicht allzusehr unterscheiden. Ich gehe auch mal davon aus, daß da nicht pro Sekunde hunderte neue Restaurants gebaut werden…

Andreas

Alles klar, vielen Dank einmal mehr :slight_smile: