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
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 |