Evitando le insidie di una relazione naturalmente ricorsiva tra i tavoli

0

Sto sviluppando un sistema per gestire "casi". Alla fine ci saranno molti "tipi" di casi, quindi ho iniziato con una tabella "CaseTemplate" che può essere utilizzata per definire l'aspetto di un caso e, tramite tabelle satellitari, definire le caratteristiche specifiche per un tipo di caso particolare .

Una tale caratteristica sono le fasi. Un caso può passare attraverso una serie di fasi, ma le fasi dipendono dal tipo di caso. Quindi, naturalmente, ho creato una tabella CasePhases con una relazione molti a uno con la tabella CaseTemplate (poiché ogni modello può definire le sue fasi).

Ma poi ho trovato un ostacolo ... a quale fase dovrebbe iniziare un caso? Il mio primo pensiero è stato che potevo semplicemente definire "StartingPhase" nella tabella CaseTemplate usando una chiave esterna, ma crea una relazione ricorsiva tra le tabelle CaseTemplate e CasePhases.

Suppongo di poter rendere nulla il campo StartingPhase e di non assegnare un valore all'inizio (aggiornando il record più tardi quando sono state definite le fasi per CaseTemplate e utilizzando la business logic per garantire che CaseTemplate abbia definito una fase iniziale). Oppure potrei aggiungere un campo "IsStartingPhase" alla tabella CasePhases (con alcune logiche di business per far sì che un Template possa avere solo una fase impostata come una fase iniziale). Entrambi hanno alcuni vantaggi e svantaggi, ma nessuno dei due mi sembra particolarmente elegante o perferenziale rispetto all'altro.

Devo credere che questo non sia uno scenario insolito. Ci sono delle migliori pratiche per gestire questa relazione con il database, forse una terminologia che mi manca? Sto cercando una spiegazione del dominio del problema con cui ho a che fare e forse alcuni approcci che non ho considerato.

Sto utilizzando un database relazionale (SQL Server), quindi le soluzioni che utilizzano tecnologie "esotiche" probabilmente non funzioneranno nel mio ambiente.

    
posta JDB 26.02.2014 - 16:00
fonte

0 risposte

Leggi altre domande sui tag