Mi sono imbattuto in un problema di progettazione di database che è fuori dalla mia portata e il mio guru DBA non è andato a fuoco.
In sostanza, ho una tabella con la seguente chiave primaria (PK per brevità):
child_id integer
parent_id integer
date datetime
child_id
e parent_id
sono chiavi esterne delle tabelle entità. La stessa tabella "figlio" contiene anche una chiave esterna per la tabella "padre", e lo, ognuno fa child_id
sempre riferimento allo stesso parent_id
previsto dalla tabella sopra. In effetti, risulta che c'è un po 'di codice in più per mantenere i due in sincronia.
Il che rende questo novizio entusiasta della normalizzazione dire "Dovrei rimuovere la ridondanza invece!"
Mi decompongo come segue:
Table_1 PK:
child_id integer
date datetime
Table_2 PK:
parent_id integer
date datetime
Table_3: (already exists)
child_id integer PRIMARY KEY
parent_id integer FOREIGN KEY
Ed ecco, quando mi unisco a questi ragazzi in modo naturale, riprendo il tavolo originale. È la mia comprensione che rende questo 5NF.
Tuttavia, ora mi rendo conto che esiste una regola aziendale nascosta.
Normalmente, le date associate a un dato child_id
devono essere un sottoinsieme delle date associate al corrispondente parent_id
. Puoi vedere che la prima tabella applica questa regola.
La mia decomposizione non impone la regola, perché puoi aggiungere liberamente alla Tabella 1 fino a quando le date non diventano troppo grandi.
Il che mi porta qui, con le seguenti domande:
Questa decomposizione è 5NF? Mentre direi che consente anomalie di inserimento, sembra anche seguire l'esempio Wiki, che a sua volta segue questa guida . La frase (sottolineatura mia) "possiamo ricostruire tutti i fatti reali da una forma normalizzata composta da tre tipi di record separati" mi dà una pausa speciale, dal momento che, indipendentemente dalla quantità di immondizia in cui pompare
Table_1
, l'unione naturale la ignora ancora.Supponendo che questa decomposizione non mi piaccia (non mi piace). Riconosco liberamente che la soluzione pratica è lasciare la tabella e il codice così come sono. Ma, in teoria, c'è un modo per scomporre e / o aggiungere vincoli in modo tale che mi allontani dal primo tavolo e preservi le mie regole aziendali?