Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie am besten diese Relation abbilden? (https://www.delphipraxis.net/71795-wie-am-besten-diese-relation-abbilden.html)

Igotcha 21. Jun 2006 01:16


Wie am besten diese Relation abbilden?
 
Hallo zusammen,

ich habe gerade ein Problem damit die folgenden Relationen in Objekten abzubilden:

1) Kontakt (Kontakt-Objekt)
2) Firma (Firmen-Objekt)
3) Zusatzdaten des Kontakts in der Firma

wobei gilt:

Kontakt -> 1:n Firmen -> 1:1 Zusatzdaten

Also ein Kontakt (eine Person) kann in mehreren Firmen sein und in diesen Firmen hat der Kontakt genau eine Zusatzdate wie Telefon, Email, etc.

Mein Objekt "Kontakt" lädt alle Firmen-Objekte, in denen das Objekt "Kontakt" sitzt in eine TObjectList. Diese Relation ist problemlos. Da ich alles schon OO programmieren möchte ist jetzt mein Problem, wo packe ich die Zusatzdaten (ein neues Objekt?) rein? In das Objekt Kontakt macht es keinen Sinn, da diese Daten ja abhängig von der Firma sind. Im Objekt Firma macht es aber auch keinen Sinn, da die Zusatzdaten wieder vom Kontakt abhängen.

Mein praktisches Problem ist zudem die grafische Abbildung. In meinem Programm öffnet sich eine Form für den Kontakt. Auf einem Tabsheet werden in einer Listview die Firmen aufgelistet, in denen der Kontakt sitzt. Klickt man jetzt auf eine dieser Firmen sollen die Zusatzdaten des Kontakts in genau dieser Firma (objektorientiert) angezeigt und editiert werden können. Momentan löse ich das Problem durch einen Index von der ListView und lade die Daten "manuell" nach.

Auf dieser Form kann ich einem Kontakt auch eine zusätzliche Firma zuordnen, die dann als Objekt in der TObjectList von "Kontakt" hinzugefügt und mit der Methode TKontakt.Save vom Objekt gespeichert wird. Nun hätte ich gerne die Zusatzdaten in einer ähnlichen Form gleich mitgespeichert.

marabu 21. Jun 2006 07:27

Re: Wie am besten diese Relation abbilden?
 
Hallo.

Bei deinem Modellierungsproblem kannst du die Regeln des Datenbankentwurfs anwenden und auf deine Klassen übertragen. Bei den Zusatzdaten handelt es sich genau genommen um einen Beziehungsdatentyp von Kontakten und Firmen. Mit der 1:1 Beziehung zwischen Zusatzdaten und Firmen erfasst du nur die Hälfte der Wahrheit, denn es gibt eine zusätzliche 1:n Beziehung zwischen Kontakten und Zusatzdaten.

Den Fremdschlüsseln des Datenmodells entsprechen die Objektverweise im Klassenmodell. Deine Zusatzdaten werden dann zweckmäßigerweise nicht als Referenz bei TKontakt oder TFirma geführt, sondern genau andersherum: ein Verweis auf TKontakt und TFirma wird bei TZusatzDaten geführt. Oft sehe ich, wie 1:1 Beziehungen in die Integration der beteiligten Datentypen münden. Dieser vermeintliche Optimierungsschritt ist weit verbreitet, verwässert aber ein Datenmodell ungemein. Besser ist es alle Entitäten auf Basistabellen abzubilden und die benötigte Zusammenlegung der Daten durch Views zu organisieren.

Grüße vom marabu

Igotcha 21. Jun 2006 10:14

Re: Wie am besten diese Relation abbilden?
 
Ok, was Du im zweiten Absatz beschreibst, ist der Grund meiner Fragestellung gewesen, da ich genau das vermeiden wollte.

Meinst Du jetzt sowas in der Art?
Delphi-Quellcode:
TZusatzDaten = class(TObject)
  FContactID: integer;
  FCompanyID: integer;
  FTelefon: String;
  FEmail: String;
  usw.
end;

TContact = class(TObject)
 bisherige Daten
 FZusatzDatenList: TObjectList;
end;
So dass beim Laden eines Kontakt-Objekts die Zusatzdaten aus der DB gelesen, TZusatzDaten-Objekte erstellt und in die FZusatzDatenList hinzugefügt werden?

Viele Grüße
Igotcha

marabu 21. Jun 2006 10:23

Re: Wie am besten diese Relation abbilden?
 
Ich glaube du hast mich richtig verstanden. Ob nun die Verweise in deinen Klassen über den PK oder einen Objektzeiger erfolgen, das ist dann eine Detailfrage, die du für dich noch klären musst. Das hängt auch mit deinem Konzept für das Laden der Daten aus der DB zusammen - load on demand (jeder Datensatz wird nur dann eingelesen, wenn er durch eine Benutzeraktion oder ein Ereignis angefordert wird) oder prefetch (alle Daten werden vorsorglich bereit gestellt).

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf