PDA

View Full Version : [Database] Id esterno che punta a più tabelle


tomminno
04-10-2010, 09:02
Mi trovo sempre di fronte al problema di come poter rappresentare al meglio una situazione in cui una tabella possa essere collegata a più tabelle tramite lo stesso campo.
Ad esempio ho una tabella generica per la descrizione dello stato di un servizio, e voglio legare questa tabella con le informazioni del servizio.
Ovviamente ogni servizio ha i propri dati e quindi ha una propria tabella.
Dato che nuovi servizi vengono aggiunti frequentemente e che comunque sono abbastanza numerosi (avere una trentina di chiavi esterne non mi sembra il massimo), la soluzione al momento è di avere una tabella TabellaServizi di appoggio contenente i valori Id-NomeTabella e nella tabella Servizi generica avere 2 colonne una con FK verso TabellaServizi e l'altra con Id non legato da alcun vincolo referenziale ma che indica l'Id del servizio vero e proprio. Per il recupero dei dati utilizzo viste specifiche che eseguono la join con la tabella indicata in TabellaServizi, perchè ovviamente le ricerche avvengono contestualmente ad un solo servizio.

Qualcuno ha una soluzione migliore?

Kralizek
04-10-2010, 09:41
non sono sicuro di aver capito esattamente il tuo problema, ma se non ho capito totalmente un'altra cosa, forse questo puó esserti utile anche se in realtá questa soluzione é una traduzione di una gerarchia di classi.


CREATE TABLE [Types]
(
ID INT NOT NULL PRIMARY KEY,
Name NVARCHAR(64) NOT NULL
)

CREATE TABLE BaseClass
(
ID INT NOT NULL PRIMARY KEY IDENTITY (1,1),
FKTypeID INT NOT NULL REFERENCES [Types](ID),
UNIQUE (ID, FKTypeID)
-- Additional base class fields here
)

CREATE TABLE SubClass1
(
FKBaseID INT NOT NULL REFERENCES BaseClass(ID),
FKTypeID AS (1) PERSISTED NOT NULL,
FOREIGN KEY (FKBaseID, FKTypeID) REFERENCES BaseClass(ID, FKTypeID)
-- Specific fields here
)

CREATE TABLE SubClass2
(
FKBaseID INT NOT NULL REFERENCES BaseClass(ID),
FKTypeID AS (2) PERSISTED NOT NULL,
FOREIGN KEY (FKBaseID, FKTypeID) REFERENCES BaseClass(ID, FKTypeID)
-- Specific fields here
)

nuovoUtente86
04-10-2010, 10:16
puoi fare un esempio pratico in modo da inquadrare bene il dominio del problema?

tomminno
04-10-2010, 10:25
In parte si. Fondamentalmente è una gerarchia di classi che estendono la classe base che contiene solo le informazioni comuni.
Il problema è che altre entità del database (es ordini, utenti ecc.) fanno riferimento solo alla tabella base, quindi è questa che deve essere legata alle "tabelle derivate" per consentire di recuperare i dettagli del servizio.