Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zwei Tabellen mit einander Verknüpfen (https://www.delphipraxis.net/39492-zwei-tabellen-mit-einander-verknuepfen.html)

Tyrael Y. 3. Feb 2005 14:50

Re: Zwei Tabellen mit einander Verknüpfen
 
Contraints sind Eigenschaften von Tabellenfeldern wie zum Beispiel das

NotNull - Constraint

shmia 3. Feb 2005 14:51

Re: Zwei Tabellen mit einander Verknüpfen
 
Zitat:

Zitat von alcaeus
Nur weil es mich interessiert: ist die Abfrage ohne INNER JOIN langsamer oder so, oder warum ist sie schlechter? Ich verwende nämlich fast nie INNER JOINs, sondern immer die "schlechtere" Variante.

Beide Syntax Varianten werden Datenbank intern auf den gleichen Ausführungsplan zurückgeführt.
Vom Ergebnis und der Geschwindigkeit sind sie also gleich.

Der Vorteil der INNER JOIN Syntax liegt darin
* man erkennt sofort, dass ein JOIN zwischen 2 (oder mehr) Tabellen vorliegt
* die WHERE Bedingung bleibt sauber; man kann also leichter im Program zur Laufzeit Where-Bedingungen anfügen
* bei JOINs über 3 (oder noch mehr) Tabellen fällt es wesentlich leichter alle Keyfelder anzugeben
Nachteil der "alten" Syntax
* bei JOINs über 3 (oder noch mehr) Tabellen vergisst man bestimmt irgendeine WHERE Bedingung.
man merkt den Fehler oft erst im Echtbetrieb, wenn plötzlich 8 Datensätze da sind, wo man nur 1 erwartet hat

Luckie 3. Feb 2005 14:52

Re: Zwei Tabellen mit einander Verknüpfen
 
Ach so. Muss einem ja auch mal gesagt werden. :zwinker:

Ich glaube, dann hätte ich erstmal alles, was ich brauche. Die eiegntliche Verknüpfung der Datensätze in den Tabellen erfolgt dann über die Abfrage mittels eines INNER JOINs, sehe ich das richtig?

Zottel 3. Feb 2005 14:55

Re: Zwei Tabellen mit einander Verknüpfen
 
Zitat:

Zitat von Tyrael Y.
PS: mehr Infos darüber überall im I-Net unter dem Stichwort
"Normalisierung" erhältlich

jep. das weiss ich. aber ich gehe davon aus, das laut aufgabenstellung luckie sich noch nicht mit den normalformen beschäftigen will.
also reicht eine 1:n beziehung für lernzwecke vollständig aus. Wenn er dann hinterher eine normalisierung vornehmen will und doppelnennungen entfernen will, kann er das ja immer noch mit einer n:n machen. aber ich glaube, ihr habt ein wenig weiter gedacht, als die aufgabe von lukie gedacht war. vielleicht bin ich aber auch auf dem holzweg. kann ja auch sein....

aber recht gebe ich euch, das wenn man keine doppelnennungen haben will, man um eine n:n nicht rumkommt. aber das hieße 3 tabellen zum verknüpfen. was für rookies zum lernen schon wieder ein schritt weiter ist.

Tyrael Y. 3. Feb 2005 15:00

Re: Zwei Tabellen mit einander Verknüpfen
 
eine n:n - Beziehung in zwei 1:n -Beziehungen aufzulösen und eine Zwischentabelle zu nutzen macht man nicht zum Spaß, sondern um

1. die Datenbank konsistent zu halten

2. weniger Arbeit bei der Implementierung zu haben


mfg

Luckie 3. Feb 2005 15:02

Re: Zwei Tabellen mit einander Verknüpfen
 
Ich markiere das hier mal als für mich erledigt.

Strophi 4. Feb 2005 12:03

Re: Zwei Tabellen mit einander Verknüpfen
 
Hi,

die 'schlechte' Variante ist ein Cross-Join, also jeder mit jedem, und dann werden die DS aus dem Result-Set gestrichen, die dem Where-Ausdruck nicht entsprechen.
Der Inner-Join macht keinen Cross-Join, ist deswegen performanter.

mfg

Strophi

Sharky 4. Feb 2005 15:06

Re: Zwei Tabellen mit einander Verknüpfen
 
Zitat:

Zitat von Luckie
Was sind den jetzt Contrains? :gruebel:

Auch wenn "das Thema für dich erledigt ist" noch etwas zu den Fremdschlüsseln. Diese werden von mySQL seit Version 3.23.44 unterstützt (aber nur bei InnoDB-Tabellen) und müssen dann natürlich auch als solche angegeben werden. Hier mal zwei Tabellen:

SQL-Code:
CREATE TABLE lieferanten
                    (id INT auto_increment,
                    name VarChar(100),
                    PRIMARY KEY (id)
) TYPE=INNODB;

CREATE TABLE artikel
                   (id INT auto_increment, li_id INT,bezeichnung VarChar(100),
                   PRIMARY KEY (id),
                   INDEX li_ind (li_id),        
                   FOREIGN KEY (li_id) REFERENCES lieferanten(id)
                     ON DELETE CASCADE
) TYPE=INNODB;
Wie man sieht ist die Tabelle artikel über einen FOREIGN KEY mit einer Referenz auf die ID aus lieferanten versehen.
Als bedingung ist eingetragen "ON DELETE CASCADE". Was hat dies zu bedeuten fragt sich nun das Luckie *g*
Ganz einfach. Wenn aus der Tabelle lieferanten ein Datensatz gelöscht wird, werden automatisch alle Arikteldatensätze gelöscht bei denen das Feld li_id den gleichen Wert hat wie die ID des gelöschten Lieferanten-DS.

Ausser "Cascade" gibt es noch andere Dinge wie man machen kann:
  • RESTRICT -> Ein "Master" Datensatz kann nicht gelöscht werden wenn es noch abhängige DS gibt
  • CASCADE -> Siehe oben
  • SET NULL -> Das Feld des FOREIGN Keys (li_id) wird auf NULL gesetzt
  • NO ACTION -> nix
  • SET DEFAULT -> Das Feld wird auf den angegebenen Defaultwert gesetzt.

Luckie 4. Feb 2005 15:09

Re: Zwei Tabellen mit einander Verknüpfen
 
Ah ja. das war doch schon mal eine wertvolle Information. :thumb:

Luckie 4. Feb 2005 16:45

Re: Zwei Tabellen mit einander Verknüpfen
 
Doch noch mal eine Frage. das mit den Fremdschlüssel spielt aber nur beim Löschen eine Rolle oder? Bei Abfragen spielt es keine Rolle oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr.
Seite 3 von 4     123 4      

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