Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DB Modell für Fahrzeug, Marke, Modell? (https://www.delphipraxis.net/174124-db-modell-fuer-fahrzeug-marke-modell.html)

AlexII 5. Apr 2013 12:56

Datenbank: SQLite • Version: 3 • Zugriff über: SimpleDelphi-Wrappers von Tim Anderson

DB Modell für Fahrzeug, Marke, Modell?
 
Hallo Jungs,

ich habe ein kleines logisches Problemchen, überlege gerade wie ich für ein Fahrzeug die Marke und das Modell in einer DB designen soll? Das ich Fahrzeug mit Marke mit einer n:1 Beziehung verbinden soll ist klar, aber wie schaffe ich es zu jeder Marke alle Modelle anzuzeigen. Muss ich für jede Marke eigene Modelltabelle erstellen oder das irgendwie mit IDs lösen?

Hoffe hab das Problem verständlich geschildert.

Danke!

DeddyH 5. Apr 2013 13:00

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Code:
Tabelle Marke
=============
ID
Bezeichnung

Tabelle Modell
==============
ID
Bezeichnung
Marke_ID /* Fremdschlüssel auf Marke */

Tabelle Fahrzeug
================
ID
<Sonstige Felder>
Modell_ID /* Fremdschlüssel auf Modell */

AlexII 5. Apr 2013 13:22

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Aber ich muss doch vor dem Einfügen eines Fahrzeugs erst die Marke wählen und erst dann das Modell. :|
Bei dir wird aber erst das Modell gewählt wenn ich das richtig verstehe, siehe Screenshot...

DeddyH 5. Apr 2013 13:26

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Wie, wählen? Eine Marke führt im Allgemeinen mehrere Modelle, und normalerweise wird von jedem Modell mehr als ein Exemplar gebaut, somit ergibt sich je eine 1:n-Beziehung zwischen Marke und Modell sowie zwischen Modell und Fahrzeug.

AlexII 5. Apr 2013 13:36

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Aber wie trenne ich z.B. alle Audi Modelle von VW Modellen? Sie sind ja alle in einer Tabelle. :|

DeddyH 5. Apr 2013 13:37

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Sie haben aber unterschiedliche Marke_ID-Werte.

p80286 5. Apr 2013 13:39

AW: DB Modell für Fahrzeug, Marke, Modell?
 
durch die unterschiedlichen Marken?

Gruß
K-H

der rote mag mich nicht!!

AlexII 5. Apr 2013 13:45

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Ok... hm... :gruebel:

Wie könnte dann z.B. eine Select-Abfrage aussehen wenn ich ein Fahrzeug mit roter Farbe von Audi suche, das Modell Q7 ist? :gruebel:

Jumpy 5. Apr 2013 14:12

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Code:
Select Fahrzeug.* From Fahrzeug, Modell
Where Fahrzeug.Farbei='rot'
and Modell.Bezeichnung='Q7'
Nach Audi brauchste nicht fragen, da ja Q7 automatisch von Audi ist.

p80286 5. Apr 2013 14:13

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Code:
select irgendwas
from Marke,Modell,Fahrzeug
where Marke.ID=Modell.Marke_ID
  and Fahrzeug.Modell_ID=Modell.ID
  and Fahrzeug.Farbe='rot'
  and Marke.Bezeichnung='Audi'
  and Modell.Bezeichnung='Q7'
ungefähr so
(darauf das Q7 immer ein Audi-Modell ist, würde ich mich nicht verlassen)

Gruß
K-H

Sir Rufo 5. Apr 2013 14:16

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Zitat:

Zitat von Jumpy (Beitrag 1210115)
Code:
Select Fahrzeug.* From Fahrzeug, Modell
Where Fahrzeug.Farbei='rot'
and Modell.Bezeichnung='Q7'
Nach Audi brauchste nicht fragen, da ja Q7 automatisch von Audi ist.

Die Abfrage ist aber auch nur solange eindeutig, wie es tatsächlich keine "Q7" Modelle von anderen Marken gibt.
Somit also besser so abfragen
SQL-Code:
SELECT Fahrzeug.* 
  FROM Fahrzeug
  JOIN Modell ON Fahrzeug.Modell_ID = Modell.ID
  JOIN Marke ON Modell.Marke_ID   = Marke.ID
 WHERE Fahrzeug.Farbe    = 'rot'
   AND Marke.Bezeichnung = 'Audi'
   AND Modell.Bezeichnung = 'Q7'

jfheins 5. Apr 2013 14:19

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210117)
Somit also besser so abfragen
SQL-Code:
SELECT Fahrzeug.* 
  FROM Fahrzeug, Marke, Modell
 WHERE Fahrzeug.Farbe    = 'rot'
   AND Marke.Bezeichnung = 'Audi'
   AND Modell.Bezeichnung = 'Q7'

