Allora diventa una classica e semplice relazione "Uno a Molti" dove ogni "Officina" pesca il suo unico "Dirigente" nella tabella dei "Dipendenti" al campo "CF"
in pratica devi eliminare nel tuo codice il "Alter Table" che hai messo in fondo e poi tutto dovrebbe sistemarsi
nel senso che
- innanzitutto popoli la tabella "Dipendenti"
- poi popoli la tabella "Officina"
.
Ma in questo modo in dipendenti poprei aggiungere una persone con un'officina che non esiste non esiste referenziazione.
Avrei pensato a questa soluzione:
Sembra funzionare, ma volevo sapere se esisteva qualche soluzione alternativa, magari migliore.codice:create table if not exists Officina ( nome varchar (45) primary key, via varchar (25) not null, nciv varchar (5) default 0, citta varchar (15) not null, cap varchar (5) not null, ndip numeric (3) default 1 ); create table if not exists Dipendente ( CF varchar (16) primary key, via varchar (25) not null, nciv varchar (5) default 0, citta varchar (15) not null, cap varchar (5) not null, officina varchar (45), foreign key (Officina) references Officina (nome) ); create table if not exists direzione ( officina varchar (45), dipendente varchar (16), primary key (officina, dipendente), foreign key (officina) references Officina (nome), foreign key (dipendente) references Dipendente (cf) );
quindi ti serve una relazione 1 a 1
La tua soluzione la ho guardata 30 secondi adesso devo andare pertanto ti do solo la prima impressione:
"mi sembra confusa, ---> Troppe relazioni"
Prova a leggerti questo che ho trovato a caso su Google
Tieni presente che l'autore (Andrea Montanari) è un maestro
https://social.technet.microsoft.com...um=sqlserverit
.
In teoria con quello script posso creare un customer senza creare i dettagli...(mettendomi nell'esempio proposto servirebbe creare customers e i suoi dettagli obbligatoriamente).
Nel mio caso creare una nuova relazione è una forzatura (e lo so), ma in questo modo garantisco che non potrò avere un dirigente (dipendente) che dirige un'officina inesistente. Potrei caricare anche prima (eliminando i vingoli) le officine e poi i dirigenti, e poi inserire nuovamente i vincoli con alter, ma ad ogni nuova officina dovrei fare questa operazione.
Mi stai "sconfondendo"
Tu hai:
- delle Officine
- dei Dirigenti
Vuoi che ogni officina abbia un solo dirigente
Vuoi che ogni dirigente abbia una sola officina
Non vuoi avere Dirigenti senza officina
Non vuoi avere officine senza dirigenti
In pratica è una relazione 1 a 1 ma con la aggiunta delle condizioni che ho scritto sopra in rosso.
ho provato a costruire le tabelle con lo script che ci proponi al post #5 e poi sono riuscito a:
lasciando la tabella "direzione" vuota
Inserito Officine a volontà
Inserito Dipendenti a volontà senza compilare il campo "Dipendente.officina"
Quindi ho dei dubbi sulla funzionalita di quanto proposto ...........
--------------------------------------------------------------
In effetti (a livelli ideale) ti basterebbe una sola tabella in assoluto
dove registri su record unico e contemporaneamente
- la officina con tutti i suoi campi (indice univoco sul nome officina)
- il dipendente con tutti i suoi campi (indice univoco sul CF dipendente)
ma questa soluzione (anche se funzionale) non mi piace assolutamente
perché ti costringe a registrare entita diverse su una unica tabella
-----------------------------------------------------------
Vediamo al prossimo post come la farei io se avessi lo stesso problema
.
ho ancora qualche dubbio ma io lo farei come da immagine con
- direzione.dirId - Primary Key autoincrementale
- Officina.OffId - Primary Key autoincrementale
- Dipendente.DipId - Primary Key autoincrementale
- direzione.officina - Indice Univoco
- direzione.dipendente - Indice Univoco
- Officina.nome - Indice Univoco
- Dipendente.CF - Indice Univoco
---------------------------
PS: anche se "fuori tema" ricordati che in italia il CF non è assolutamente univoco
fai una ricerca su Google "omocodia"
( ma non si vergognano i nostri boriosi amministratori ????????? )
per generare 60.000.000 di codici univoci sarebbe capace anche la mia piccolina
invece i nostri cari amministratori ci creano il CF per risolvere il pronbema
dei nomi e cognomi duplicati e fanno i codici duplicati
In questo momento sto provando un sentimento che si chiama disprezzo
Fine della parentesi politica, mi scusino i moderatori
Ultima modifica di nman; 05-01-2017 a 09:18