FK-Beziehung mit 2 Tabellen

23/03/2009 - 18:47 von Georg Gungl | Report spam
Hallo NG,

ich muss 2 Tabellen mit Informationen erweitern:

[T1 ]
[PK|Id |int ]
[PK|Category|smallint]
[ |... |... ]

und

[T2 ]
[PK|Id |int ]
[PK|Category|smallint]
[ |... |... ]

Geplant eine neue Tabelle:

[T12_Extensions ]
[PK|Id |int ]
[FK|FId |int ]
[FK|FCategory|smallint ]
[ |Source |'T1','T2']
[ |NewVal1 |... ]
[ |NewVal2 |... ]
[ |... |... ]

Wie kann ich sicherstellen, dass in [T12_Extensions] die Kombination
FId+Fcategory entsprechend Source gegen PK in T1 bzw. T2 geprüft wird?

Fremschlüsselbeziehung mit 2 Tabellen, geht das?!
Oder CHECK, aber wie die Kombination mit 3 bzw. 2 Spalten?

Ciao:
GG ;-)
 

Lesen sie die antworten

#1 Elmar Boye
24/03/2009 - 08:57 | Warnen spam
Hallo Georg,

Georg Gungl schrieb:
ich muss 2 Tabellen mit Informationen erweitern:

[T1 ]
[PK|Id |int ]
[PK|Category|smallint]
[ |... |... ]

und

[T2 ]
[PK|Id |int ]
[PK|Category|smallint]
[ |... |... ]

Geplant eine neue Tabelle:

[T12_Extensions ]
[PK|Id |int ]
[FK|FId |int ]
[FK|FCategory|smallint ]
[ |Source |'T1','T2']
[ |NewVal1 |... ]
[ |NewVal2 |... ]
[ |... |... ]

Wie kann ich sicherstellen, dass in [T12_Extensions] die Kombination
FId+Fcategory entsprechend Source gegen PK in T1 bzw. T2 geprüft wird?



Gar nicht.
Ein Fremdschlüssel-Einschrànkung darf nur von den
Primàrschlüsselspalten der Referenztabelle abhàngig
sein und nichts weiter.

Fremschlüsselbeziehung mit 2 Tabellen, geht das?!



Das Konstrukt widerspricht den Normalierungsregeln:
<URL:http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)>

Um es zu verdeutlichen: Auch wenn Deine beiden Spalten "Id"
heißen und beide den physikalischen Typ Integer haben,
so sind sie im Datenmodell unterschiedliche Datentypen.

Gleiches kann auf die Category zutreffen, wenn sie nicht
keinen Bezug aus einer (nicht gezeigten) Tabelle haben.

Die relationale Lösung lautet hier: Zwei Tabellen,
die jeweils eine 1 : 1 Relation haben.

Willst Du die Daten zusammen darstellen, so kannst Du
eine Sicht erstellen und dort eine "Source" Spalte
zur Unterscheidung einfügen, also z. B.

SELECT Id, Category, 'T1' AS Source, NewVal1, NewVal2
FROM T1
UNION ALL
SELECT Id, Category, 'T2' AS Source, NewVal1, NewVal2
FROM T2

Willst Du Daten dieser Sicht aktualisieren, so mußt Du
separate DML Anweisungen schreiben, was z. B. durch
eine Prozedur oder einen INSTEAD OF Trigger (SQL Server)
erfolgen kann.

Gruß Elmar

Ähnliche fragen