AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Auf ein Attribut doppelt zugreifen?
Thema durchsuchen
Ansicht
Themen-Optionen

Auf ein Attribut doppelt zugreifen?

Ein Thema von AlexII · begonnen am 24. Nov 2012 · letzter Beitrag vom 24. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#1

Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 15:58
Datenbank: SQLite • Version: 3 • Zugriff über: SQLite4Delphi Wrapper von Tim Anderson
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');
Miniaturansicht angehängter Grafiken
erm-dia.png  
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.143 Beiträge
 
Delphi 12 Athens
 
#2

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 16:15
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.




Sind das soooooviele Namen?
Ich hätte Vor- und Nachname in einer ID-Vorname-Nachname-Tabelle erwartet. (eventuell mit nochmer)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Nov 2012 um 16:52 Uhr)
  Mit Zitat antworten Zitat
Alt 24. Nov 2012, 16:28     Erstellt von sx2008
Dieser Beitrag wurde von MrSpock gelöscht. - Grund: Vom TE gewünscht.
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 16:30
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".
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 16:42
Aber wenn ich die Attribute Vor- u. Nachname in der Tabelle "autor" und "entleiher" habe, hab ich ne Redundanz. Was mach ich da nun...?
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 17:01
Aber wenn ich die Attribute Vor- u. Nachname in der Tabelle "autor" und "entleiher" habe, hab ich ne Redundanz. Was mach ich da nun...?
autor_vorname, autor_nachname, ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 17:07
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...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 17:13

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.
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 17:14
Aber wenn ich die Attribute Vor- u. Nachname in der Tabelle "autor" und "entleiher" habe, hab ich ne Redundanz. Was mach ich da nun...?
autor_vorname, autor_nachname, ...
Was meinst du genau?
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 17:43
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.143 Beiträge
 
Delphi 12 Athens
 
#10

AW: Auf ein Attribut doppelt zugreifen?

  Alt 24. Nov 2012, 17:54
Zitat:
autor_vorname, autor_nachname, ...
Was meinst du genau?
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?
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
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