Relazioni tabelle

di il
14 risposte

Relazioni tabelle

Salve,
ho delle tabelle come da immagine allegata. Le relazioni uno a molti che ho messo funzionano benissimo e quando le apro mostrano il segnetto + (foglio dati secondario) aprendo il quale si vedono i campi della tabella collegata.

C'è però un'eccezione. Infatti la tabella "Genus" non sempre ha un "Subgenus" ma spesso ha direttamente, la categoria "Species" e quindi in questi casi non ci può essere il collegamento tra la tabella "Genus" e "Species" perchè non vengono messe in relazione dalla tabella intermedia "Subgenus".
Come posso fare?

Grazie.

Daniele
Allegati:
18249_c11c55f24ddab4761a746243b0dcce8b.jpg
18249_c11c55f24ddab4761a746243b0dcce8b.jpg

14 Risposte

  • Re: Relazioni tabelle

    Ignoro la materia del tuo database...ma qualcosa mi frulla strano nel vedere un campo Author presente in tutte le tabelle. Sorvolo su questo aspetto perchè non riguarda la tua domanda.

    Prova a immaginare un record "fantasma" in tabella Subgenus con un valore fittizio (ad es. "0" oppure "Nessuno" oppure la stringa di lunghezza zero) che serve a metterci una pezza proprio per questi casi.
  • Re: Relazioni tabelle

    Grazie Osvaldo per la tua risposta.
    E' una collezione entomologica di coleotteri. Author viene ripetuto perchè non è lo stesso per ogni tabella.

    Avevo provato anch'io con il record "fantasma" ma se metto "nessuno" nel campo subgenus lo devo mettere come chiave primaria per poterlo collegare con la tabella Genus; la chiave primaria però non ammette duplicati ed il record "nessuno" lo dovrei mettere tante volte quante sono le volte che Genus non ha un subgenus ma direttamente species.

    Non so se è la stessa cosa che intendi tu..

    Daniele
  • Re: Relazioni tabelle

    skipperdan ha scritto:


    E' una collezione entomologica di coleotteri.
    Ho molti amici biologi, animalisti e co. ma non mi far chiedere loro cosa significa. Potresti spiegare di cosa si tratta? Un paio di esempi dovrebbero assolvere il mio dubbio.

    skipperdan ha scritto:


    Author viene ripetuto perchè non è lo stesso per ogni tabella.
    Per me non vuol dir nulla. Aiutami sempre con i paio di esempi che ti ho chiesto prima.

    skipperdan ha scritto:


    Avevo provato anch'io con il record "fantasma" ma se metto "nessuno" nel campo subgenus lo devo mettere come chiave primaria per poterlo collegare con la tabella Genus; la chiave primaria però non ammette duplicati ed il record "nessuno" lo dovrei mettere tante volte quante sono le volte che Genus non ha un subgenus ma direttamente species.
    Questa affermazione mi appare come ulteriore complicazione di una corretta normalizzazione.
    Ribadisco il mio bisogno di una descrizione di un paio di esempi pratici.
  • Re: Relazioni tabelle

    skipperdan ha scritto:


    Salve,
    C'è però un'eccezione. Infatti la tabella "Genus" non sempre ha un "Subgenus" ma spesso ha direttamente, la categoria "Species" e quindi in questi casi non ci può essere il collegamento tra la tabella "Genus" e "Species" perchè non vengono messe in relazione dalla tabella intermedia "Subgenus".
    Come posso fare?
    In questo caso non puoi avere una relazione, che dovrai gestire 'da codice'.
    In sostanza devi indicare nella tabella 'Genus' anche il campo che si relazione con la tabella 'Species'.

    Però se, come sospetto, i campi che usi per le relazioni sono tutti di tipo testo, stai commettendo un errore macroscopico.
    Infatti dovresti avere a parte le tabelle anagrafiche per ogni tipologia usata, ed utilizzare l'ID di ogni tabella come chiave esterna.

    Date le scarse indicazioni che dai, non posso essere più preciso.
  • Re: Relazioni tabelle

    Grazie ad entrambi per le risposte. Prima di porvi ulteriori domande circa quello che avete detto e come mi avete giustamente richiesto, cercherò di spiegarmi meglio, anche con delle immagini.
    Ho cercato di essere meno prolisso possibile.

    Il DB serve per la classificazione (sistematica) di alcune famiglie di coleotteri. In biologia, tutti gli esseri viventi vengono classificati con delle categorie "tassonomiche" partendo dalla più generale sino ad arrivare a quella più particolare, ossia la specie ed in certi casi ancora più in basso sino alla sottospecie.
    Io ho scelto di partire, non dalla prima categoria tassonomica, ma da una intermedia: la "famiglia" e da questa scendere sino all'ultima, ossia la "sottospecie".
    Le categorie che quindi prendo in considerazione sono: la famiglia, la sottofamiglia, la tribù, il genere, il sottogenere, la specie e la sottospecie.

    Per fare un es., la nostra specie "uomo" (nome volgare), partendo dalla famiglia, è così classificata:

    Famiglia: Hominidae
    Sottofamiglia: Homininae
    Tribù: Hominini
    Genere: Homo
    Sottogenere: NON C'E' (credo) - come per molti coleotteri - che poi è il mio problema
    Specie: Sapiens
    Sottospecie: Sapiens

    Ogni categoria ha un suo scopritore che si chiama autore (author nel mio DB).

    E dopo questa lezione di "sistematica" spero non troppo noiosa e spero soprattutto chiara, vengo al database. L'ho strutturato con 7 tabelle che corrispondono alle 7 categorie (Family, Subfamily etc.) ed ogni tabella ha, il campo della categoria ad es. Family contenente le varie famiglie oltre al campo author con i nomi di tutti gli studiosi che hanno identificato quella famiglia. Stessa cosa con le altre categorie.
    Nel campo delle categorie (Family, Subfamily etc.), il quale è univoco (non ci possono essere due famiglie con lo stesso nome) ho messo la chiave primaria che ho usato come campo di relazione con la tabella sottostante fino alla tabella Subspecies. Naturalmente in ogni tabella (a parte la prima cioè la tabella Family) ho dovuto mettere una chiave esterna (si chiama così?) nella tabella sottostante per collegarle.

    Il problema, come avevo cercato di spiegare, sta nel fatto che la tabella "Subgenus", spesso, non ha un sottogenere (come nel caso sopra detto dell'Homo sapiens per cui, in questi casi, si interrompono le relazioni alla tabella "Genus".

    L'unica soluzione che mi viene in mente è creare per tutte e 7 le tabelle, un altro campo numerico tipo "IDFamily" - "IDsubfamily" etc. - dare a questi la chiave primaria usandola anche per mettere in relazione le tabelle. In questo modo potrò lasciare in bianco (null) i campi "Subgenus" che non hanno un genere e così facendo potrò mantenere il collegamento tra tutte le tabelle incluse "Genus", "Subgenus", "Species" e "Subspecies". Devo provare però, voi che ne dite ?

    Le immagini serviranno a chiarificare quanto sopra detto:
    Allegati:
    Queste sono le 7 tabelle in modalità visualizzazione.
    Queste sono le 7 tabelle in modalità visualizzazione.

    Queste sono le relazioni che ho predisposto come collegamento tra le tabelle.
    Queste sono le relazioni che ho predisposto come collegamento tra le tabelle.

    Qui si vede come la relazione tra le tabelle funziona sino alla tabella "subspecies" perchè è presente la categoria "subgenus" che collega la tabella "Genus" con la tabella "Subgenus".
    Qui si vede come la relazione tra le tabelle funziona sino alla tabella "subspecies" perchè è presente la categoria "subgenus" che collega la tabella "Genus" con la tabella "Subgenus".

    Qui si vede come la relazione tra le tabelle funziona ma non può arrivare sino alla sottospecie perchè l'assenza del "subgenus" di questo coleottero impedisce il collegamento con la tabella "Species" e di conseguenza con la tabella "subspecies".
    Qui si vede come la relazione tra le tabelle funziona ma non può arrivare sino alla sottospecie perchè l'assenza del "subgenus" di questo coleottero impedisce il collegamento con la tabella "Species" e di conseguenza con la tabella "subspecies".
  • Re: Relazioni tabelle

    Io strutturerei le tabelle così:
    Animali (o Coleotteri)
    IDAnimale (numerazione automatica, chiave primaria)
    NomeAnimale

    DettagliAnimali
    IDDettaglio (numerazione automatica, chiave primaria)
    Insieme (testo)
    Specifica (testo)(qui dentro scrivi Hominidae...)
    IDAuthor (numerico)
    Anno (numerico)(ho visto l'anno...si riferisce all'anno della scoperta: vero?)
    IDAnimale (numerico)

    Insiemi
    Insieme (testo, chiave primaria)(qui dentro avrai i valori Famiglia, Sottofamiglia, Specie...)

    Authors
    IDAuthor (numerazione automatica, chiave primaria)
    Cognome
    Nome

    Relazioni:
    Animali.IDAnimale uno-a-molti DettagliAnimali.IDAnimale
    Insiemi.Insieme uno-a-molti DettagliAnimali.Insieme
    Authors.IDAuthor uno-a-molti DettagliAnimali.IDAuthor

    In questo modo, nella tabella DettagliAnimali elenchi solo gli Insiemi che hai a disposizione.
    Se (da quanto ho capito):
    Famiglia è più importante di Sottofamiglia
    Sottofamiglia è più importante di Tribù
    Tribù è più importante di Genere...ecc...
    puoi decidere di aggiungere un campo IDInsieme nella tabella Insiemi, associando la giusta gerarchia. Di conseguenza aggiusta pure la relazione Insiemi uno-a-molti DettagliAnimali.
  • Re: Relazioni tabelle

    Grazie Osvaldo per la risposta.
    Sinceramente faccio un pò fatica a comprendere come hai strutturato il tutto ma ci rifletterò senz'altro su. Ti chiedo a freddo le seguenti cose che mi aiuteranno a comprendere:

    OsvaldoLaviosa ha scritto:


    Io strutturerei le tabelle così:
    Animali (o Coleotteri)
    IDAnimale (numerazione automatica, chiave primaria)
    NomeAnimale
    Quale sarebbe il nome animale che intendi ? In biologia non esiste. Come ho spiegato c'è la famiglia che racchiude la sottofamiglia che racchiude il genere e così via fino all'ultima che è la specie (o sottospecie). Nel caso dell'uomo il nome animale è "Sapiens" (a cui si antepone il genere cioè "Homo" e diventa "Homo sapiens" ma questa è un'altra storia), ma queste due categorie (homo e sapiens) le dovrei mettere in Insiemi, secondo il tuo schema. Se per nome animale ti riferisci ad "uomo" (secondo il mio esempio) questo scientificamente non esiste ed infatti la stragrande maggioranza degli esseri viventi non ha un nome volgare.

    OsvaldoLaviosa ha scritto:


    DettagliAnimali
    IDDettaglio (numerazione automatica, chiave primaria)
    Insieme (testo)
    Specifica (testo)(qui dentro scrivi Hominidae...)
    IDAuthor (numerico)
    Anno (numerico)(ho visto l'anno...si riferisce all'anno della scoperta: vero?)
    IDAnimale (numerico)
    Considera che Hominidae, che come dici dovrei mettere in specifica, è la famiglia, ma anche la famiglia la dovrei mettere in insiemi sempre secondo il tuo schema, ho capito bene ?
    Poi, insieme (testo) è solo la chiave esterna della tabella insiemi ?

    OsvaldoLaviosa ha scritto:


    Relazioni:
    Animali.IDAnimale uno-a-molti DettagliAnimali.IDAnimale
    Insiemi.Insieme uno-a-molti DettagliAnimali.Insieme
    Authors.IDAuthor uno-a-molti DettagliAnimali.IDAuthor

    In questo modo, nella tabella DettagliAnimali elenchi solo gli Insiemi che hai a disposizione.
    Se (da quanto ho capito):
    Famiglia è più importante di Sottofamiglia
    Sottofamiglia è più importante di Tribù
    Tribù è più importante di Genere...ecc...
    puoi decidere di aggiungere un campo IDInsieme nella tabella Insiemi, associando la giusta gerarchia. Di conseguenza aggiusta pure la relazione Insiemi uno-a-molti DettagliAnimali.
    Chiarite le cose che ti chiedevo sopra, per afferrare bene il funzionamento di ciò lo dovrei provare costruendo il progetto. E hai capito bene, Famiglia è il livello superiore e poi gli altri vanno a scendere.

    Grazie mille per il tuo aiuto.

    Daniele
  • Re: Relazioni tabelle

    gibra ha scritto:


    skipperdan ha scritto:


    Salve,
    C'è però un'eccezione. Infatti la tabella "Genus" non sempre ha un "Subgenus" ma spesso ha direttamente, la categoria "Species" e quindi in questi casi non ci può essere il collegamento tra la tabella "Genus" e "Species" perchè non vengono messe in relazione dalla tabella intermedia "Subgenus".
    Come posso fare?
    In questo caso non puoi avere una relazione, che dovrai gestire 'da codice'.
    In sostanza devi indicare nella tabella 'Genus' anche il campo che si relazione con la tabella 'Species'.
    Mi potresti spiegare meglio, anche a fronte dell'approfondimento che ho fatto, che intendi con quanto sopra hai detto?

    gibra ha scritto:


    Però se, come sospetto, i campi che usi per le relazioni sono tutti di tipo testo, stai commettendo un errore macroscopico.
    Infatti dovresti avere a parte le tabelle anagrafiche per ogni tipologia usata, ed utilizzare l'ID di ogni tabella come chiave esterna.
    Perchè avrei commesso un errore ? i campi che uso per le relazioni sono tutti di tipo testo ma sono univoci, proprio come un codice ficale.
    Però se mettessi un ID numerico per ogni tabella potrei mettere quello in relazione tra le tabelle utilizzando, come tu dici, ogni ID anche come chiave esterna (cioè, se ho ben compreso, ogni ID chiave primaria di una tabella va rimesso nella tabella da collegare e questa è la chiave esterna ?). In tal modo non avrei più il problema di lasciare in bianco (null) i campi che non hanno sottogeneri (Subgenus). In questo senso dici che c'è l'errore?

    Grazie.

    Daniele
  • Re: Relazioni tabelle

    Cancella tutto il mio ragionamento. Avevo ignorato la gerarchia a cascata
    Families uno-a-molti Subfamilies uno-a-molti Tribes uno-a-molti Genus uno-a-molti Subgenus...ecc... che è un punto di forza e va rispettato.
    Ti suggerisco di aggiungere a ogni tabella il campo Anno.
    Io aggiungerei un record fantasma a tutte le tabelle. Se non ho capito male, poi sarai costretto ad associare molti "fantasmi" a ogni "fantasma" della tabella successiva ecc...e questo ti provoca il problema della duplicazione valore. Allora ti conviene ragionare con i campi ID.
    Aggiungi a tutte le tabelle i relativi IDFamily, IDSubfamily, IDTribe, IDGenus, IDSubgnus, ID... di tipo "numerazione automatica" e chiave primaria.
    Ogni tabella figlia deve avere lo stesso nome di campo (come ultimo campo) ma di tipo numerico.
    Relaziona tutto di conseguenza.
  • Re: Relazioni tabelle

    OsvaldoLaviosa ha scritto:


    Allora ti conviene ragionare con i campi ID.
    Aggiungi a tutte le tabelle i relativi IDFamily, IDSubfamily, IDTribe, IDGenus, IDSubgnus, ID... di tipo "numerazione automatica" e chiave primaria.
    Ogni tabella figlia deve avere lo stesso nome di campo (come ultimo campo) ma di tipo numerico.
    Relaziona tutto di conseguenza.
    Si è come avevo pensato di fare anch'io. In sostanza, come dici tu, ho aggiunto ad ogni tabella i relativi campi ID (contatore e chiave primaria) ed ho aggiunto alle tabelle figlie lo stesso campo ID. Ad es. nella tabella Family ho aggiunto il campo IDFamily che ho messo pure nella tabella Subfamily come numerico ed ho messo in relazione uno a molti questi due campi. Ho fatto lo stesso poi per il restante delle tabelle.

    E' come dici anche tu, esatto ?

    Effettivamente così risolvo il problema.

    Ne approfitto (forse dovrei aprire un'altra discussione??) per chiederti se conosci qualcosa on-line ed anche un buon libro per imparare il VBA.

    Grazie mille della tua assistenza e disponibilità.

    Daniele
  • Re: Relazioni tabelle

    skipperdan ha scritto:


    E' come dici anche tu, esatto ?
    Esatto.

    Nel frattempo che tentavo di capire ed elaborare la corretta struttura del tuo database, ho interpellato un amico che lavora al CNR è ha una discreta infarinatura sulle strutture dei database. Gli ho sottoposto questo thread ed ecco la sua risposta:
    per andare dritto al sodo per i casi in cui sottogenere non c'è direi che anche corretto ripetere il nome di genere come unico sottogenere del genere in questione, la mancanza di autore annesso a questi sottogeneri fittizi aiuta a capire che si tratta di un tappa buchi. Le desinenze latine poi vanno bene, in quanto genere e sottogenere hanno le stesse.
    ...Se metti autori in tabella separata il collegamento nomi con autori andrebbe fatto con un ID perché nelle grandi banche dati tassonomiche si possono avere conflitti con stesso nome applicato con significati diversi da autori diversi. Le id sono necessarie se esistono conflitti tassonomici non risolti nella banca dati, ovverosia se il sottomettitore è uno e segue una tassonomia coerente.
    Alla tabella di concetto di specie si collega una tabella di
    classificazione (il tuo insiemi) dove vengono messi Famiglia, Sottofamiglia, Tribù, Genere, Sottogenere con i loro autori e anni.

    skipperdan ha scritto:


    Ne approfitto (forse dovrei aprire un'altra discussione??) per chiederti se conosci qualcosa on-line ed anche un buon libro per imparare il VBA.
    Vorrei impararlo anch'io come si deve. Lo sto cercando anch'io. A tutt'oggi (da circa un anno) sono riuscito a creare alcuni codici interessanti, ma tutti frutto di comparazione con esempi presi un po' da forum e siti vari, un po' da un manuale che tratta Access in maniera relativamente completa. Leggi pure la lista di manuali suggerita da questo forum iprogrammatori.
  • Re: Relazioni tabelle

    OsvaldoLaviosa ha scritto:


    Alla tabella di concetto di specie si collega una tabella di
    classificazione (il tuo insiemi) dove vengono messi Famiglia, Sottofamiglia, Tribù, Genere, Sottogenere con i loro autori e anni.
    Tutto abbastanza chiaro a parte quest'ultima frase.
    Seguendo il principio del tuo amico dovrei quindi ristrutturare il tutto creando una tabella "insiemi" con tutte le categorie tassonomiche (famiglia, etc)? ma anche la specie è una categoria. Perchè parla di tabella di specie ?

    Inoltre, se mettessi gli autori in una tabella separata avrei le tabelle delle categorie solo con il campo delle categorie.. non è un pò pochino come contenuto ?

    Grazie.

    Daniele
  • Re: Relazioni tabelle

    skipperdan ha scritto:


    Seguendo il principio del tuo amico dovrei quindi ristrutturare il tutto creando una tabella "insiemi" con tutte le categorie tassonomiche (famiglia, etc)? ma anche la specie è una categoria.
    Quella che io chiamavo Insiemi, chiamiamola col nome vero Categorie (d'ora in poi).

    skipperdan ha scritto:


    Perchè parla di tabella di specie?
    Da quanto ho capito io

    skipperdan ha scritto:


    Quale sarebbe il nome animale che intendi ? In biologia non esiste. Come ho spiegato c'è la famiglia che racchiude la sottofamiglia che racchiude il genere e così via fino all'ultima che è la specie (o sottospecie). Nel caso dell'uomo il nome animale è "Sapiens" (a cui si antepone il genere cioè "Homo" e diventa "Homo sapiens" ma questa è un'altra storia), ma queste due categorie (homo e sapiens) le dovrei mettere in Insiemi, secondo il tuo schema. Se per nome animale ti riferisci ad "uomo" (secondo il mio esempio) questo scientificamente non esiste ed infatti la stragrande maggioranza degli esseri viventi non ha un nome volgare.
    Il tuo database non può avere un campo NomeVolgare, ma in qualche modo dobbiamo fare riferimento al singolo Animale (Coleottero). Lo vogliamo chiamare IDAnimale con un numero? No, impossibile. Manco a farlo apposta un Animale va nominato come Homo Sapiens se si vuole dare una denominazione corta, altrimenti occorre scrivere tutte le Categorie.
    Penso che il mio amico parla di Specie in quanto è l'ultimo frammento di tutta la catena gerarchica e dal quale è più facile pescare/identificare (volgarmente) un Animale.
    Quindi quella che lui chiama tabella Specie, penso che dovrebbe essere la mia Animali.

    skipperdan ha scritto:


    Inoltre, se mettessi gli autori in una tabella separata avrei le tabelle delle categorie solo con il campo delle categorie.. non è un pò pochino come contenuto?
    No, se provi a inquadrare il discorso entro una logica di normalizzazione.
    Esistono molti database che hanno tante piccole tabelle "satelliti" con pochi valori. Tali tabelle, prese singolarmente, hanno scarsissimo valore, ma la loro funzione è proprio quella di procurare i valori per le tabelle figlie, magari sfruttando una casella combinata.

    L'osservazione del mio amico...temo ricalchi la mia prima struttura che però va rivista...
    Tutto il discorso mi ricorda un tema già affrontato in passato (ora non ricordo più i link), ma in pratica, in un database che parlava di Ricette e Ingredienti, si correva spesso il rischio di catalogare come Ingrediente anche una Ricetta parziale. Ho la stessa sensazione che qui possa accadere qualcosa di simile. Quindi, per ovviare a questo possibile inconveniente io rivedrei la struttura così:
    Animali
    IDAnimale (numerazione automatica, chiave primaria)
    Famiglia
    Sottofamiglia
    Tribù
    Genere
    Sottogenere
    Specie
    Sottospecie

    Tassonomie
    IDTassonomia (numerazione automatica, chiave primaria)
    Tassonomia
    IDAuthor (numerico)
    Anno
    Categoria

    DettagliAnimali
    IDDettaglio (numerazione automatica, chiave primaria)
    IDTassonomia (numerico)
    IDAnimale (numerico)

    Categorie
    Categoria

    Authors
    IDAuthor (numerazione automatica, chiave primaria)
    Cognome
    Nome

    Relazioni:
    Animali.IDAnimale uno-a-molti DettagliAnimali.IDAnimale
    Categorie.Categoria uno-a-molti Tassonomie.Categoria
    Tassonomie.IDTassonomia uno-a-molti DettagliAnimali.IDTassonomia
    Authors.IDAuthor uno-a-molti Tassonomie.IDAuthor

    C'è indubbiamente qualcosa di ridondante nel fatto che la tabella Animali contiene campi con valori ripescabili da DettagliAnimali. Non so quanto corretto sia dal punto di vista della normalizzazione...ma non mi viene nulla altro di meglio...al momento.
  • Re: Relazioni tabelle

    Ok Osvaldo, adesso cerco di rimettere insieme tutte queste info e non appena ridefinisco la struttura delle tabelle ti faccio vedere cosa ho combinato.
    Grazie veramente tanto dell'assistenza che mi hai dato fino ad ora.
    Daniele
Devi accedere o registrarti per scrivere nel forum
14 risposte