Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Auf ein Attribut doppelt zugreifen? (https://www.delphipraxis.net/171777-auf-ein-attribut-doppelt-zugreifen.html)

AlexII 24. Nov 2012 16:58

Datenbank: SQLite • Version: 3 • Zugriff über: SQLite4Delphi Wrapper von Tim Anderson

Auf ein Attribut doppelt zugreifen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich hab hier ein Problem (siehe Anlage) welches ich nicht lösen kann, ich hoffe ihr könnt mir helfen.

Also ich möchte mittels einem Select den Vor- u. Nachnamen des Autor und des Entleihers ausgeben, das gelingt mir aber nicht, da die vname und nname nur ein Mal belegt werden können. Weiß jemand wie da vorgehen muss, um das zum laufen zu bringen?

Danke!

Hier meine Select abfrage:

Delphi-Quellcode:
tb := db.GetTable('SELECT buch.id_buch,'
    + 'buch.beschreibung,'
    + 'buchtitel.btname,'
    + 'verlag.vgname,'
    + 'stehplatz.spname, '
    + 'nachname.nname, '
    + 'vorname.vname, '
    + 'FROM buch '
    + 'LEFT JOIN buchtitel ON buchtitel.id_buchtitel=buch.fk_buchtitel_id '
    + 'LEFT JOIN verlag ON verlag.id_verlag=buch.fk_verlag_id '
    + 'LEFT JOIN stehplatz ON stehplatz.id_stehplatz=buch.fk_stehplatz_id '
    + 'LEFT JOIN autor ON buch.fk_autor_id=autor.id_autor LEFT JOIN nachname ON autor.fk_nachname_id=nachname.id_nachname LEFT JOIN vorname ON autor.fk_vorname_id=vorname.id_vorname '
    + 'LEFT JOIN entleiher ON buch.fk_entleiher_id=entleiher.id_entleiher LEFT JOIN nachname ON entleiher.fk_nachname_id=nachname.id_nachname LEFT JOIN vorname ON entleiher.fk_vorname_id=vorname.id_vorname');

himitsu 24. Nov 2012 17:15

AW: Auf ein Attribut doppelt zugreifen?
 
SQL-Code:
SELECT xyz.name AS xname, abc.name AS aname
FROM ...
LEFT JOIN vorname abc ON abc.id_vorname = autor.fk_vorname_id -- LEFT JOIN vorname AS abc ON ...
LEFT JOIN vorname xyz ON xyz.id_vorname = sonstwer.fk_vorname_id
Die ausgegebenen Feldnamen müssen halt eindeutig sein, unabhängig von Namespace/Table.


PS: Du hättest für uns den Code aber auch übersichtlicher zur Verfügung stellen können.
SQL-Code:
SELECT buch.id_buch,
buch.beschreibung,
buchtitel.btname,
verlag.vgname,
stehplatz.spname,
nachname.nname,
vorname.vname,
FROM buch
LEFT JOIN buchtitel ON buchtitel.id_buchtitel=buch.fk_buchtitel_id
LEFT JOIN verlag ON verlag.id_verlag=buch.fk_verlag_id
LEFT JOIN stehplatz ON stehplatz.id_stehplatz=buch.fk_stehplatz_id
LEFT JOIN autor ON buch.fk_autor_id=autor.id_autor LEFT JOIN nachname ON autor.fk_nachname_id=nachname.id_nachname LEFT JOIN vorname ON autor.fk_vorname_id=vorname.id_vorname
LEFT JOIN entleiher ON buch.fk_entleiher_id=entleiher.id_entleiher LEFT JOIN nachname ON entleiher.fk_nachname_id=nachname.id_nachname LEFT JOIN vorname ON entleiher.fk_vorname_id=vorname.id_vorname
Bei deinem Text/String hätte ich erst gedacht, daß die letzen beiden JOINs ewig lange ON-Klauseln hatten, aber nee, du hast da urplötlich weitere JOINs versteckt. :shock:




Sind das soooooviele Namen?
Ich hätte Vor- und Nachname in einer ID-Vorname-Nachname-Tabelle erwartet. (eventuell mit nochmer)

sx2008 24. Nov 2012 17:30

AW: Auf ein Attribut doppelt zugreifen?
 
Mir scheint, dass deine Datenbank übermässig normalisiert ist (4. oder 5 Normalform).
Es ist nicht üblich und macht auch keinen Sinn (Ausnahme: Ahnenforschung) einen Namen einer Person auf die Tabellen "Vorname" und "Nachname" zu verteilen.

Zu deinem eigenen Vorteil rate ich dir dies rückgängig zu machen und ganz einfach Vor- und Nachname als Stringfeld in der Tabelle "author" zu speichern.
Unterbewusst ist dir selbst schon aufgefallen, dass deine Datenbank ein Designproblem hat;
warum sonst hast du die Joins auf die Tabelle "author", "vorname" und "nachname" in eine Zeile geschrieben?

Das gleiche gilt auch für die Tabelle "entleiher".

AlexII 24. Nov 2012 17:42

AW: Auf ein Attribut doppelt zugreifen?
 
Aber wenn ich die Attribute Vor- u. Nachname in der Tabelle "autor" und "entleiher" habe, hab ich ne Redundanz. Was mach ich da nun...? :gruebel:

Sir Rufo 24. Nov 2012 18:01

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von AlexII (Beitrag 1192760)
Aber wenn ich die Attribute Vor- u. Nachname in der Tabelle "autor" und "entleiher" habe, hab ich ne Redundanz. Was mach ich da nun...? :gruebel:

autor_vorname, autor_nachname, ...

stahli 24. Nov 2012 18:07

AW: Auf ein Attribut doppelt zugreifen?
 
Als Redundanz würde ich das nicht bezeichnen. Du beziehst Dich ja auf völlig unterschiedliche "Objekte".
Das die zufällig gleich lautende Eigenschaften haben ist da nicht relevant.
In jeder Tabelle kann ja auch ein Feld ID vorkommen. Das ist ja dann auch nicht redundant.

Wenn Du Dich in beiden Tabellen auf die gleichen Personen beziehst (also dann Vorname und Nachname wirklich redundant wären), dann wäre eine Detailtabelle "Persons" der richtige Weg.

(Wenn ich Dein Problem richtig verstanden habe.)

EDIT @Sir: Dann habe ich wieder zu kompliztiert gedacht...

AlexII 24. Nov 2012 18:13

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von stahli (Beitrag 1192764)

Wenn Du Dich in beiden Tabellen auf die gleichen Personen beziehst (also dann Vorname und Nachname wirklich redundant wären), dann wäre eine Detailtabelle "Persons" der richtige Weg.

(Wenn ich Dein Problem richtig verstanden habe.)

Das schon, aber die Autoren und Entleiher kann mich ein eine Tabelle stecken, das ein Entleiher viel mehr Attribute hat. :roteyes:

AlexII 24. Nov 2012 18:14

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1192763)
Zitat:

