AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FB: Foreign Key mit Null

Ein Thema von hoika · begonnen am 22. Dez 2011 · letzter Beitrag vom 22. Dez 2011
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

FB: Foreign Key mit Null

  Alt 22. Dez 2011, 09:14
Datenbank: Firebird • Version: 2 • Zugriff über: egal
Hallo #,

ich bin ja gerade etwas perplex.

Create Table Rechnung(RechnungsId Integer Not Null, Primary Key(RechnungsId));

Create Table RechnungsPosition(RechnungsPositionId Integer Not Null, RechnungsId Integer,
Primary Key(RechnungsPositionId));

Jetzt lege ich einen ForeignKey an

alter table RechnungsPosition
add constraint FK_RPOS
foreign key (RechnungsId)
references Rechnung(RechnungsId)


Das schlimme ist, es funktioniert !!!

Ich kann jetzt in die Tabelle RechnungsPosition Positionen eintragen,
die gar keiner Rechnung zugeordnet sind, indem ich bei RechnungsId NULL eintrage !!!

Ja, ich weiss, RechnungsId ist hier Integer, nicht Integer Not Null,
aber in meiner etwas längeren DB-Erfahrung lerne ich gerade etwas dazu.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: FB: Foreign Key mit Null

  Alt 22. Dez 2011, 09:42
Und was findest Du daran ungewöhnlich? Ein ForeignKey ist ja dazu da, eine Beziehung zu einer anderen Tabelle herzustellen. Das muss aber nicht immer heißen, dass da auch Daten dahinterstecken müssen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#3

AW: FB: Foreign Key mit Null

  Alt 22. Dez 2011, 09:59
Nun ja. Eigentlich ist es schon ungewohnt.

Aber es wird implizit (oder eigentlich fast explizit) durch die Definition "INTEGER" statt "INTEGER NOT NULL" so angegeben. Man muss nur wissen, wie man das lesen soll.

Ich persönlich vermeide das allerdings, weil ich für die Abfrage der FK-Beziehung ein LEFT JOIN nehmen müsste, was i.a. langsamer ist. Ich erzeuge mir in der Fremdtabelle dann einen leeren Datensatz, idealerweise mit der PK-ID=0. Natürlich nur, falls es notwendig ist und Sinn ergibt.

Bei Dir ist es ja so, das Rechnungspositionen ohne Rechnungen absolut katastrophal wären. Insofern sollte der FK schon als NOT NULL deklariert sein.

Bei hierarchischen Beziehungen dagegen ist es imho die einzige Möglichkeit, einen Eintrag ohne übergeordneten Vorgänger (z.B. Wurzelknoten eines Baumes) zu definieren: Hier ist der Vorgänger dann NULL. Alles andere wären Tricks (die Wurzel hat sich selbst als Vorgänger, oder ganz auf FK verzichten), die nur Probleme bereiten.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: FB: Foreign Key mit Null

  Alt 22. Dez 2011, 10:27
Hallo,

DeddyH:
Ich habe halt immer das Bsp. mit Rechnung/Rechnungsposition im Kopf,
dass da auch NULL's drinstehen können, habe ich verdrängt

Ivo:
Genau so mache ich es auch immer (Not Null).
Stellenweise arbeite ich auch mit dem 0 wegen dem inner join.


Heiko
Heiko
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: FB: Foreign Key mit Null

  Alt 22. Dez 2011, 11:02
ein LEFT JOIN nehmen müsste, was i.a. langsamer ist.
Das sehe ich genau anderes herum, aber egal.
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#6

AW: FB: Foreign Key mit Null

  Alt 22. Dez 2011, 13:51
bei einem LEFT JOIN ist die Engine gezwungen, die linke Tabelle durchzurennen (oder den Index)
Bei einem JOIN hat sie Möglichkeit, den kleineren Index zu nehmen.
... Aber, warte mal... Stimmt, meine Aussage war zu allgemein. Im o.g. Anwendungsfall könnte es marginal schneller sein, mit LEFT JOIN und NULL zu arbeiten, weil die Ergebnismenge kleiner ist.

Geändert von Iwo Asnet (22. Dez 2011 um 13:54 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: FB: Foreign Key mit Null

  Alt 22. Dez 2011, 17:05
Hallo,

zur Not ausprobieren.
Aber FB hat ja schon immer Performance-"Probleme" mit outer joins,
wobei es mit jeder Version i.d.R. besser wird.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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:49 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