allgemeinne Frage zu Relationen

Hallo,
schon wieder ich, aber so ist es mal am Anfang:

Ich habe ne allgemein Frage:

Wenn man eine Tabelle(Menge) hat mit Kontakte
und eine weitere Tabelle(Menge) hat mit Produkte.

Wenn ein Mensch aus der Menge Kontakte mehrere Realtionen auf der Menge Produkte, wie wird das technisch realisiert?

Also Beispiel: Mensch1 hat Produkt1, Produkt2 und Produkt3.

Ich habe folgendes gemacht:

in der Tabelle Kontakte gibt es ein Spalte ‘Produkte’ mit dem Typ TEXT.
in diesem Element trage ich die Produkt_ID’s mit Trennung ‘;’ ein
(also:‘Produkt_ID1;Produkt_ID2;Produkt_ID1’).
Und wenn ich alle Produkte des Menschen Mensch1 haben will, frage ich das Element ‘Produkte’ ab, splitte diese wieder in einzelne Elemente udn fertig. Ist das richtig so, oger gibt es was besseres.
Das Problem was ich dabei sehe, ist das die Datenbank die Relation nicht findet. Das heisst ich habe in meinem Element ‘Produkte’ einige Produkte stehen, könnte aber das Produkt selber löschen, ohne das die Datenbank ‘mekkert’ (‘violates constraint key …’).

Also die Frage lautet nun:
Wie kann ich eine rictige Relation auf mehreren Elemente in ‘Produkte’ machen.

vielen Dank

Frank

Mit einer weiteren Tabelle, mit 2 Spalten, um die ID’s zuzuordnen. Alles andere, mit Kommalisten oder ähnliche Konstrukte, zerbröseln im Laufe der Zeit und hinterlassen Probleme.

Andreas

das verstehe ich nicht ganz:

Also, ich habe eine Person in ‘Kontakte’ und hat 3 Produkte aus ‘Produkte’ (Produkt1, Produkt2 und Produkt3).

Tabelle Kontakte

PersonID | PersonName| …
Person1 | Horst| …

Tabelle Produkte

ProduktID | ProduktName| …
Produkt1 | Apfel
Produkt2 | Birne
Produkt3 | Ei


wie kann ich über eine weiteren Tabelle eine Relation bilden?
Ich dachte vorerst an soetwas:

Tabelle KontaktHatProdukt

ProduktID| KontaktID



aber dann stehhe ich ja wieder vor dem selben Problem!?
oder was hab ich nicht verstanden?

vielen Dank
Frank

ahh,

du meintest das:

Tabelle KontaktHatProdukt

ProduktID| KontaktID
Person1 | Produkt1
Person1 | Produkt2
Person1 | Produkt3

ist das richig?

wenn ja, dann kann keine der beiden Spalten einen Key erhalten, weil auf beiden Seiten die Elemente mehrmals auftauschen können. Oder?

Ich habe nun eine neue Tabelle gemacht

Daher jede Tabelle ein Primary ke habe sollte, hab ich halt eine Spalte hinzugefügt

meineID | ProduktID| KontaktID
selbererzeugt| Person1 | Produkt1
selbererzeugt| Person1 | Produkt2
selbererzeugt| Person1 | Produkt3

ProduktID und KontaktID habe einen foreign key auf den Tabelle Produkt und Kontakt.

Ist das ligitim, oder macht man das anders?

Frank

schon okay so. Alternativ kann man auch einen PK auf (ProduktID,KontaktID) bilden, denn das ist auch eindeutig.

Andreas

Alternativ kann man auch einen PK auf (ProduktID,KontaktID) bilden, denn das ist auch eindeutig

Das habe ich anfangs versucht, aber daher es für beide Spalten doppelte Einträge gibt, funktioniert das nicht. Oder doch?
Kann ein PrimaryKey gesetzt werden, obwohl es mehrere doppelte Einträge gibt?

Danke

Frank

Nein, aber gleiche Rows machen auch keinen Sinn, ein PK wäre ein gutes Mittel, Redundanz zu vermeiden.

Andreas

mmh,

wie behandle ich den diese Situation:

ProduktID| KontaktID
Person1 | Produkt1
Person1 | Produkt2
Person1 | Produkt3
Person2 | Produkt3
Person2 | Produkt4
Person3 | Produkt4

Person2 hat genau wie Person1 das Produkt3
und Person2 hat genau wie Person4 das Produkt4
(ob es in diesem Falle sinn macht, das 2 Personen das selbe Produkt besitzen, sei erstmal dahingestellt)

Danke

Frank



test=# create table fp (id1 int, id2 int, primary key(id1,id2));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "fp_pkey" for table "fp"
CREATE TABLE
Time: 188.671 ms
test=*# copy fp from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    1
>> 1    2
>> 1    3
>> 2    1
>> 2    2
>> 2    3
>> 3    4
>> \.
test=*# select * from fp;
 id1 | id2
-----+-----
   1 |   1
   1 |   2
   1 |   3
   2 |   1
   2 |   2
   2 |   3
   3 |   4
(7 rows)

Wo exakt ist Dein Problem?

Andreas

Das Proble ist,

das ich problemlos Produkt 1 löschen kann und das soll nicht sein.

vielen DAnk

Frank

ich habs!! …

…mit

contact_id               INT REFERENCES contact ON DELETE RESTRICT, 
ContactWith             INT REFERENCES contact ON DELETE RESTRICT, 
PRIMARY KEY(contact_id, ContactWith)

gelöst,

vielen Dank
Frank