Zitat von AlexII (Beitrag 1192760)
Aber wenn ich die Attribute Vor- u. Nachname in der Tabelle "autor" und "entleiher" habe, hab ich ne Redundanz. Was mach ich da nun...? :gruebel:

autor_vorname, autor_nachname, ...

Was meinst du genau? :gruebel:

stahli 24. Nov 2012 18:43

AW: Auf ein Attribut doppelt zugreifen?
 
Also wenn ich richtig lag:

Autor ist Autor und Entleiher ist Entleiher.
Jede Tabelle darf einen Vornamen und Nachnamen verwalten.
Das würde ich nicht weiter normalisieren.

Wenn aber ein Autor auch ein Entleiher sein kann (also die gleiche Person gemeint ist), dann würde ich eine Tabelle "Personen" einführen, die die gemeinsamen Daten verwaltet.
Einen Bezug gibt es dann über die PersonenId.
Die Autoren- und Entleihertabellen können ja dann zusätzliche Felder einführen.

Wichtig wäre im Sinne einer Normalisierung, dass nicht in mehreren Tabellen die SELBEN Dinge beschrieben werden.
Gleichnamige Eigenschaften sehe ich nicht als Problem.

himitsu 24. Nov 2012 18:54

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat:

Zitat von AlexII (Beitrag 1192766)
autor_vorname, autor_nachname, ...

