Contexte
Je suis un étudiant CS de première année et je travaille à temps partiel pour la petite entreprise de mon père. Je n'ai aucune expérience dans le développement d'applications dans le monde réel. J'ai écrit des scripts en Python, des cours en C, mais rien de tel.
Mon père a une petite entreprise de formation et actuellement toutes les classes sont planifiées, enregistrées et suivies via une application Web externe. Il existe une fonction d'exportation / "rapports" mais elle est très générique et nous avons besoin de rapports spécifiques. Nous n'avons pas accès à la base de données réelle pour exécuter les requêtes. On m'a demandé de mettre en place un système de reporting personnalisé.
Mon idée est de créer les exportations CSV génériques et de les importer (probablement avec Python) dans une base de données MySQL hébergée au bureau tous les soirs, d'où je peux exécuter les requêtes spécifiques qui sont nécessaires. Je n'ai pas d'expérience dans les bases de données mais je comprends les bases. J'ai lu un peu sur la création de bases de données et les formulaires normaux.
Nous pouvons commencer à avoir des clients internationaux bientôt, donc je veux que la base de données n'explose pas si / quand cela se produit. Nous avons également actuellement quelques grandes sociétés en tant que clients, avec différentes divisions (par exemple, société mère ACME, division soins de santé ACME, division soins corporels ACME)
Le schéma que j'ai trouvé est le suivant:
- Du point de vue du client:
- Les clients sont la table principale
- Les clients sont liés au département pour lequel ils travaillent
- Les départements peuvent être dispersés à travers un pays: RH à Londres, Marketing à Swansea, etc.
- Les départements sont liés à la division d'une entreprise
- Les divisions sont liées à la société mère
- Du point de vue des classes:
- Les sessions sont la table principale
- Un enseignant est lié à chaque session
- Un statusid est donné à chaque session. Par exemple: 0 - Terminé, 1 - Annulé
- Les sessions sont regroupées en "packs" de taille arbitraire
- Chaque pack est attribué à un client
- Les sessions sont la table principale
J'ai "conçu" (plus comme griffonné) le schéma sur un morceau de papier, essayant de le maintenir normalisé à la 3ème forme. Je l'ai ensuite branché dans MySQL Workbench et cela m'a rendu tout joli:
( Cliquez ici pour un graphique en taille réelle )
(source: maian.org )
Exemples de requêtes que je vais exécuter
- Quels clients avec crédit restant sont inactifs (ceux sans cours prévu à l'avenir)
- Quel est le taux de présence par client / département / division (mesuré par l'ID de statut dans chaque session)
- Combien de cours un enseignant a-t-il eu en un mois
- Signaler les clients qui ont un faible taux de fréquentation
- Rapports personnalisés pour les départements RH avec des taux de présence des personnes dans leur division
Des questions)
- Est-ce trop ingénieux ou suis-je sur la bonne voie?
- La nécessité de joindre plusieurs tables pour la plupart des requêtes entraînera-t-elle une forte augmentation des performances?
- J'ai ajouté une colonne «dernière session» aux clients, car ce sera probablement une requête courante. Est-ce une bonne idée ou dois-je garder la base de données strictement normalisée?
Merci pour votre temps
divisions
a une colonne nommée divisionid
. Ne trouvez-vous pas cela redondant? Nommez-le simplement id
. également vos noms de table, y compris _has_
: je supprimerais cela et le nommerais par exemple cities_departments
. vos DATETIME
colonnes doivent être de type TIMESTAMP
sauf s'il s'agit de valeurs saisies par l'utilisateur. Je pense que c'est une bonne idée d'avoir les tables cities
et countries
. vous pouvez rencontrer des problèmes pour limiter les tables à un seul status
. envisagez d'utiliser un INT
et effectuez des comparaisons au niveau du bit sur celui-ci afin que vous puissiez y donner plus de sens