Möööp, du hast die JOIN-Bedingungen vergessen :mrgreen:

bzw. nachträglich reineditiert. So kann man's lassen. Und du bekommst einen virtuellen Keks für die Verwendung von JOIN ON statt alles in das where reinzupacken ;-)

p80286 5. Apr 2013 14:23

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Zitat:

Zitat von jfheins (Beitrag 1210118)
Und du bekommst einen virtuellen Keks für die Verwendung von JOIN ON statt alles in das where reinzupacken ;-)

Das hab ich gelesen!

:duck:

Gruß
K-H

Sir Rufo 5. Apr 2013 14:39

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Wenn man es noch genauer haben möchte, dann muss man auch noch die Modellvariante berücksichtigen
Code:
Marke
- ID
- Bezeichnung

Modell
- ID
- Marke_ID
- Bezeichnung

Variante
- ID
- Modell_ID
- Bezeichnung
Für die Auswahl des entsprechenden Modells (z.B. in einer ComboBox/ListBox) nimmt man dann folgende Abfrage
SQL-Code:
  SELECT Variante.ID AS ID,
         CONCAT( Marke.Bezeichnung, ' - ', Modell.Bezeichnung, ' (', Variante.Bezeichnung, ')' ) AS Bezeichnung
    FROM Variante
    JOIN Modell ON Variante.Modell_ID = Modell.ID
    JOIN Marke ON Modell.Marke_ID = Marke.ID
ORDER BY Marke.Bezeichnung, Modell.Bezeichnung, Variante.Bezeichnung
Will man für Marke, Modell, Variante jeweils eine ComboBox/ListBox haben, so sehen die Abfragen wie folgt aus (Master-Detail)
Marke:
SQL-Code:
  SELECT ID, Bezeichnung
    FROM Marke
ORDER BY Bezeichnung
Modell (Detail von Marke):
SQL-Code:
  SELECT ID, Bezeichnung
    FROM Modell
   WHERE Marke_ID = :ID
ORDER BY Bezeichnung
Variante (Detail von Modell):
SQL-Code:
  SELECT ID, Bezeichnung
    FROM Variante
   WHERE Modell_ID = :ID
ORDER BY Bezeichnung
Gespeichert wird aber immer nur die Varianten-ID, die anderen (Marke,Modell) sind nur für die Eingrenzung von Modell und Variante

AlexII 5. Apr 2013 16:05

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab jetzt folgendes Diagramm, siehe Anhang...

Was passiert wenn ich kein Modell oder Variante eingebe, dann kracht doch die ganze Beziehung zusammen, oder? Ich gebe die Marke an und fertig, wie kommt die Beziehung zustande wenn dazwischen Modell oder Variante fehlt? :|

p80286 5. Apr 2013 16:18

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Wenn Du nur die Marke angibst, z.B. 'Audi' dann erhälst Du als Ergebnis alle Audi-Modelle in allen Farben, Motorvarianten, ......

Gruß
K-H

DeddyH 5. Apr 2013 16:18

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Wo ist denn die Beziehung zwischen Fahrzeug und Variante?

AlexII 5. Apr 2013 16:20

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Zitat:

Zitat von DeddyH (Beitrag 1210172)
Wo ist denn die Beziehung zwischen Fahrzeug und Variante?

Siehe mein Screenshot

p80286 5. Apr 2013 16:24

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Zitat:

Zitat von AlexII (Beitrag 1210173)
Zitat:

Zitat von DeddyH (Beitrag 1210172)
Wo ist denn die Beziehung zwischen Fahrzeug und Variante?

Siehe mein Screenshot

Da ist aber nichts! der Fremdschlüssel für die Verbindung Fahrzeug => Variante fehlt.

Gruß
K-H

AlexII 5. Apr 2013 16:27

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, hab' übersehen...

DeddyH 5. Apr 2013 16:34

AW: DB Modell für Fahrzeug, Marke, Modell?
 
So, das Grundgerüst (aus dem man auch eine View basteln könnte) für eine Abfrage über alle Tabellen sollte etwa so aussehen:
SQL-Code:
SELECT
  H.Bezeichnung as Hersteller,
  M.Bezeichnung as Modell,
  V.Bezeichnung as Variante,
  F.Bezeichnung as Fahrzeug
