Newsgroup: it.comp.lang.visual-basic
Titolo: Integrità referenziale

Ciao.
Ho una tabella con l'elenco di richiedenti di un atto.
Il richiedente può essere una persona fisica oppure un'impresa e individuo
il tipo di richiedente con un campo sulla tabella richiedenti.
Ho poi un altro campo ID che contiene l'Id della persona (o dell'impresa)
che punta alla relativa tabella Anagrafi o Imprese.
E' possibile applicare l'integrità referenziale tra le tabelle in questo
caso?
Il problema è che l'Id può puntare alla tabella Anagrafi oppure alla tabella
Imprese (dipende dal campo TipoRic che può valere "A" oppure "P").
Grazie e ciao
-- 
Skysurfer

 questo caso?
afaik no.
--
Salutoni
Sergio

 afaik no.
Senza afaik. La risposta è no. L'integrità referenziale prevede
la reale esistenza di un record e solo quello all'interno della
tabella padre. Ora se tu hai due padri ... chi vieta alla tabella
padre a di avere un record con lo stesso id della tabella B?
Nessuno, tranne il programmatore. Ma questo il tuo db e
le regole dell'integrità referenziale certo non possono saperlo.
Hai due strade, o unisci cercando di normalizzare le tabelle
individui e imprese, o alternativamente devi farti tutto da codice,
con una certa possibilità di fare casini vari. Personalmente preferisco
più avvalermi del db.
-- 
Saluti
Andrea Moro

 Senza afaik. La risposta č no.
grazie per la precisazione, era la stessa cosa che pensavo io.
perň, quando dico che una cosa non č possibile, particolarmente in
informatica, preferisco premettere una "afaik" :-) non si contano le volte
che una cosa, ritenuta impossibile, č invece raggiungibile, magari con
qualche accrocchio.
--
Salutoni
Sergio

qualche accrocchio.
In questo caso si puo'(deve?) ricorrere ai trigger.
-- 
ciao, hal


E se aggiungessi alla tabella Individui e Imprese un campo fisso che vale
"I" nel primo caso e "P" nel secondo?
Grazie.
Ciao
-- 
Skysurfer

 Ciao
no way, temo.
il problema è sempre il fatto che la tabella padre può essere una sola.
non conosco i trigger, ma siccome li ha consigliati un personaggio che gode
della mia massima stima informatica, ti consiglierei di guardare in quella
direzione...
--
Salutoni
Sergio


C'è qualche problema poi per portare i Trigger su Oracle o su MySql?
Grazie.
Ciao
-- 
Skysurfer

C'č qualche problema poi per portare i Trigger su Oracle o su MySql?
Oracle li supporta di sicuro, MySql non lo so.
Il problema grosso e' il cambio di dialetto SQL che molto
probabilmente ti comporterebbe la riscrittura degli stessi.
Sinceramente non mi porrei il problema, perche' quasi sicuramente
dovresti rivedere anche qualche tipo di dato usato per i campi.
Inoltre esistono strumenti di generazione sql per la creazione e la
modifica dei database, tipo ErWin o S-Designor, che alleviano di molto
il lavoro.
Non solo: io parto sempre dal disegno teorico e poi faccio generare
lo script di creazione del database, scegliendo il tipo di database di
destinazione. 
Conviene sempre dare un'occhiata allo script generato perche' qualche
bachetto c'e' sempre, ma, specie se il database non e' tanto grande,
si fa in poco tempo.
-- 
ciao, hal

 C'è qualche problema poi per portare i Trigger su Oracle o su MySql?
Su mysql afaik non sono supportati... controlla sul sito del produttore...
Oracle immagino li supporti! ;-)

Grazie a tutti per l'aiuto.
Ciao :)
-- 
Skysurfer

 Grazie.
Senza nulla togliere all'ipotesi di Hal di "triggare" il codice di integrità
tra i due padri,  mi chiedo:
perchè più semplicemente non unifichi le due tabelle?
Hai, in questa ipotesi due strade:
1) Se le strutture dati sono simili e/o compatibile, semplicemente unifichi
la tabella Persone Fisiche con quella delle Imprese.
    (ovvio che alcuni campi sono specifichi dell'una e dell'altra, ma in
linea di massima si stratta di tabelle molto simili, suppongo)
2) Se le strutture sono più differenziate di quello che penso io, o se, per
altre ragioni legate al progetto o applicativi esterni che accedono alle due
tabelle, o ancora, se non hai il controllo diretto delle due tabelle, puoi
creare una tabella dei Richiedenti che referenzia indirettamente le
precedenti.
Ovviamente non potrai creare vincoli diretti i integrità referenziale tra
questa e le precedenti Imprese e Persone (qui l'integrità la dovrai
assicurare tu da codice o con gli "hal-triggers"), ma potrai crearne
direttamente tra la Atti e la Richiedenti (e tutte le ipotetiche ulteriori
"figlie" che dovessero farvi riferimento).
ciao
ugo

 perchè più semplicemente non unifichi le due tabelle?
Sì, questa è l'altra ipotesi che avevo preso in considerazione.
In teoria potrebbe andare bene, i campi sono abbastanza simili, però ho già
scritto buona parte del progetto utilizzando le due tabelle separate.
Sono comunque riuscito ad implementare il Trigger e direi che funziona bene.
Grazie.
Ciao
-- 
Skysurfer