Dubbio sull'uso dell'integrità referenziale

di il
9 risposte

Dubbio sull'uso dell'integrità referenziale

Supponiamo di avere 4 tabelle

Tabella00:
CodiceID00
... [tutti i campi che servono alla tabella]

Tabella01:
CodiceID01
...[tutti i campi che servono alla tabella]
CodiceID00

Tabella02:
CodiceID02
...[tutti i campi che servono alla tabella]
CodiceID00
CodiceID01

Tabella03:
CodiceID03
...[tutti i campi che servono alla tabella]
CodiceID00
CodiceID02

Dove:
1) Tabella01 è in relazione 1 a molti con Tabella02 e un record su Tabella02 può esistere solo se esiste il corrispettivo record su Tabella01
2) Tabella02 è in relazione 1 a molti con Tabella03 e un record su Tabella03 può esistere solo se esiste il corrispettivo record su Tabella02
3) Tabella00 è in relazione 1 a molti con tutte e tre le altre tabelle, ma:
a) Tabella01 deve avere sempre valorizzato CodiceID00
b) Tabella02 e Tabella03 possono avere valorizzato CodiceID00 nel momento in cui:
i) Tabella02.CodiceID00 <> Tabella01.CodiceID00
ii) Tabella03.CodiceID00 <> Tabella02.CodiceID00 oppure Tabella03.CodiceID00 <> Tabella01.CodiceID00

Ora il mio dubbio, riguarda le relazioni tra: Tabella00 e Tabella02; Tabella00 e Tabella03

In questi due casi è meglio utilizzare comunque l'integrità referenziale nella relazione ed inserire all'interno della Tabella00 dei valori che traducono il fatto che "Tabella02.CodiceID00 = Tabella01.CodiceID00" od una delle altre combinazioni, oppure è meglio non usare l'integrità referenziale e lasciare che Tabella02.CodiceID00 e Tabella03.CodiceID00 possano non essere valorizzati?

Grazie per l'attenzione e buona giornata.

