Integrità referenziale

di il
25 risposte

Integrità referenziale

Ho una tabella con delle Richieste d'ordine

Richiesta(ID, Data, FK_Dipendente, Vista (Sì/No) )

DettaglioRichiesta(ID, Qtà, Annotazioni, FK_Ingrediente, FK_Fornitore, FK_Richiesta)

Poichè il fornitore potrebbe essere anche vuoto non ho applicato integrità referenziale.

L'ingrediente invece deve esserci per forza, però potrebbe essere anche uno di quelli non presenti nell'anagrafica ingredienti

La domanda è: per gli ingredienti è meglio fare come per i fornitori, cioè mettere la relazione ma non l'integrità referenziale, o è meglio banalmente lasciare un campo stringa? Nel primo caso, però, non essendo l'ingrediente in anagrafica, quale chiave esterna metto?

25 Risposte

  • Re: Integrità referenziale

    Puoi inserire il record id 0 per cliente e per ingrediente

    Come cliente metti in descrizione “GENERICO”, come ingrediente fai lo stesso.

    Comunque, integrità referenziale significa che se hai 10 clienti e inserisci il codice 11 devi avere nella tabella clienti il codice 11. Integrità appunto.

  • Re: Integrità referenziale

    29/06/2023 - zoro82 ha scritto:


    Poichè il fornitore potrebbe essere anche vuoto non ho applicato integrità referenziale.

    L'ingrediente invece deve esserci per forza, però potrebbe essere anche uno di quelli non presenti nell'anagrafica ingredienti

    La domanda è: per gli ingredienti è meglio fare come per i fornitori, cioè mettere la relazione ma non l'integrità referenziale, o è meglio banalmente lasciare un campo stringa? Nel primo caso, però, non essendo l'ingrediente in anagrafica, quale chiave esterna metto?

    Ciao,

    l'integrità referenziale ha uno scopo ben preciso e quindi, o lo è oppure non lo è …  delle due una.

    Dovresti consentire valori Null…

    Ma insomma occorrerebbe avere informazioni più dettagliate dell'intero progetto, come stato strutturato etc…

    Uscire dalla normalizzazione o usarla solo in taluni casi non mi sembra proprio il massimo.

    Ad ogni modo se quel campo chiave non è obbligatorio, sarà sufficiente non renderlo obbligatorio nelle altre tabelle a cui si fa riferimento.
    Se c'è bene, altrimenti non c'è ed esporrà il valore Null

    Allego quanto riportato da microsoft: Definire relazioni tra tabelle in un database di Access - Office | Microsoft Learn

    Quando si utilizza l'integrità referenziale, si applicano le regole seguenti:

    • Non è possibile immettere un valore nel campo chiave esterna della tabella correlata che non esiste nella chiave primaria della tabella primaria. Tuttavia, è possibile immettere un valore Null nella chiave esterna. Ciò specifica che i record non sono correlati. Ad esempio, non è possibile avere un ordine assegnato a un cliente che non esiste. Tuttavia, è possibile avere un ordine assegnato a nessuno immettendo un valore Null nel campo ID Cliente.
    • Non è possibile eliminare un record da una tabella primaria se esistono record corrispondenti in una tabella correlata. Ad esempio, non è possibile eliminare un record di un dipendente dalla tabella "Dipendenti" se sono presenti ordini assegnati al dipendente nella tabella "Ordini".
    • Non è possibile modificare un valore di chiave primaria nella tabella primaria se tale record contiene record correlati. Ad esempio, non è possibile modificare l'ID di un dipendente nella tabella "Dipendenti" se sono presenti ordini assegnati a tale dipendente nella tabella "Ordini".
  • Re: Integrità referenziale

    Sicuramente ho formulato malissimo la mia richiesta. Quindi è il caso di riformurarla. Ma prima faccio un passo indietro perchè forse ho inteso male il concetto di integrità referenziale.

    Per me integrità referenziale significa che non è consentito cancellare/modificare record le cui chiavi sono riferite in altre tabelle. (In access questa cosa si fa mettendo il flag alla voce “Applica integrità referenziale” ). Oppure posso aggiornare/modificare ma a patto di aggiornare/cancellare in cascata tutti i riferimenti (In access questa cosa si fa mettendo il flag a una o ad entrambe le voci “Aggiorna campi correlati a catena” e “Elimina campi correlati a catena”). 

    Mettere integrità referenziale significa anche non posso aggiungere un nuovo record se questo contiene (nelle chiavi esterne) un riferimento ad una chiave primaria che non esiste, ma questo significa anche che io non posso lasciare una chiave esterna vuota perchè farei riferimento ad una chiave "vuota" che non esiste (perchè una chiave primaria non può essere vuota o NULL),

    Detto questo, non capisco perchè in alcuni casi è consentito all'utente lasciare delle associazioni SENZA integrità referenziale. L'unica cosa che mi viene in mente è proprio l'ultima cosa che ho detto: potrei avere una associazione con cardinalità 0 e quindi potrei indicare NULL per una chiave esterna. Diversamente, che senso avrebbe lasciare che un utente scriva un valore per una chiave esterna che non ha una corrispettiva chiave primaria?

    Detto questo voglio un ulteriore chiarimento. In access io posso:

    1) Creare semplicemente una associazioni chiave --- chiave senza integrità referenziale

    2) Creare associazioni chiave --- chiave con integrità referenziale (simbolo infinito)

    3) Flaggare le voci “Aggiorna/Cancella” campi a catena

    Nella sintassi SQL mi sembra di aver capito che non ci sia l'opzione 1 ma solo le opzioni 2 e 3 con le istruzioni FOREIGN KEY (Colonna-Tabella-Esterna) REFERENCES Nome-Tabella-Interna (Colonna-Tabella-Interna) e

    [ON DELETE {CASCADE | NO ACTION | SET NULL | SET DEFAULT}]

    [ON UPDATE {CASCADE | NO ACTION I|SET NULL | SET DEFAULT}]

    Se mi dite che non ho detto delle corbellerie…..passo poi a riformulare la mia richiesta.

  • Re: Integrità referenziale

    29/06/2023 - zoro82 ha scritto:


    Sicuramente ho formulato malissimo la mia richiesta. Quindi è il caso di riformurarla. Ma prima faccio un passo indietro perchè forse ho inteso male il concetto di integrità referenziale.

    Per me integrità referenziale significa che non è consentito cancellare/modificare record le cui chiavi sono riferite in altre tabelle. (In access questa cosa si fa mettendo il flag alla voce “Applica integrità referenziale” ). Oppure posso aggiornare/modificare ma a patto di aggiornare/cancellare in cascata tutti i riferimenti (In access questa cosa si fa mettendo il flag a una o ad entrambe le voci “Aggiorna campi correlati a catena” e “Elimina campi correlati a catena”). 

    Mettere integrità referenziale significa anche non posso aggiungere un nuovo record se questo contiene (nelle chiavi esterne) un riferimento ad una chiave primaria che non esiste, ma questo significa anche che io non posso lasciare una chiave esterna vuota perchè farei riferimento ad una chiave "vuota" che non esiste (perchè una chiave primaria non può essere vuota o NULL),

    Detto questo, non capisco perchè in alcuni casi è consentito all'utente lasciare delle associazioni SENZA integrità referenziale. L'unica cosa che mi viene in mente è proprio l'ultima cosa che ho detto: potrei avere una associazione con cardinalità 0 e quindi potrei indicare NULL per una chiave esterna. Diversamente, che senso avrebbe lasciare che un utente scriva un valore per una chiave esterna che non ha una corrispettiva chiave primaria?

    Detto questo voglio un ulteriore chiarimento. In access io posso:

    1) Creare semplicemente una associazioni chiave --- chiave senza integrità referenziale

    2) Creare associazioni chiave --- chiave con integrità referenziale (simbolo infinito)

    3) Flaggare le voci “Aggiorna/Cancella” campi a catena

    Nella sintassi SQL mi sembra di aver capito che non ci sia l'opzione 1 ma solo le opzioni 2 e 3 con le istruzioni FOREIGN KEY (Colonna-Tabella-Esterna) REFERENCES Nome-Tabella-Interna (Colonna-Tabella-Interna) e

    [ON DELETE {CASCADE | NO ACTION | SET NULL | SET DEFAULT}]

    [ON UPDATE {CASCADE | NO ACTION I|SET NULL | SET DEFAULT}]

    Se mi dite che non ho detto delle corbellerie…..passo poi a riformulare la mia richiesta.

    Integrità non significa relazione, quella va a prescindere dall' integrità.

    Un esempio:

    Fase 1) Emetti fattura n 10 al cliente 10 ditta pinkopallo

    Fase 2) Cancelli il cliente 10 

    Fase 3) Vuoi ristampare la fattura 10 e non hai nessun cliente associato.

    L'integrità controlla che la tabella collegata “fature” non usi il record che vuoi cancellare.

    Cosa che potresti fare lanciando una query su fatture con idcliente uguale al valore che vuoi eliminare.

    L'integrità si ferma se nella fase 2 invece di eliminare il cliente gli cambia la ragione sociale da snc a srl.

    In questo caso nella fase 3 ti ritrovi la fattura originale fatta in fase 1 con pinkopallo snc e la ristampa con pinkopallo srl

    Chiaro?

  • Re: Integrità referenziale

    Nel link che ti ho lasciato sopra trovi tutte le risposte.

    L'utilizzo della referenziale oppure no dipende da come si vuole progettare il DB. Ogni tabella avrà il suo scopo e saranno progettate per essere relazionate nel modo dovuto e richiesto dal progetto.

    L'efficienza del Db dipenderà dalla struttura che viene creata e che dovrà rispondere al progetto.

    E' in fase di Progettazione che si definiscono tutti i legami e le regole degli stessi e da qui nasce la struttura da realizzare nel Db.

    ;))

  • Re: Integrità referenziale

    29/06/2023 - By65Franco ha scritto:


    Nel link che ti ho lasciato sopra trovi tutte le risposte.

    L'utilizzo della referenziale oppure no dipende da come si vuole progettare il DB. Ogni tabella avrà il suo scopo e saranno progettate per essere relazionate nel modo dovuto e richiesto dal progetto.

    L'efficienza del Db dipenderà dalla struttura che viene creata e che dovrà rispondere al progetto.

    E' in fase di Progettazione che si definiscono tutti i legami e le regole degli stessi e da qui nasce la struttura da realizzare nel Db.

    ;))

    Sì, l'ho letto ma sono cose che credo di sapere e le ho esposte sopra. Ne ho chiesto una verifica. 

    La mia domanda era di natura progettuale. Esistono dei casi di associazioni tra tabelle in cui ha senso NON usare l'integrità se non quello in cui sia consentito lasciare una fk vuota/NULL? 

    Detto in altre parole: quando progetto il mio db e devo scegliere in quali associazioni usare l'integrità referenziale….quali sono i fattori discriminanti? Per quello che ne so io…..l'integrità andrebbe sempre usata tranne nei casi in cui è possibile avere una fk NULL. E' questo l'unico criterio o ce ne sono altri?

  • Re: Integrità referenziale

    29/06/2023 - zoro82 ha scritto:


    29/06/2023 - By65Franco ha scritto:


    Nel link che ti ho lasciato sopra trovi tutte le risposte.

    L'utilizzo della referenziale oppure no dipende da come si vuole progettare il DB. Ogni tabella avrà il suo scopo e saranno progettate per essere relazionate nel modo dovuto e richiesto dal progetto.

    L'efficienza del Db dipenderà dalla struttura che viene creata e che dovrà rispondere al progetto.

    E' in fase di Progettazione che si definiscono tutti i legami e le regole degli stessi e da qui nasce la struttura da realizzare nel Db.

    ;))

    Sì, l'ho letto ma sono cose che credo di sapere e le ho esposte sopra. Ne ho chiesto una verifica. 

    La mia domanda era di natura progettuale. Esistono dei casi di associazioni tra tabelle in cui ha senso NON usare l'integrità se non quello in cui sia consentito lasciare una fk vuota/NULL? 

    Detto in altre parole: quando progetto il mio db e devo scegliere in quali associazioni usare l'integrità referenziale….quali sono i fattori discriminanti? Per quello che ne so io…..l'integrità andrebbe sempre usata tranne nei casi in cui è possibile avere una fk NULL. E' questo l'unico criterio o ce ne sono altri?

    In caso di un ordine cliente puoi non mettere l'integrità. In caso di documento a rilevanza fiscale o legale si.

    Per capirci: un ordine puoi scriverlo su un tovagliolo, nessuno ti punisce o ti multa. Se invece ho la necessità che il dato non venga cancellato neppure per sbaglio allora verifico che restino integri (da qui il nome integrità).

    Se la lista ingredienti va apposta su un prodotto immesso sul mercato, in quel caso devi inserire l'integrità. Se voglio sapere cosa conteneva Il biscotto del xxx bianco che ha mandato in ospedale il ragazzino, devo avere quella lista anche se oggi ho cambiato ricetta. Analizza cosa devi realizzare e quanto è importante che i dati restino integri nei vari collegamenti.

    Poi decidi se usare integrità o meno.

  • Re: Integrità referenziale

    29/06/2023 - sihsandrea ha scritto:

    In caso di un ordine cliente puoi non mettere l'integrità. In caso di documento a rilevanza fiscale o legale si.

    Per capirci: un ordine puoi scriverlo su un tovagliolo, nessuno ti punisce o ti multa. Se invece ho la necessità che il dato non venga cancellato neppure per sbaglio allora verifico che restino integri (da qui il nome integrità).

    Se la lista ingredienti va apposta su un prodotto immesso sul mercato, in quel caso devi inserire l'integrità. Se voglio sapere cosa conteneva Il biscotto del xxx bianco che ha mandato in ospedale il ragazzino, devo avere quella lista anche se oggi ho cambiato ricetta. Analizza cosa devi realizzare e quanto è importante che i dati restino integri nei vari collegamenti.

    Poi decidi se usare integrità o meno.

    Quello che dici è chiaro, ed è pensato sulla modifica/cancellazione di un record. Io ragiono più sull'inserimento di record e credo, da profano, che sia molto pericoloso lasciare la possibilità di inserire chiavi esterne per le quali potrebbe non esistere una corrispettiva chiave primaria. Sbaglio?

    Mi restano tuttavia dei dubbi. Considera il mio esempio:

    RichiestaOrdine(ID, Data, FK_Dipendente, Vista)

    DettaglioOrdini(ID, FK_Fornitore, Qta, Note, FK_Prodotto)

    Il fornitore può anche non esserci quindi sono obbligato a NON mettere l'integrità referenziale altrimenti non potrei lasciarlo vuoto. Tuttavia, se c'è, cioè se il valore non è vuoto, mi piacerebbe che se un fornitore venisse aggiornato/cancellato automaticamente venisse aggiornatala chiave esterna o cancellato il record correlato.

  • Re: Integrità referenziale

    Che sia molto pericolo o meno lascia il tempo che trova come ragionamento astratto.

    Si progetta e quando si crea un progetto si creano le regole che danno vita ed essenza al progetto stesso.

    Se si progetta male si avranno records “zoppi” spersi o sparsi.
    Se si progetta bene si avranno records così come lo richiede il progetto.

    Giusto o sbagliato, pericoloso o non pericoloso?
    Questa non è una sensazione o un pensiero che non mi fa dormire la notte.

    Ripeto, si crea un progetto con una struttura tale da garantire quello che deve essere garantito.
    Se il progetto richiede di avere o di non avere la possibilità di fare riferimento a delle chiavi, vuol dire che in entrambe le occasioni è stato valutato e deciso a priori come strutturare le tabelle in modo da rispondere all'esigenze del progetto.

    E' come dire :
    Questo è un Progetto per costruire un ponte e prevede 10 campate con 10 piloni
    Lascio decidere al muratore se mettere 10 piloni piuttosto che 8 piloni ?
    Eppure il progetto è chiaro, per le 10 campate occorrono 10 piloni e qui non ci piove. Tutto ciò che verrà fatto in modo diverso non corrisponde al progetto e sicuramente il ponte non sta in Piedi.

    E' il progetto che decide come strutturare il Ponte… è il progetto che decide come strutturare il Db
    Se le regole non sono state definite correttamente, sia per costruire il ponte piuttosto che il Db… sicuramente ci saranno problemi di integrità, sia per il Ponte che per il Db.

    Il progetto a cosa corrisponde ? Cosa contiene il Progetto ? Cos'è un Progetto ?
    Forse sono queste le vere domande da porsi ancor prima di creare una sola tabella e capire se è giusto o meno crearla in modo piuttosto che in un altro.

    In sostanza parli di un problema che non sussiste per quanto sopra riportato… e le risposte ai tuoi interrogativi si trovano nel Progetto e nell'Analisi di progettazione. 
    Fatta male l'analisi e fatto male il progetto o entrambe sono assenti, peggio che mai, allora mi dovresti dire; come strutturi il Db, con quali regole e sulla base di cosa si vanno a creare delle tabelle?

    ;)

  • Re: Integrità referenziale

    Mah, sento parlare di obblighi o meno sull'integrità referenziale..

    Quale parte non si capisce del fatto che integrità referenziale fa si che sia il db a verificare se un dato è correlato ad un dato di un'altra tabella?

    Ho fatto anche un esempio di sostituirsi al servizio di cortesia dell'integrità referenziale.

    Se non ho impostato un'integrità ma da programmatore so che un dato è strettamente relazionato ad un altro, posso lanciare una query per verificare che quel dato non sia utilizzato in altre tabelle prima di cancellarlo.

    Fai una cosa intelligente. In un ordine non ti serve che il db ti avvisi se il dato è movimentato su altri record.

    Se metti integrità e sul campo scrivi “ciao” devi avere la tabella correlata col record chiave “ciao”

    Se non metti l'integrità puoi scrivere anche la divina commedia senza che sia una chiave nella tabella relazionata. Semplicemente non ti mostra i dati della relazione perché non esistono.

    Puoi, tuttavia, usare null se hai una integrità impostata oppure caricare un record relazionato senza altri dati, nel tuo caso al posto di Pinkopallo scriverai “Cliente generico”.

    Non è complicato: hai una relazione che può non essere attivata per qualsiasi ragione che vuoi. E la stessa relazione può essere legata da integrità. Infatti anche con integrità refrrenziale il sistema salta il controllo di integrità nel caso sia null (in bianco, senza che ci sia scritto nulla, vuoto o come vuoi interpretarlo).

    Ergo, se decidi per l'integrita, come cliente non metti nulla.

    Considerazione:

    Ti chiamano 2 persone, uno vuole tre capricciose e una romana, l'altro die margherite. Ritardano, come fai a chiamare l'uno e l'altro se non hai appuntato un nome e un recapito? E qui do ragione alla metafora di by65franco.

    Un consiglio: fai una simulazione.

    Prendi carta e penna e prendi una comanda.

    Quel pezzo di carta contiene i dati che devi necessariamente inserire, quindi puoi registrare ogni persona che ti chiama o creare un campo “contatto” che non è codice cliente ma che domani possa diventare un cliente. In quel caso invece di scrivere nominativo e telefono scrivi il codice e ti colleghi alla tabella clienti. Quindi avrai idordine, idcliente, contatto. O popoli idcliente o scrivi il contatto e il suo recapito, potresti avere la necessità di chiamarlo per dirgli che le acciughe sono finite…

  • Re: Integrità referenziale

    29/06/2023 - sihsandrea ha scritto:


    Ti chiamano 2 persone, uno vuole tre capricciose e una romana, l'altro die margherite. Ritardano, come fai a chiamare l'uno e l'altro se non hai appuntato un nome e un recapito? E qui do ragione alla metafora di by65franco.

    Per me va bene una Margherita con i Capperi… grazie !!!  ;))

    a parte le battute, cercavo di far passare il concetto che le regole si stabilisco sulla base delle necessità del progetto. 
    Più sono ben definite e chiare le regole e più semplice sarà realizzare il progetto.
    Detto questo direi che basta avere le idee chiare e a quel punto non puoi sbagliare.

    Ma tornando all'ordine…. ho richiesto 'na Margherita con i Capperi e se mi arriva la Margherita senza i capperi? 
    Posso esclamare “e che capperi, non era quello che avevo ordinato”
    Oppure sti' Capperi era un ingrediente obbligatorio ma non è stato impostato come tale nella struttura.

    Quindi era proprio questo il concetto che volevo esprimere, se il progetto prevede un dato sempre e comunque obbligatorio vorrà dire che avrà tale caratteristica, diversamente vuol dire che non è strettamente necessario e quindi valgono le ipotesi fatte da sihsandrea 

    Alla fine basta che mi arrivi la pizza Margherita con i Capperi, altrimenti la rimando indietro e richiedo i danni ;))

  • Re: Integrità referenziale

    Olio evo e origano?

    E meno male che non si parla di lotti tracciabilità e rintracciabilità…

    Da bere? Champagn….. acqua? 

  • Re: Integrità referenziale

    29/06/2023 - sihsandrea ha scritto:


    Olio evo e origano?

    E meno male che non si parla di lotti tracciabilità e rintracciabilità…

    Da bere? Champagn….. acqua? 

    Rigorosamente CocaCola … ma in vetro ;))

  • Re: Integrità referenziale

    Perdonatemi ma sto cercando di capire bene. Se voi siete già edotti mi dispiace che stiate buttando del tempo. Se però dovete percularmi meglio che non rispondete.

    Quello che chiedevo io non erano delle “regole per mettere l'integrità referenziale”. Ma degli esempi(appunto…non regole) in cui non era strettamente necessario usarla. Ho capito che le regole le devo stabilire io in progettazione…ma queste regole le devo stabilire con criterio.  

    Quello che faccio fatica a capire è l'espressione “ Non è complicato: hai una relazione che può non essere attivata per qualsiasi ragione che vuoi. E la stessa relazione può essere legata da integrità”

    Per me non ha senso avere una relazione e non attivarla….se c'è per me ha senso attivarla e garantire, a prescindere, che i dati siano integri sia in fase di inserimento che di aggiornamento o cancellazione. Quindi sarebbe più comodo/corretto metterla sempre e non lasciarla alla discrezionalita'  (progettuale) di una persona. Non trovo nessuna utilità pratica nell'avere, in una tabella, il cliente 46 che però non esiste nella corrispettiva anagrafica. 

Devi accedere o registrarti per scrivere nel forum
25 risposte