Newsgroup: it.comp.software.database
Titolo: Come normalizzare questa struttura.

Salve!
Ho la tabella RigaOrdine dove mi ritrovo un sacco di campi e vorrei riuscire 
a portarla in terza forma normale.
Nella tabella RigaOrdine c'è un campo "TipoRiga" che può assumere diversi 
valori.
Se TipoRiga assume il valore 'C' la riga è un commento e il campo Codice 
rimane null (e tutti i campi conseguenti come Unità di misura, Quantità e 
Prezzo) mentre viene riempito il campo Commento
Se TipoRiga assume il valore 'R' la riga è una vera riga d'ordine e quindi 
il campo Commento rimane null mentre il campo Codice viene valorizzato con 
l'articolo da ordinare (e ovviamente vengono valorizzati i campi conseguenti 
detti sopra).
Per normalizzare questa struttura potrei creare la seguente struttura:
Righe (NumOrdine, NumRiga) PK(NumOrdine, NumRiga)
RigheCommento (NumOrdine, NumRiga, Commento) PK(NumOrdine, NumRiga)
RigheArticolo (NumOrdine, NumRiga, CodiceArticolo, UnitàMisura, Quantità, 
Prezzo) PK(NumOrdine, NumRiga)
e legare Righe con RigheCommento con una relazione 1-1 e Righe con 
RigheArticolo con un'altra relazione 1-1
Con questa struttura niente però mi impedisce di "specializzare" lo stesso 
record della tabella Righe sia in RigaCommento, sia in RigaArticolo, e 
ovviamente questa è una situazione che deve essere evitata.
Esiste una struttura migliore di quella che ho pensato per ottenere 
l'obiettivo che mi pongo?
Grazie
Ciao
Cricca 

 ovviamente questa è una situazione che deve essere evitata.
Cambia la chiave di Righe().

> Cambia la chiave di Righe().
Potresti essere più preciso?

 Potresti essere più preciso?
Sì, intendevo di usare per chiave di Righe un sottoinsieme degli 
attributi invece di tutti e due.
Rileggendo ho capito però che io non avevo compreso la tua domanda o 
meglio l'avevo intesa al contrario:
tu vuoi evitare che lo stesso elemento di Righe venga puntato da due 
elementi, in particolare uno da RigheCommento e uno da RigheArticolo.
Secondo me ti conviene invertire l'associazione:
Righe(NumOrdine, NumRiga, Tipo) con chiave (NumOrdine, NumRiga)
RigheCommento(Id, Commento) 
RigheArticolo(Id, CodiceArticolo, UnitàMisura, Quantità, Prezzo) 
In questo modo gli elementi di RigheCommento() e RigheArticolo() non 
puntano a Righe ma ne vengono puntati, quel problema quindi sparisce.
Se vuoi integrità referenziale con questo schema però credo tu ti debba 
rivolgere ai trigger.

 ottenere l'obiettivo che mi pongo?
In teoria si (la distributed key), in pratica nessun dbms la
supporta e bisogna arrangiarsi come ti hanno gia` detto.
Qui in passato l'estesa discussione di un caso molto simile:
http://groups.google.it/group/it.comp.software.database/browse_thread/thread/e94008ba02cda2ab/
bye 

 rivolgere ai trigger.
La strada mi sembra quella giusta!
Mi manca però ancora di capire come creare i legami tra le tabelle
I campi Id di RigheCommento e RigheArticolo con quale campo di Righe si 
legano? Tipo? NumRiga?
Oppure hai più semplicemente omeso in Righe un campo Id (o magari due) che 
si deve legare con gli altri campi Id?
Grazie
Ciao
Cricca 

 rivolgere ai trigger.
Dopo averci ragionato ho capito la tua soluzione
In pratica devo creare le tabelle
Righe(NumOrdine, NumRiga, Tipo, Id) PK(NumOrdine, NumRiga)
RigheCommento(Id, Commento) PK(Id)
RigheArticolo(Id, CodiceArticolo, UnitàMisura, Quantità, Prezzo) PK(Id)
e creare i legami
RigheCommento(Id) - Righe(Id) 1-1
RigheArticolo(Id) - Righe(Id) 1-1
e così facendo il campo Tipo potrebbe anche essere considerato superfluo.
Mi confermi che ho interpretato correttamente il tuo suggerimento?
Ciao
Cricca 

 Mi confermi che ho interpretato correttamente il tuo suggerimento?
Mi sembra di sì, tieni conto che separando le due tabelle non hai più 
l'integrità referenziale perché in SQL2 non puoi specificarla verso due 
relazioni diverse. Se vuoi implementare la business logic 
(consigliabile) nel database dovrai usare i trigger.
Secondo me c'è un errore a monte però, come suggerisce anche la verifica 
di normalizzazione che hai effettuato tu in primo luogo.

 di normalizzazione che hai effettuato tu in primo luogo.
Ottimo!
Grazie 1000
Ciao
Cricca