Domanda

Ho una tabella dei dipendenti in un database e voglio collegare un dipendente al suo manager:

Dipendente Tabella

  • employee_id
  • first_name
  • cognome
  • manager_id

Se manager_id è solo un'altra riga nella stessa tabella in cui il manager ha come proprio dipendente, qual è il modo migliore per imporre che se elimino un dipendente verifica che questo dipendente non sia il manager di un altro dipendente?

Esiste una migliore pratica per questo?

È stato utile?

Soluzione

Puoi usare un self join proprio come ti unisci ad altri tavoli usando PK & amp; FK .

Penso che dovresti progettarlo con alcune cose da considerare. Esempi:

  • Manager diversi: Tom è oggi un Jr. Pgmr e Jerry è il suo manager oggi. Domani Tom potrebbe riferire a Sebastian.
  • Promozioni: Tom è un Jr. Pgmr oggi e Jerry è il suo manager oggi. Domani Tom potrebbe diventare lui stesso un manager e avere delle persone che gli segnalano.
  • Promozioni 2: Tom può passare da Jr Pgmr a Sr Pgmr da Team Lead a Project Lead a Manager. Vuoi salvarlo?
  • Rapporti: potresti voler mostrare la gerarchia in un determinato momento (alcuni utenti verranno prima o poi a chiedere questo rapporto)

Potresti prendere in considerazione la suddivisione dei dati in entità separate - normalizzando i dati come segue (o anche di più secondo le tue esigenze)

  • Tabella dei dipendenti: informazioni di base sui dipendenti
  • Tabella di ricerca della posizione: elenco di tutte le posizioni nell'organizzazione
  • Tabella delle posizioni dei dipendenti: traccia con la data di inizio e la data di fine in cui si è verificato un cambio di posizione per il dipendente.
  • Tabella gerarchia posizione dipendente: quale posizione dipendente riporta a un'altra posizione dipendente (utilizzando un doppio join anziché un self join); con i timestamp di inizio e fine

Altri suggerimenti

È possibile utilizzare un vincolo di chiave esterna (senza eliminazione a cascata). Se provi a eliminare un manager che ha ancora altri dipendenti sotto di lui, il database lo rileverà automaticamente e l'operazione fallirà.

Usa un'associazione molti-a-molti per coprire le tue basi, nel caso in cui la tua applicazione (o organizzazione) si evolva.

Employee.Employee_id  <- EmployeeManager.Employee_id 
                         EmployeeManager.Manager_id -> Employee.Employee_id
                         Manager_role_type
                         etc.

Usa sempre vincoli di chiave esterna.

Usa la chiave esterna, ecco un "solito" " approccio a questo:

 employee_model_01

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top