Info progettazione tabelle database

di il
6 risposte

Info progettazione tabelle database

Salve a tutti!
Ho un dubbio sulla realizzazione di alcune tabelle su un database relazionale. Vi spiego brevemente...
Ho un gruppo di utenti a cui sono correlate delle categorie, a loro volta a queste categorie sono correlate delle sotto categorie.
Schematizzando, ad un utente è assegnato qualcosa del genere:

utente 1 -> categoriaA -> {valoreSottoCatA1, valoreSottoCatA2, valoreSottoCatA3}
utente 1 -> categoriaB -> {valoreSottoCatB3, valoreSottoCatB4}
ecc...

Il numero di categorie e sottocategorie, può essere anche elevato (ad esempio 10 categorie e 50 sottocategorie ).
Quello che mi serve fare è avere una tabella che raggruppi l'utente in base alle categorie e alle sottocategorie.
Mi spiego meglio, ciò che voglio è una tabella del genere


| IDutente | IDcategoria | sottocategoria A1 | sottocategoria A2 | sottocategoria A3 | sottocategoria B1 | sottocategoria B2
----1--------2-----------1000--------------5000--------------3500--------------0-----------------0-------
----1--------5-----------450---------------300---------------180---------------0-----------------0-------
----1--------3------------0------------------0----------------0---------------120----------------230------

Vi dico quale è il mio dilemma... Per una situazione del genere, farei una tabella in cui metterei 3 colonne:

| utente | categoria | sottocategoria |

Ma se il database avesse centinaia di migliaia di utenti, questo è il modo corretto di fare le tabelle? Mi è stato consigliato di creare una tabella di riepilogo, le cui colonne siano l'utente, la categoria e ogni sottocategoria, un pò come l'esempio che ho fatto sopra. Francamente penso che sia un modo sbagliato di lavorare, ma se il numero di utenti è elevato, una scelta del genere è giustificabile? Mi è stato anche consigliato di assegnare al nome delle colonne delle sottocategorie, l'id contenuto nelle tabelle dove queste sono elencate.
Cosa mi consigliate di fare?
Spero di essere stato chiaro nella descrizione, grazie a tutti.

6 Risposte

  • Re: Info progettazione tabelle database

    Veramente non ho capito un granché del tuo schema (utente1).
    Comunque, in questi casi si usa una tabella con 4 campi:

    IDChiavePK - IDUtente - IDCategoria - IDSottoCategoria

    per i 'nomi' ovviamente la metterai in JOIN con le rispettive tabelle.
  • Re: Info progettazione tabelle database

    Gibra hai ragione! si è sballata completamente la visualizzazione... mi dispiace, scusami....
    Cerco di riscrivere, quale dovrebbe essere il risultato, come se guardassi una tabella

    IDutente | categoria | valSottoCat1 | valSottoCat2 | valSottoCat3
    --1-------CAT1--------100-----------990-------------
    --1-------CAT2--------1000--------------------------
    --1-------CAT3--------350-----------500-------100---

    Adesso spero sia più chiaro...
    Quello che mi è stato consigliato è stato:
    - creare una colonna per l'utente
    - creare una colonna per le categorie
    - creare una colonna per ogni sotto categoria

    Ovviamente so che questo modo di procedere non rispecchia per niente la logica dei database relazionali e non rispecchia per niente la logica di scalabilità.
    Ma se l'utente dovesse contenere centinaia di migliaia di utenti una tabella del tipo:

    | IDutente | categoria | IDsottocategoria | Valore |
    ----1------CAT1----------1---------100--
    ----1------CAT1----------2---------990--
    ----1------CAT2----------1--------1000--
    ----1------CAT3----------1---------350--
    ----1------CAT3----------2---------500--
    ----1------CAT3----------3---------100--

    è corretta?
    Il mio dubbio è questo... ho paura che le query diventino troppo lente e che questo non sia il giusto approccio...
  • Re: Info progettazione tabelle database

    Il consiglio è 'quasi' corretto.

    Quello che è sbagliato è il campo CATEGORIA, che non deve esserci , altrimenti la tabella non è normalizzata.
    Se un domani dovessi cambiare il nome ad una o più categorie sei costretto a modificare tutte le tabelle in cui appare il campo Categoria.
    Mentre se normalizzata, cambi il nome della categoria solo nella tabella Categorie. Punto.

    Il campo Valore, invece, non capisco cosa c'entra...
  • Re: Info progettazione tabelle database

    Il campo valore, indica il valore assegnato ad ogni sottocategoria.
    Solo che forse non sono stato chiaro, perchè il consiglio che mi hanno dato è quello di creare una tabella con delle colonne del tipo:

    IDutente | IDcategoria | ValSottoCat1 | ValSottoCat2 | ValSottoCat3 | ecc....

    Credo che questo tipo di approccio non sia corretto...

    Il metodo che io ritengo corretto è quello che ho indicato alla fine del precedente messaggio e cioè:

    | IDutente | IDcategoria | IDsottocategoria | Valore |

    Mi confermi che quest'ultimo modo di agire è quello corretto?
  • Re: Info progettazione tabelle database

    cymik ha scritto:


    Il campo valore, indica il valore assegnato ad ogni sottocategoria.
    Il campo Valore non va indicato in questa tabella, non è una tabella di dati, ma è una tabella di 'raccordo'.
    Se lasci il campo Valore la tabella non è normalizzata (vale lo stesso discorso fatto per il campo Categoria).

    Avevo capito male, quindi ti confermo che quello che ti hanno consigliato è sbagliato.
  • Re: Info progettazione tabelle database

    Gibra ti ringrazio molto per la risposta.
    Grazie mille, a presto
Devi accedere o registrarti per scrivere nel forum
6 risposte