sfondo
Sono uno studente CS del primo anno e lavoro part-time per la piccola impresa di mio padre. Non ho alcuna esperienza nello sviluppo di applicazioni nel mondo reale. Ho scritto degli script in Python, alcuni corsi in C, ma niente del genere.
Mio padre ha una piccola attività di formazione e attualmente tutte le lezioni sono programmate, registrate e seguite tramite un'applicazione web esterna. Esiste una funzione di esportazione / "report" ma è molto generica e abbiamo bisogno di report specifici. Non abbiamo accesso al database effettivo per eseguire le query. Mi è stato chiesto di impostare un sistema di segnalazione personalizzato.
La mia idea è quella di creare le esportazioni CSV generiche e importarle (probabilmente con Python) in un database MySQL ospitato in ufficio ogni notte, da dove posso eseguire le query specifiche necessarie. Non ho esperienza nei database ma capisco le basi. Ho letto un po 'sulla creazione di database e forme normali.
Potremmo iniziare presto ad avere clienti internazionali, quindi voglio che il database non esploda se / quando ciò accade. Al momento abbiamo anche un paio di grandi aziende come clienti, con diverse divisioni (ad es. Società madre ACME, divisione sanitaria ACME, divisione ACME bodycare)
Lo schema che ho escogitato è il seguente:
- Dal punto di vista del cliente:
- I clienti è il tavolo principale
- I clienti sono collegati al dipartimento per cui lavorano
- I dipartimenti possono essere sparsi in un paese: risorse umane a Londra, marketing in Swansea, ecc.
- I dipartimenti sono collegati alla divisione di una società
- Le divisioni sono collegate alla società madre
- Dal punto di vista delle lezioni:
- Sessioni è la tabella principale
- Un insegnante è collegato ad ogni sessione
- Uno statusid viene assegnato a ciascuna sessione. Ad esempio 0 - Completato, 1 - Annullato
- Le sessioni sono raggruppate in "pacchetti" di dimensioni arbitrarie
- Ogni pacchetto è assegnato a un client
- Sessioni è la tabella principale
Ho "disegnato" (più come scarabocchiato) lo schema su un pezzo di carta, cercando di mantenerlo normalizzato nella terza forma. L'ho quindi inserito in MySQL Workbench e mi ha reso tutto molto carino:
( Fai clic qui per un elemento grafico a dimensioni intere )
(fonte: maian.org )
Query di esempio che eseguirò
- Quali clienti con credito ancora lasciato sono inattivi (quelli senza una classe programmata in futuro)
- Qual è il tasso di frequenza per cliente / dipartimento / divisione (misurato dall'ID di stato in ogni sessione)
- Quante lezioni ha avuto un insegnante in un mese
- Contrassegna i clienti con un basso tasso di frequenza
- Rapporti personalizzati per i dipartimenti risorse umane con i tassi di frequenza delle persone nella loro divisione
Domande)
- È troppo ingegnoso o sto andando nella direzione giusta?
- La necessità di unire più tabelle per la maggior parte delle query determinerà un grande successo in termini di prestazioni?
- Ho aggiunto una colonna "lastession" ai clienti, poiché probabilmente sarà una query comune. È una buona idea o devo mantenere il database strettamente normalizzato?
Grazie per il tuo tempo
divisions
ha una colonna denominata divisionid
. Non lo trovi ridondante? Basta nominarlo id
. anche i nomi delle tue tabelle, tra cui _has_
: lo rimuoverei e lo nominerei per esempio cities_departments
. le DATETIME
colonne devono essere di tipo a TIMESTAMP
meno che non siano valori di input dell'utente. Penso che sia una buona idea avere i tavoli cities
e countries
. potresti riscontrare problemi nel limitare le tabelle a un singolo status
. prendi in considerazione l'uso di an INT
ed esegui confronti bit a bit su di esso in modo da poter avere più significato lì