none
Struttura database: dubbio su relazioni (non sono esperta...) RRS feed

  • Domanda

  • Buongiorno a tutti,
    ho 2 tabelle: 'Manager' e 'Agenti' (ciascuno di questi fa riferimento a un determinato manager) legate nel modo seguente:
    SELECT * FROM Agenti INNER JOIN Manager ON Agenti.fk_manager = Manager.pk_manager
    Struttura
    [Manager]
    id_manager
    (...)

    [Agenti]
    id_agente
    fk_manager
    (...)

    Ora devo tenere conto anche delle vendite di ciascuno di loro quindi pensavo 2 possibili strade:
    Aggiungo nelle rispettive tabelle un campo 'numero_vendite' (datatype: int)
    oppure
    creo tabella 'Vendite' dove inserirò campo numerico e un generico campo persona dove inserisco id_manager o fk_agente?

    Ultimo dubbio: nel primo caso se mi chiedesseo uno storico degli aggiornamenti del numero vendite come potrei fare?

    Grazie
    Mara
    lunedì 9 novembre 2015 14:10

Risposte

  • Ciao Mara,

    crea una tabella vendite

    [Vendite]

    id_vendita

    fk_agente

    data_vendita

    valore

    ...

    le vendite sono effettuate da un agente non da un manager, quindi devi legare la tabella vendite a quella degli agenti, non a quella dei manager.

    Se un manager è anche un agente, lo censirai due volte: nella tabella manager ed in quella agenti.

    per ottenere la somma delle vendite di un agente effetui

    select

    a.nome,

    sum(v.valore)

    from

    agenti a left join vendite v on a.id_agente=v.fk_agente

    group by

    a.nome

    per ottenere la somma delle vendite raggruppata per manager

    select

    m.nome,

    sum(v.valore)

    from

    manager m

    left join agenti a on m.id_maganer = a.fk_manager

    left join vendite v on a.id_agente=v.fk_agente

    group by

    m.nome

    Per lo storico degli aggiornamenti fai direttamente una query su vendite, in join su agenti o su manager, ti consiglio inoltre di inserire un indice non clustered sulla data vendita.

    martedì 10 novembre 2015 10:09
  • Ciao, una sola puntualizzazione.

    Una sola tabella Persone (o Agenti) avrebbe si risolto il tuo problema. 

    Agenti
    id_agente
    fk_agente

    Con questo tipo di struttura saresti riuscito a risolvere inoltre gerarchie piu complesse che con le tabelle da te impostate non risolveresti a meno di non ridondare i dati.

    In sostanza se un manager è manager di altri manager come fai? (perdonami lo sciogli lingua)

    Con questa struttura invece il manager capo, o il semplice agente senza superiori, non avrà fk, il sottoposto avrà come fk l'id del capo, eventuali livelli successivi avranno l'id del manager che gli sta sopra fino all'ultimo livello.
    A questo punto è consigliata l'aggiunta di un campo ruolo che faccia riferimento alla tabella Ruoli come previsto da Andrea.

    id fk

    1 null
    2 1
    3 1
    4 2
    5 2
    6 2
    7 3

    Vale ovviamente sempre la tabella Vendite come strutturata da Andrea Caldarone.

    Un abbraccio
    Daniele

    mercoledì 11 novembre 2015 11:52

