m:n - Beziehung, aber nur eine Tabelle?

Booster84

Grünschnabel
Ich hab folgende Aufgabe erhalten: in einer Adressdatenbank soll es möglich sein, dass der Anwender Beziehungen zwischen den Personen definieren kann.

Das heißt: Jede Person kann beliebig viele Beziehungen zu Personen in derselben Tabelle haben(natürlich zu jeder Person nur einmal, wär ja sonst blöd). jeder zu jedem ist ja Normalerweise das typische m:n - modell(aber da hat man normalerweise 2 Tabellen)

Das Problem ist jetzt wie krieg ich das hin, dass ich
1. Keine mehrfach auftretenden Daten erhalte
2. Verhindere, dass eine Beziehung zu einer Person angelegt sind die nicht(mehr) vorhanden sind und
3. Ich die Beziehung auch rückwärts nutzen kann(wenn Person1 Person2 kennt, kennt Person2 auch Person1(leg ich jetzt mal fest))

Ich hofffe, dass das Problem es Wert ist gepostet zu werden sonst fang ich echt an zu zweifeln. Bitte helft...
 
Wieso nur eine Tabelle? Kannst du eine Zweite anlegen oder ist das aus irgendeinem Grund unmöglich? Eine schöne Lösung mit nur einer Tabelle ist fast unmöglich würde ich meinen...
 
Es ist nicht unmöglich, aber ich will ja keine doppelten Daten in der Datenbank haben,
zwecks Inkonsistenz.

bis jetzt hab ich die Tabelle 'Person'(Person_ID) und die Tabelle 'Beziehung'(Person_ID1,Person_ID2) . Und damit ich sicherstellen kann dass nur Beziehungen zwischen Personen enthalten sind ,wo Person1 und Person2 auch in der Tabelle 'Person' vorhanden sind, haben ich 2 1:n-Beziehungen(Person_ID-->Person_ID1/Person_ID-->Person_ID2) zwischen 'Person' und 'Beziehung' angelegt.

Das Problem: diese Lösung wurde abgelehnt weil 2 Beziehung zwischen denselben Tabellen
man gab mir noch den freundlichen Hinweis -Linktabelle, aber ich kann mir dazu wenig vorstellen und hab auch nicht wirklich was dazu gefunden
 
hi booster84,

lass mich raten, du benutzt access? das hat bei mir auch nicht funktioniert.
deine id ist aber voellig in ordnung und funktioniert auch. habe ich gerade mit mysql getestet. du legst eine tabelle mit id und name an, eine zweite mit id1 und id2.
dann setzt du jeweils ein forein key constraint von tabelle1.id auf tabelle2.id1 und auf tabelle1.id2. jetzt koennen nur noch beziehungen zwischen personen eingetragen werden, die es schon gibt.
aufgabe erledigt.
du kannst deinen lehrer ja mal freundlich darauf hinweisen, dass access kein dbms ist. ;-)
 
Nee.. Ich hab die Datenbank mit MSQL erstell(Server 2000) und greife mit Delphi darauf zu.
Ich denke ja mal dass das so funkzt aber mein (hoffentlich demnächst) Teamleiter sagt, dass das keine schöne Lösung ist, und das es besser auch geht(Hinweis Linktabelle), Doch ich weiß nicht wie Buhu...
Helft mir schnell
 
1) Wenn er sagt das es keine schöne Lösung ist, dann soll er dir doch bitte sagen wie es besser geht ;)

2) Ich würde es so versuchen:
2te Tabelle anlegen, in der ich jeweils die Id's der beiden speichere. Den Insert kann man (hoffe ich) über eine Stored Procedure machen, in der du erst Abfrägst ob schon eine solche Beziehung gespeichert ist. Wenn sowas wie
Code:
SELECT * FROM table WHERE (id1="person1" AND id2="person2") OR (id1="person2" AND id2="person1")
dann kein Result liefert, gibt es zwischen den Personen noch keine Beziehung, also kann eine angelegt werden.

Beim Löschen von Personen sollte der MSSQL Server, dann eigentlich auch die Relationen in der "beziehungstabelle" löschen wenn das mit FK-Constraints richtig gelöst wurde. Ansonsten kann man es evtl über einen Trigger manuell anstoßen. Konkrete Syntax kann ich die leider manges MSSQL Server nicht liefern...

bye
 
Zurück