FROM
  marke H
  JOIN
    modell M ON M.marke_id = H.id
  JOIN
    variante V ON V.modell_id = M.id
  JOIN
    fahrzeug F ON f.variante_id = V.id
Das kann man dann auch noch filtern (WHERE-Bedingung), z.B. auf alle Audi beschränken:
SQL-Code:
SELECT
  H.Bezeichnung as Hersteller,
  M.Bezeichnung as Modell,
  V.Bezeichnung as Variante,
  F.Bezeichnung as Fahrzeug
FROM
  marke H
  JOIN
    modell M ON M.marke_id = H.id
  JOIN
    variante V ON V.modell_id = M.id
  JOIN
    fahrzeug F ON f.variante_id = V.id
WHERE
  H.Bezeichnung = 'Audi'
Will man weiter eingrenzen, muss nur die WHERE-Klausel erweitert werden.

AlexII 5. Apr 2013 16:39

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Danke dir, aber ich hab den DB-Entwurf noch nicht fertig. :roteyes:
Siehe Post #15 und #20

Sir Rufo 5. Apr 2013 16:58

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Und wo ist jetzt das Problem?

Das Schema ist doch fertig ...

p80286 5. Apr 2013 17:06

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Es gibt doch so visuelle Tools, da mußt Du nur richtig zeichnen und schon hast Du eine DB.

Gruß
K-H

AlexII 5. Apr 2013 17:10

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sir Rufo (Beitrag 1210182)
Und wo ist jetzt das Problem?

Das Schema ist doch fertig ...

Mein Problem ist: Was passiert wenn ich kein Modell oder Variante eingebe, dann kracht doch die ganze Beziehung zusammen, oder? Ich gebe die Marke an und fertig, wie kommt die Beziehung zustande wenn dazwischen Modell oder Variante fehlt? :gruebel:

Sir Rufo 5. Apr 2013 17:13

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Überlegen wir mal ...

du willst zu dem Fahrzeug die genaue Modellbezeichnung (die besteht nun mal aus der Marke, dem Modell, der Variante) ...

dann geht das einfach nicht zu speichern, weil du nicht alle Informationen hast.

Das ist wie mit dem Geburtsdatum, wenn ich nur den Tag habe, kann ich das auch nicht als Datum speichern.

jfheins 5. Apr 2013 17:39

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Man könnte dafür eine "Unbekannt"-Variante und ein "Unbekannt"-Modell einführen :-)

Also quasi bei einem solchen Eintrag eine neue Variante und ein neues Modell anlegen. Das sollte dann vielleicht noch ein Flag bekommen damit man "richtige" von "falschen" Modellen unterschieden kann.

AlexII 5. Apr 2013 17:46

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Ich muss aber aus bestimmten Gründen das ganze so gestalten, dass die Marke, das Modell oder die Variante nicht eingegeben werden müssen. Ich weiß kling unrealistisch, muss aber so sein... der Kunde ist König wie man so schön sagt.

Oder kann ich einfach die Fremdschlüssel auf nil setzen und gut ist es?

Sir Rufo 5. Apr 2013 17:51

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Dann musst du dir eben alle drei Schlüssel in dem Datensatz merken.
Marke, Modell, Variante

DeddyH 5. Apr 2013 17:53

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Entweder fügst Du je Marke ein "Unbekannt"-Modell, dann je Modell eine "Unbekannt"-Variante ein und weist die dann je nach Informationsgehalt zu, oder die machst den Fremdschlüssel auf die Variante nullable und weist dem Fahrzeug dann NULL als variante_id zu.

AlexII 5. Apr 2013 17:54

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210203)
Dann musst du dir eben alle drei Schlüssel in dem Datensatz merken.
Marke, Modell, Variante

Wie kann ich mir das vorstellen, was meinst du mit "merken"?

DeddyH 5. Apr 2013 18:09

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Hast Du mal über den Vorschlag von jfheins und mir nachgedacht? Wenn da einer kommt und sagt: "ST-FU 42 ist irgend so' n BMW", dann kannst Du als Variante den Schlüssel zum "Unbekannt"-Eintrag (Variante), der zum "Unbekannt-Eintrag" (Modell) für BMW gehört, eintragen. Du musst aber dann auch bei jedem neuen Modell bzw. jeder neuen Marke dafür sorgen, dass es einen solchen Eintrag gibt.

AlexII 5. Apr 2013 18:27

AW: DB Modell für Fahrzeug, Marke, Modell?
 
Ok, ich glaube bei mir hat's geleuchtet. :coder2:

Danke euch, ich mach mich auf die Arbeit. 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 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-2025 by Thomas Breitkreuz