Was meinst du genau? :gruebel:
Siehe mein Post:

xname = verleiher_vorname
aname = autor_vorname

Und das Selbe nochmal für *_nachname.


Und was die Anderen auch noch meinten:
Warum hast du denn Anrede, Vorwahl, eMail und Telefon nicht auch in eigene Tabellen ausgelager? :stupid:
bzw. Andersrum: Man kann auch eine Tabelle Person habne, wo sowas wie Anrede, Titel, Vorname, Nachname drinsteht, was ja praktisch auf Autor und Verleiher zutrifft.
So hast du "eine" Tabelle für Personen, was auch die globale Suche vereinfacht. Suche jetzt mal nach einer "Person", von der du Vor-/Nachname kennst, aber nicht weißt was sie ist. Du müßtest also 2 mindestens 4 Tabellen durchsuchen und dann auch noch jeden Bestandteil wo anders und die Zusammenhänge dann über 2 Haupttabelle verbinden.

AlexII 24. Nov 2012 19:40

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von himitsu (Beitrag 1192771)

xname = verleiher_vorname
aname = autor_vorname

Und das Selbe nochmal für *_nachname.

Du meinst in der Tabelle "nachname"-> nachname1 und nachname2, sowie in der Tabelle "vorname"-> vorname1, vorname2?

Zitat:

Zitat von himitsu (Beitrag 1192771)
Man kann auch eine Tabelle Person haben, wo sowas wie Anrede, Titel, Vorname, Nachname drinsteht, was ja praktisch auf Autor und Verleiher zutrifft.

Aber dann haben alle Autoren leere E-Mails, Telefon usw... das darf mach doch nicht zulassen, oder?

Lemmy 24. Nov 2012 19:43

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von AlexII (Beitrag 1192765)
Zitat:

Zitat von stahli (Beitrag 1192764)

Wenn Du Dich in beiden Tabellen auf die gleichen Personen beziehst (also dann Vorname und Nachname wirklich redundant wären), dann wäre eine Detailtabelle "Persons" der richtige Weg.

(Wenn ich Dein Problem richtig verstanden habe.)

Das schon, aber die Autoren und Entleiher kann mich ein eine Tabelle stecken, das ein Entleiher viel mehr Attribute hat. :roteyes:

Das hat auch niemand behauptet....

Code:
Table Person (
ID, Name, Vorname [, Anschrift]);

Table Entleiher (
ID, Person_ID, ....);

Table Autor (
ID, Person_ID,....);
Oder was machst Du wenn mal ein Autor ein Buch leihen will - doppelt anlegen?

Grüße

AlexII 24. Nov 2012 19:48

AW: Auf ein Attribut doppelt zugreifen?
 
Irgendwie bin ich durcheinander... :roteyes: Wie setze ich den diese drei Tabellen + Tabelle "buch" in eine Verbindung bzw. Beziehung? :gruebel:

Lemmy 24. Nov 2012 20:09

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von AlexII (Beitrag 1192776)
Irgendwie bin ich durcheinander... :roteyes: Wie setze ich den diese drei Tabellen + Tabelle "buch" in eine Verbindung bzw. Beziehung? :gruebel:

Code:
Tabelle Buch (
ID, Titel, Autor_ID, ISBN,...)

Tablle Leihe (
ID, Entleiher_ID, Buch_ID,...)
)
so vielleicht?

AlexII 24. Nov 2012 20:35

AW: Auf ein Attribut doppelt zugreifen?
 
Wozu dann die Tabelle Person? :roteyes:

Sir Rufo 24. Nov 2012 20:41

AW: Auf ein Attribut doppelt zugreifen?
 
Nimm mal das Playmobil zur Hand und spiele das durch, evtl. hilft das beim Verständnis.

Und wichtig, erstmal nicht an Computer und Datenbank denken.
Irgendwann stoppen und die Situation einfach mal betrachten und versuchen so genau wie möglich zu beschreiben.

Lemmy 24. Nov 2012 22:21

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von AlexII (Beitrag 1192779)
Wozu dann die Tabelle Person? :roteyes:

