come applicare un self join del database (o esiste un modo migliore)
-
06-07-2019 - |
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?
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.