Ho eseguito di recente questo scenario più volte in diversi progetti. Ecco un diagramma di quattro tabelle, etichettati con le lettere:Progettazione di relazioni a quattro tabelle
A
1/\ 1
/ \
*/ \ *
B C
1 \ /1
\ /
* \/*
D
In questo scenario, è possibile che i dati di diventare incoerente se le chiavi da B
a A
e C
a A
non corrispondono per un dato D
.
Per una specifica (fatta) ad esempio, immaginare A
è Company
, B
è Employee
, C
è Project
, e D
è WorkItem
. In questo caso, non c'è nulla che impedisca la creazione di un oggetto di lavoro che afferma di essere assegnato a una persona che non lavora nemmeno per la società proprietaria del progetto.
Sono principalmente curioso, c'è una soluzione a questo problema? So che nelle applicazioni reali, dove questo è importante, puoi usare i trigger o altre protezioni. Non ho trovato un modo per cambiare le tabelle per rendere impossibile tale incoerenza. C'è un modo?
Si noti che solo recidere una delle connessioni, come C
-A
non funziona, perché se non esistono D
's per quella C
si avrebbe modo di tracciare le connessioni di nuovo a A
.
Buona domanda. Ho sempre messo delle protezioni per prevenire questo tipo di cose nel livello dell'applicazione. Sarà interessante vedere cosa hanno da dire gli altri. –
Io uso per applicare questo tipo di restrizione nelle regole aziendali, non come trigger. –
Ridefinisci le tue entità: dipendente - >> persona (ricorda: un ex-emplyee è stato un dipendente una volta) Può essere necessario aggiungere un asse temporale (e alcune altre dimensioni extra; cercare le dimensioni nascoste). – wildplasser