Re: Netzwerkstrukturen im relationalen Modell

From: Vortex <vortex25(at)gmx(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Netzwerkstrukturen im relationalen Modell
Date: 2005-04-13 09:00:46
Message-ID: 20050413110046.48c22bf5.vortex25@gmx.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hallo Andreas!

Erstmal vielen Dank für die schnelle Antwort!!

Ich bin nun nicht ganz sicher, ob ich die Begriffe, die Du verwendet
hast, ganz richtig verstehe.

On Wed, 13 Apr 2005 02:45:35 +0200
Andreas Seltenreich <seltenreich(at)gmx(dot)de> wrote:

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

Also mit meinen Worten würde ich sagen: "in der Realität ist
die Relation symmetrisch". Antisymmetrisch würde ja sicher
bedeuten, daß die Verbindung auch real Eigenschaften
wie z.B. eine "Richtung" aufweist und damit die
Art der Speicherung festliegt?

Du meinst also, es wäre auch kein Fehler die Verbindung
auch in der Datenbank "zweimal" zu speichern und so die
reale Symmetrie nachzubilden? Ich habe darüber
auch schon nachgedacht, diese Möglichkeit aber eben wegen
der Redundanz und auch wegen der daraus resultierenden
Gefahr von Inkonsistenzen verworfen (was passiert, wenn
aus irgendwelchen Gründen mal nur eine hälfte
der Symmetrischen Verbindung eingetragen wird?).

Über den Begriff der Adjazenzmatrix grübel ich ja nun schon eine
ganze Weile. Ich kenne düster aus dem Mathematikunterricht
alle möglichen "junktionen". Ist disjunkt und adjunkt
das gleiche? Ist es so, daß man die Mengen der zu
verknüpfenden Elemente quasi als Vektor auffasst
(was ja dann eigentlich keine Menge mehr ist?) und diese
mittels der Matrix aufeinander abbildet?
Die Adjunkte einer Matrix hat doch dann sicher was mit
der Adjazenzmatrix zu tun? Oder klingt das nur so ähnlich?
Kann eine Matrix eigentlich nicht überhaupt nur
symmetrisch sein, wenn sie quadratisch ist?
Naja, wenn natürlich zwei gleiche Mengen verknüpft
werden, ist sie automatisch quadratisch.
Die "obere hälfte" einer Matrix kann ich eigentlich
nur dann weglassen, wenn die Spalten und Zeilen der
quadratischen Matrix geradzahlig sind. Das können sie
aber nur dann sein, wenn die Symmetrie der Verbindung
schon in der Matrix enthalten ist?

Ich hätte also z.B. die Menge S={1,2,3} und stelle
eine Verbindung zwischen den Elementen "2" und "3"
her. Sähe das dann so aus: ?
( 0 0 0 ) (1)
( 0 0 1 ) * (2) = (1 2 3)
( 0 1 0 ) (3)

Da ist aber doch jetzt die "Redundanz" quasi schon drin.
Obwohl die Zeilen der Matrix nicht geradzahlig sind?
ACH! Du meinst mit "oberer Hälfte" die "rechte obere Hälfte"?
Ja, klar! logisch! *freu* :-) Ich glaub' jetzt hab ich's
verstanden :-).

Hm, heißt die Ajazenzmatrix dann vielleicht deswegen so,
weil eine normale Matrix ja nicht unbedingt nur aus
"1" und "0" bestehen muß? Wenn Adjunktion und
Disjunktin das gleiche ist (bitte nicht schlagen, ich glaube
mich da düster an sowas erinnern zu können), vielleicht
heißt sie dann so, weil die Elemente entweder 1 ODER 0
sind? Na, ich glaube jetzt wird es etwas ZU phantasievoll :-).

Na, jedenfalls wäre die Speicherung der zweiten Hälfte
der Ajazenzmatrix vielleicht wirklich nicht so dumm,
denn beim Auswerten der Daten muß ich diese bislang immer
künstlich wieder erzeugen (mittels UNION). Und ob das mal
so effizient ist, wenn wirklich viele Daten drin sind?

> 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));
Hm, das stimmt. Das ist eigentlich die beste Lösung, die mir
bislang vorgeschlagen wurde. Das bedeutet zwar, daß ich das auch
beim Speichern berücksichtigen muß, aber zumindest ist dann
zu jeder Zeit die Konsistenz in der Datenbank gewährleistet.
Außerdem wäre damit gleich der Fall erschlagen, daß ein Objekt
mit sich selbst verbunden wird!

> Wenn die Relation tatsächlich antisymmetrisch ist, könnte man einen
> UNIQUE-index auf eine passende Funktion definieren:
Tatsächlich? Was man alles kann! :-)

> 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;
Hm, macht min() und max() sowas nicht von Haus aus? Nur müssten
es halt rows sein. Ich hätte erwartet, daß sowas in der Art:
min(generate_series($1,$2,$2-$1)) funktioniert. Aber
generate_series() scheint andere Spalten zu generieren, als
die aus einer "richtigen" Tabelle :-).

> create UNIQUE INDEX relation_idx_antisymmetrie
> ON relation (min(a,b),max(a,b));
Aber hier wäre der Fall daß ein Objekt mit sich selbst
verbunden wird, nicht automatisch ausgeschlossen, oder?
--> CHECK a != b ?

> Elegant genug? :-)
Ohja, das ist es, das ist es! :-)

Vielen Dank & Viele Grüße!
Klaus

--
#_#_#_#_# ,,,,, #_#_#_#_# http://db0fhn.efi.fh-nuernberg.de/~dg1nav
|__|__| |o o| |__|__|..... LOCAL: klaus(at)castle(dot)kwsnet
|_|__||__oOOo_|_|_|_oOOo__|_|__|| /// EMAIL: klauweg(at)gmx(dot)de
|__|__| . ' . |__|__| \\\
|_|__|| ¸ , " |_|__|| /// Castle - Online
/_/__|__\ . ' ¸ . /_/__|__\

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Daniel Seichter 2005-04-13 13:14:54 ALTER TABLE pc ALTER COLUMN code SET UNIQUE
Previous Message Andreas Seltenreich 2005-04-13 00:45:35 Re: Netzwerkstrukturen im relationalen Modell