9 Risposte

  • Re: Dubbio sull'uso dell'integrità referenziale

    Senza conoscere il vero significato LOGICO di ogni tabella è più difficile cogliere quale priorità di scelta mettere in campo. Tuttavia può capitare uno scenario simile al tuo. Se la relazione c'è ed è forte/essenziale/imprescindibile, soprattutto al fine di future maschere da sincronizzare, metti la relazione e rafforzala sempre con "Applica integrità referenziale". Il fatto poi che una tabella figlia non abbia necessariamente un valore della tabella madre non vincola nulla/nessuno.
    Nel caso dovessi avere comunque necessità di valorizzare in tabella figlia un valore che "non ha rilevanza", puoi escogitare di avere un valore "neutro/fittizio/fantasma" in tabella madre, per esempio "0", o Null, la stringa di lunghezza zero, "<nessuno>"...inventalo tu insomma, che puoi impostare all'occorrenza. A me capita spesso e lo imposto anche come valore predefinito.
    Quando invece hai molti campi FK sparsi che parlano lo stesso linguaggio (CodiceID00), puoi decidere di relazionare solo da una parte, quella che tu ritieni "più ricorrente". Per gli altri casi, puoi omettere la relazione.

    Spero di aver colto il tuo problema.
  • Re: Dubbio sull'uso dell'integrità referenziale

    Salve,
    tabella1 puo' essere relazionata a tabella0
    tabella2 puo' essere relazionata a tabella0 O tabella1
    tabella3 puo' essere relazionata a tabella0 O tabella1 O tabella2
    ?
    salutoni romagnoli
    --
    Andrea

    Where is the wisdom? Lost in the knowledge.
    Where is the knowledge? Lost in the information.
    (T.S.Eliot)

    Where is the information? Lost in the data.
    Where is the data? Lost in the @%&#@ database.
    (Joe Celko)
  • Re: Dubbio sull'uso dell'integrità referenziale

    La struttura non appare normalizzata in particolare per la Tabella3 che può essere (o meno) correlata con le altre.
    Quindi ha poco senso assegnare l'integrità referenziale.
  • Re: Dubbio sull'uso dell'integrità referenziale

    OsvaldoLaviosa ha scritto:


    Senza conoscere il vero significato LOGICO di ogni tabella è più difficile cogliere quale priorità di scelta mettere in campo. Tuttavia può capitare uno scenario simile al tuo. Se la relazione c'è ed è forte/essenziale/imprescindibile, soprattutto al fine di future maschere da sincronizzare, metti la relazione e rafforzala sempre con "Applica integrità referenziale". Il fatto poi che una tabella figlia non abbia necessariamente un valore della tabella madre non vincola nulla/nessuno.
    Nel caso dovessi avere comunque necessità di valorizzare in tabella figlia un valore che "non ha rilevanza", puoi escogitare di avere un valore "neutro/fittizio/fantasma" in tabella madre, per esempio "0", o Null, la stringa di lunghezza zero, "<nessuno>"...inventalo tu insomma, che puoi impostare all'occorrenza. A me capita spesso e lo imposto anche come valore predefinito.
    Quando invece hai molti campi FK sparsi che parlano lo stesso linguaggio (CodiceID00), puoi decidere di relazionare solo da una parte, quella che tu ritieni "più ricorrente". Per gli altri casi, puoi omettere la relazione.

    Spero di aver colto il tuo problema.
    lo hai colto e mi hai dato la risposta che mi ha fatto decidere definitivamente di proseguire sulla strada dell'integrità referenziale e dei record neutri Grazie
  • Re: Dubbio sull'uso dell'integrità referenziale

    willy55 ha scritto:


    La struttura non appare normalizzata in particolare per la Tabella3 che può essere (o meno) correlata con le altre.
    Quindi ha poco senso assegnare l'integrità referenziale.

    la parte di struttura del mio database a cui faccio riferimento è:

    Tabella "Entità", composta da:
    IDEntità [PK]
    IDCategoria [FK verso tabella secondaria "EntitàCategorie", stabilisce se il record è relativo a: l'artista di cui l'album è parte della discografia; un autore di musiche o testi; un musicista della formazione dell'artista; un membro dello staff tecnico di produzione dell'album; il copertinista dell'album]
    IDTipo [FK verso tabella secondaria "EntitàTipi", è la tabella figlia di "EntitàCategorie" e ne stabilisce un tipo specifico]
    ...[dati relativi all'entità che vengono valorizzati in maniera differente a seconda dell'accoppiata "Categoria/Tipo" a cui si fa riferimento]

    Tabella "Titoli", composta da:
    IDTitolo [PK]
    TipoTitolo [FK verso tabella secondaria "Parametri"]
    Titolo
    Pubblicazione

    Tabella "Album", composta da:
    IDAlbum [PK]
    IDEntità [FK verso la tabella "Entità" che ha i dati delle persone (in questo caso sono gli Artisti Solisti o i Gruppi che hanno pubblicato l'Album]
    IDTitolo [FK verso la tabella "Titoli", in questo caso deve sempre essere valorizzato]
    ... [altre FKeys verso tabelle secondarie]

    Tabella "Edizioni", composta da:
    IDEdizione [PK]
    IDAlbum [FK verso la tabella "Album" che è la sua tabella "madre"]
    ... [dati relativi all'edizione e FKeys verso tabelle secondarie]
    ha sempre lo stesso titolo e lo stesso Artista Solista o Gruppo dell'album di riferimento, quindi non ha un proprio collegamento alle tabelle Entità e Titoli.

    Tabella "Dischi"
    IDDisco [PK]
    IDEdizione [FK verso tabella "Edizioni" che è la sua tabella "madre"]
    ... [dati relativi all'edizione e FKeys verso tabelle secondarie]
    IDTitolo [FK verso la tabella "Titoli", ha un valore proprio solo se il titolo del Disco differisce da quello dell'Album di riferimento]
    IDEntità [FK verso la tabella Entità, ha un valore proprio solo se il gruppo o artista solista differisce da quello dell'album di riferimento]

    Tabella "ScalettaDischi" (questa di fatto è il corrispettivo della "Tabella03" di cui parlavo nell'esempio.
    IDElementoScaletta [PK]
    IDDisco [FK verso la tabella "Dischi, che è la sua tabella "madre"]
    IDEntità [FK verso la tabella Entità, ha un valore proprio solo se il gruppo o l'artista solista differisce da almeno una delle due entità che possono essere presenti nei livelli precedenti]
    ...[dati relativi all'elemento della scaletta del disco]

    Come mai non ti sembra normalizzata?
  • Re: Dubbio sull'uso dell'integrità referenziale

    Approfondisci le tre forme normali, in particolare per l'attributo IDEntità della Tabella "ScalettaDischi".
  • Re: Dubbio sull'uso dell'integrità referenziale

    willy55 ha scritto:


    Approfondisci le tre forme normali, in particolare per l'attributo IDEntità della Tabella "ScalettaDischi".
    Mi sono riletto le definizioni delle 3 forme normali e non sto ancora capendo quello che hai voluto dire.
    Non ho visto violazioni della 1NF e della 2NF. Per quanto riguarda la 3NF non sono sicuro di aver capito fino in fondo cosa serva per evitare che vi siano violazioni a questa regola.

    A questo punto, però, quello che mi confonde è perché consideri una violazione di una delle forme normali l'IDEntità su ScalettaDischi mentre non consideri nello stesso modo l'IDEntità sulla tabella Dischi.

    A questo punto provo a dare alcuni esempi per far capire perché ho inserito quel tipo di logica.

    Esempi:

    Gli Album che devo inserire sono:

    1) Alchemy Live dei Dire Straits
    2) 01010001 degli Ayreon
    3) L'album omonimo dei Winter Rose
    4) Se Io avessi previsto tutto di Francesco Guccini

    parlando solo del discorso FK verso tabella Entità e FK verso tabella titoli quello che si ha è:

    L'edizione che ho nella mia collezione di "Alchemy Live" e l'edizione standard in 2 CD in confezione jewelcase
    Ciascuno dei due CD è un disco che fa parte di quella particolare edizione dell'album
    Ciascuno dei due CD ha una propria scaletta composta da più canzoni.
    Ogni canzone ha un proprio titolo

    In questo caso
    Album.IDEntità = Disco.IDEntità = ScalettaDisco.IDEntità
    Album.IDTitolo = Disco.IDTitolo e Disco.IDTitolo <> ScalettaDisco.IDTitolo

    L'edizione di "01011001" degli Ayreon che ho è quella limitata in formato cofanetto con confezione digipack composta da 2 CD + 1 DVD dove
    Ciascuno dei due CD ha un proprio titolo, diverso dal titolo dell'Album (il CD 1 si intitola "Y", il CD 2 si intitola "Earth") mentre il DVD ha lo stesso titolo dell'album di riferimento, mentre tutti hanno lo stesso artista dell'album di riferimento
    Sia i 2 CD che il DVD hanno ciascuno una propria scaletta ciascun elemento della quale ha il medesimo Artista dell'album di riferimento

    In questo caso
    Album.IDEntità = Disco.IDEntità = ScalettaDisco.IDEntità
    Album.IDTitolo <> DiscoID.Titolo [per i 2 CD] e Album.IDTitolo = DiscoIDTitolo [per il DVD] Album.IDTitolo <> ScalettaDisco.IDTitolo e
    Disco.IDTitolo <> ScalettaDisco.IDTitolo

    L'edizione dell'Album dei Winter Rose che ho è la ristampa in 2 CD in confezione jewelcase dove
    il CD 1 è l'album dei Winter Rose
    il CD 2 è un EP composto da 6 canzoni ciascuna delle quali di un artista differente, quindi una compilation in cui l'Artista del Disco è impostato
    ad "[Artisti Vari]"

    in questo caso:
    per CD 1
    Album.IDEntità = Disco.IDEntità = ScalettaDisco.IDEntità
    Album.IDTitolo = Disco.IDTitolo e Disco.IDTitolo <> ScalettaDisco.IDTitolo

    per CD 2
    Album.IDEntità <> Disco.IDEntità, Album.IDEntità <> ScalettaDisco.IDEntità e Disco.IDEntità <> ScalettaDisco.IDEntità
    Album.IDTitolo <> Disco.IDTitolo, Album.IDTitolo <> ScalettaDisco.IDTitolo e Disco.IDTitolo <> ScalettaDisco.IDTitolo

    L'Edizione di "Se io avessi previsto tutto questo" è quella limitata in formato cofanetto da 10 CD, dove
    i primi 5 CD hanno come proprio Titolo "Studio"
    il 6° CD ha come proprio Titolo "Live Acustico"
    i CD dal 7 al 9 hanno come proprio titolo "Live"
    il 10° CD ha come proprio titolo "Collaborazioni e Rarità"

    I primi 9 CD sono tutti associati solo a Francesco Guccini come Artista
    il 10° CD ha due tipi di canzoni: le rarità (che sono pezzi di nuovo associati al solo Francesco Guccini) e le Collaborazioni (che sono pezzi di Guccini interpretati da altri artisti, in cui Guccini figura solo come artista ospite)

    per cui, in questo caso, la situazione è:

    per tutti e 10 i CD
    Album.IDTitolo <> Disco.IDTitolo, Album.IDTitolo <> ScalettaDisco.IDTitolo e Disco.IDTitolo <> ScalettaDisco.IDTitolo

    per i primi 9 CD
    Album.IDEntità = Disco.IDEntità = ScalettaDisco.IDEntità

    per il 10° CD
    Album.IDEntità <> Disco.IDEntità (valore [Artisti Vari]), Album.IDEntità <> ScalettaDisco.IDEntità per ogni canzone appartenente al gruppo delle "Collaborazioni" e Album.IDEntità = ScalettaDisco.IDEntità per ogni canzone appartenente al gruppo delle rarità,
    Disco.IDEntità <> ScalettaDisco.IDEntità

    Quindi, se io non inserisco rimandi alle tabelle “Entità” e “Titoli” sia nella tabella “Album”, che nella tabella “Dischi” che nella tabella “ScalettaDisco”, ci sono dei casi in cui io perdo dei dati relativi all’edizione dell’album che ho nella mia collezione.
    A questo punto chiedo: dov’è l’errore di logica? E, nel caso, qual è la soluzione alternativa per rientrare nella normalizzazione corretta dei dati?
  • Re: Dubbio sull'uso dell'integrità referenziale

    Tieni presente che ciascuna istanza, ove sia presente una FK, con una tabella associata, deve sempre contenere un valore di FK ? 0 e tale valore deve necessariamente trovare una corrispondenza nella relativa tabella correlata.
    Quindi non è possibile inserire un dato nullo nella tabella lato N, proprio perché nella tabella lato 1 deve esistere un record correlato.

    Inoltre gestire un attributo che possa contenere valori nulli o di una chiave esterna determina una mancata dipendenza funzionale dalla chiave primaria in quanto ogni attributo non chiave deve essere completamente dipendente a livello funzionale dalla chiave primaria.

    In conclusione non potrai applicare l'integrità referenziale di cui al quesito in oggetto.

    I seguenti documenti forniscono elmeenti conoscitivi al riguardo:
    https://docs.microsoft.com/it-it/office/troubleshoot/access/database-normalization-description
    https://dmi.units.it/_borelli/access/dispensa.pd
    https://www.ionos.it/digitalguide/hosting/tecniche-hosting/minimizzare-le-ridondanze-del-database/
  • Re: Dubbio sull'uso dell'integrità referenziale

    willy55 ha scritto:


    Tieni presente che ciascuna istanza, ove sia presente una FK, con una tabella associata, deve sempre contenere un valore di FK ? 0 e tale valore deve necessariamente trovare una corrispondenza nella relativa tabella correlata.
    Quindi non è possibile inserire un dato nullo nella tabella lato N, proprio perché nella tabella lato 1 deve esistere un record correlato.

    Inoltre gestire un attributo che possa contenere valori nulli o di una chiave esterna determina una mancata dipendenza funzionale dalla chiave primaria in quanto ogni attributo non chiave deve essere completamente dipendente a livello funzionale dalla chiave primaria.

    In conclusione non potrai applicare l'integrità referenziale di cui al quesito in oggetto.

    I seguenti documenti forniscono elmeenti conoscitivi al riguardo:
    https://docs.microsoft.com/it-it/office/troubleshoot/access/database-normalization-description
    https://dmi.units.it/_borelli/access/dispensa.pd
    https://www.ionos.it/digitalguide/hosting/tecniche-hosting/minimizzare-le-ridondanze-del-database/
    grazie per la risposta, sto leggendo e sto capendo. Cosa che mi sta facendo venire altri dubbi sul lavoro che ho fatto finora
Devi accedere o registrarti per scrivere nel forum
9 risposte