Tutte le risposte

  • Ciao Mara,

    crea una tabella vendite

    [Vendite]

    id_vendita

    fk_agente

    data_vendita

    valore

    ...

    le vendite sono effettuate da un agente non da un manager, quindi devi legare la tabella vendite a quella degli agenti, non a quella dei manager.

    Se un manager è anche un agente, lo censirai due volte: nella tabella manager ed in quella agenti.

    per ottenere la somma delle vendite di un agente effetui

    select

    a.nome,

    sum(v.valore)

    from

    agenti a left join vendite v on a.id_agente=v.fk_agente

    group by

    a.nome

    per ottenere la somma delle vendite raggruppata per manager

    select

    m.nome,

    sum(v.valore)

    from

    manager m

    left join agenti a on m.id_maganer = a.fk_manager

    left join vendite v on a.id_agente=v.fk_agente

    group by

    m.nome

    Per lo storico degli aggiornamenti fai direttamente una query su vendite, in join su agenti o su manager, ti consiglio inoltre di inserire un indice non clustered sulla data vendita.

    martedì 10 novembre 2015 10:09
  • Buongiorno,
    prendo atto della soluzione proposta e sollevo una perplessità... mi aiuta a capire gli aspetti della progettazione.
    Se inserissi id_manager nella tabella 'Vendite', supponiamo in un generico campo idpersona, e poi anche id_agente nello stesso campo avrei una struttura simile:
    IDvendite | IDpersona |
    1 | 1 -- ID di un manager |
    2 | 2 -- ID di un agente |
    .. | ..
    Come potrei discriminare se l'ID nel campo IDpersona si riferisce a manager o agente?
    Lavoro con SQL Server e studio management come tool per creare relazioni e query.

    Graficamente posso utilizzare tabella 'Vendite' 2 volte mettendola in relazione sia con id_manager e id_agente?
    In pratica: creo 1^ relazione 'Vendite'/'Manager' (IDpersona-id_manager) e poi 2^ relazione 'Vendite_1'/'Agenti' (IDpersona-id_agente): è un'operazione lecita?

    Spero di essermi spiegata :-)

    Grazie
    Mara

    • Modificato mara_iet martedì 10 novembre 2015 11:56
    martedì 10 novembre 2015 11:52
  • Ciao Mara,

    stai scrivendo una cosa diversa rispetto al tuo primo post. Se vuoi gestire Manager e Agenti con un'unica generica tabella "Persone" (non è  una brutta idea, anzi) hai bisogno di due tabelle, la Tabella "Persone" con nome, cognome, etc. e la tabella "Ruoli" fatta fosì:

    [Ruoli]

    ID - primary key

    Descrizione

    -------------------------------

    Nella tabella persone hai bisogno di una chiave esterna che punta la primary key di Ruoli, a quel punto mettendo in join "Vendite", "persone" e "Ruoli" puoi sempre sapere se la vendita è di un manager o di un agente.

    martedì 10 novembre 2015 12:00
  • Ciao Mara,

    stai scrivendo una cosa diversa rispetto al tuo primo post. Se vuoi gestire Manager e Agenti con un'unica generica tabella "Persone" (non è  una brutta idea, anzi) hai bisogno di due tabelle, la Tabella "Persone" con nome, cognome, etc. e la tabella "Ruoli" fatta fosì:

    [...]

    Ci avevo pensato ma la struttura iniziale è nata perchè un manager, che può effettuare N vendite, ha "sotto di sè" degli agenti, anch'essi impegnati in N vendite (una sola tabella persone non permetterebbe questa gerarchia).
    Spero di non aver confuso le idee... la tabella 'Vendite' con il campo generico idpersona pensavo potesse servire ad associare il manager e l'agente rispettivamente con le loro N vendite. Il dubbio riguardava l'utilizzo della tabella 'Vendite' relazionata 2 volte con 'Manager' e 'Agenti'.

    Grazie per tutti i contributi!
    Mara

    martedì 10 novembre 2015 13:59
  • Ciao, una sola puntualizzazione.

    Una sola tabella Persone (o Agenti) avrebbe si risolto il tuo problema. 

    Agenti
    id_agente
    fk_agente

    Con questo tipo di struttura saresti riuscito a risolvere inoltre gerarchie piu complesse che con le tabelle da te impostate non risolveresti a meno di non ridondare i dati.

    In sostanza se un manager è manager di altri manager come fai? (perdonami lo sciogli lingua)

    Con questa struttura invece il manager capo, o il semplice agente senza superiori, non avrà fk, il sottoposto avrà come fk l'id del capo, eventuali livelli successivi avranno l'id del manager che gli sta sopra fino all'ultimo livello.
    A questo punto è consigliata l'aggiunta di un campo ruolo che faccia riferimento alla tabella Ruoli come previsto da Andrea.

    id fk

    1 null
    2 1
    3 1
    4 2
    5 2
    6 2
    7 3

    Vale ovviamente sempre la tabella Vendite come strutturata da Andrea Caldarone.

    Un abbraccio
    Daniele

    mercoledì 11 novembre 2015 11:52