Um die Felder, die sowohl beim Autor als auch beim Entleiher enthalten sind zu halten, also Name, VOrname, evtl. Anschrift - letztlich eine Adresstabelle. Auf diese Tabelle wird von Autor und Entleiher verwiesen wenn man Namen/Anschrift benötigt. Die Spezialfelder für die Autoren (z.B. Verlag) und Entleiher (z.B. Laufzeit der aktuellen Karte) sind dann in den entsprechenden Tabellen drin.

Beim Anlegen eines Buches wird in Buch und in Autor (wenn noch nciht vorhanden) ein EIntrag angelegt - damit auch in Person (Name). Wird ein Entleiher angelegt ein Eintrag in Entleiher und Person.

Wird nun ein Buch verliehen kommt ein Eintrag in Leihe rein.

und um dich jetzt komplett zu verwirren:

Ich persönlich würde aber auf die Personentabelle verzichten und das wie schon weiter oben beschrieben Name/Anschrift in Autor bzw. Entleiher packen. Es macht an der Stelle schlicht keinen Sinn sondern nur Aufwand diese Normalisierung zu betreiben.

Die Unterscheidung der beiden identischen Felder kannst Du über den Tabellennamen lösen:

Code:
Select Autor.Name, Entleiher.Name from
Leihe join buch...
Oder du gehst einen Schritt weiter und definierst die Tabellen mit einem Suffix:

Code:
Tabelle Aut_Autor ( Aut_ID, Aut_Name, Aut_Vorname,...)
Tabelle Ent_Entleiher (Ent_ID, Ent_Name, Ent_VOrname,...)

Grüße

himitsu 24. Nov 2012 23:56

AW: Auf ein Attribut doppelt zugreifen?
 
Zitat:

Zitat von AlexII (Beitrag 1192774)
Du meinst in der Tabelle "nachname"-> nachname1 und nachname2, sowie in der Tabelle "vorname"-> vorname1, vorname2?

Jupp.
Du holst aus den Tabellen "vorname" und "nachname" für beide Personen raus und benennst sie im SELECT um.
(
Delphi-Quellcode:
table1.vorname AS vorname1, table1.nachname AS nachname1, table2.vorname AS vorname2, table2.nachname AS nachname2,
oder wie auch immer)
Innerhalb deines SQL-Aufrufest kann man über Namespace/Tabellenname/Tabellenalias zwar geziehtl auf "Felder" einer bestimmten Tabelle zugreifen, aber die zurückgegebene "Tabelle" (Result-Tabelle) hat erstmal grudsätzlich keine Namespace/Tabellenname/Tabellenalias mehr drinnen, so daß jedes Feld einen eindeutigen Namen benötigt.
Genauso wie man innerhalb des SQL-Befehls ein Namespace/Tabellenname/Tabellenalias angeben muß, wenn ein Feld nicht eindeutig zuordenbar ist, weil es in mehreren der geladenen Tabellen vorkommt.

Zitat:

Zitat von AlexII (Beitrag 1192774)
Aber dann haben alle Autoren leere E-Mails, Telefon usw... das darf mach doch nicht zulassen, oder?

Und was ist, wenn du von einem Autor doch mal eine E-Mail oder gar seine Telefonnummer hast?
Nja, praktisch gemeinsame Dinge würden in die "Personennamen"-Tabelle reinkommen, also mindestens alles, was zum Namen gehört.
(Vor-, Nachname, Titel, Anrede)
Was ist eigentlich mit zweiten Vornamen und Dergleichen?

Du könntest ja eine Kontaktdaten-Tabelle machen (eMail, Telefon, Adresse, ...) und dann dem Entleiher als NOT NULL zuordnen, sowie den Autor als NULL, fall doch mal Eine dazukommt.
Bzw. Eben die "Personen" zusammen in eine Tabelle mit einer NULL--Referenz auf die Kontakte und von Autor, sowie Entleiher nur eine Referenz auf die Personentabelle.

Ach ja, wie oft kommt es denn vor, daß Bücher gleich heißen?
Die Buchtiteltabelle ist ja praktisch auch unnötig kompliziert, anstatt den Titel direkt in Buch drinnen zu haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:23 Uhr.

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