Re: Netzwerkstrukturen im relationalen Modell

From: Andreas Seltenreich <seltenreich(at)gmx(dot)de>
To: Vortex <vortex25(at)gmx(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Netzwerkstrukturen im relationalen Modell
Date: 2005-04-13 00:45:35
Message-ID: 87u0mbv70w.fsf@gate450.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

vortex25(at)gmx(dot)de writes:

> Es sollen Beziehungen zwischen Objekten der gleichen Menge
> hergestellt werden. Dabei darf es eine Verbindung zwischen
> zwei Objekten nur einmal geben. Es kann aber ein Objekt
> mit beliebig vielen anderen Objekten verbunden werden.

Ist die Relation auf der Menge tatsächlich antisymmetrisch, oder ist
sie symmetrisch, und du willst dir die zweite Richtung wegen der
Redundanz sparen? D.h. nur die obere Hälfte einer symmetrischen
Adjazenzmatrix pflegen?

> In meinem Fall referenzieren aber beide Spalten die selbe Menge,
> in der Verbindungen hergestellt werden müssen. Der
> unique-Constraint schützt mich in dem Fall nur davor keine
> zwei gleichen Verbindungen in die selbe "Richtung"
> einzutragen. Ich kann aber die gleiche Verbindung mit
> vertauschten Objekten aufnehmen.
>
> Natürlich ist der Fall sicher mit irgendwelchen
> Triggerfunktionen (oder überhaupt Zugriffsfunktionen,
> Methoden um bei der OO Terminologie zu bleiben)
> zu lösen, aber ich frage mich, ob es einen eleganten
> Weg gibt, das Problem bereits auf konzeptioneller
> Ebene (oder wie die Fachleute das nennen) zu lösen.

Wenn du die Antisymmetrie wegen der Redundanz willst, würde sich
anbieten, der Relation eine Ordnung aufzuzwingen:

create table relation (a int, b int,
CONSTRAINT antisymmetrie CHECK (a<b), UNIQUE(a, b));

Wenn die Relation tatsächlich antisymmetrisch ist, könnte man einen
UNIQUE-index auf eine passende Funktion definieren:

create table relation (a int, b int);

create function min(integer, integer) returns integer as
'select CASE WHEN $1 > $2 THEN $2 ELSE $1 END' language 'SQL'
IMMUTABLE;

create function max(integer, integer) returns integer as
'select CASE WHEN $1 > $2 THEN $1 ELSE $2 END' language 'SQL'
IMMUTABLE;

create UNIQUE INDEX relation_idx_antisymmetrie
ON relation (min(a,b),max(a,b));

Elegant genug? :-)

Gruß
Andreas

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Vortex 2005-04-13 09:00:46 Re: Netzwerkstrukturen im relationalen Modell
Previous Message Vortex 2005-04-12 20:56:08 Netzwerkstrukturen im relationalen Modell