![]() |
Datenbank: Firebird • Version: 2 • Zugriff über: egal
FB: Foreign Key mit Null
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 |
AW: FB: Foreign Key mit Null
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.
|
AW: FB: Foreign Key mit Null
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. |
AW: FB: Foreign Key mit Null
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 |
AW: FB: Foreign Key mit Null
Zitat:
|
AW: FB: Foreign Key mit Null
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. |
AW: FB: Foreign Key mit Null
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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