Mis à jour :22 janvier 2018 par Richard Holowczak
Les documents suivants documentent la conception et le développement d'une application de base de données pour prendre en charge un petit salon de coiffure. Le projet commence par une description de l'entreprise et se poursuit par la modélisation conceptuelle (E-R), la modélisation logique (relationnelle), la modélisation physique et enfin la mise en œuvre d'une application de base de données. Des notes (commentaires) sont fournies à la fin de chaque section pour expliquer certaines caractéristiques spécifiques des étapes en cours.
Table des matières
Je. Scénario commercial
II. Modèle ER utilisant la notation UML
III. Conversion au modèle relationnel
IV. Normalisation
V. Création du schéma de base de données avec SQL
VI. Application de base de données
VII. Conclusion
.
Je. Scénario d'entreprise
Notre société possède et exploite un salon de coiffure et de manucure dans le centre de Manhattan depuis 7 ans. Nous utilisons des feuilles de calcul et un journal de bord papier pour suivre les clients, les rendez-vous et les paiements. Nous aimerions remplacer cette méthode manuelle de suivi de l'entreprise par une base de données.
Dans notre entreprise, les clients prennent rendez-vous avec leur coiffeur préféré (personnes qui coupent et coiffent les cheveux des clients) ou un autre employé et peuvent se livrer à un certain nombre de services tels que la coupe/coiffage de base, la couleur des cheveux, les mèches, la permanente, le soin du visage, manucure, pédicure, etc. Nous devons garder une trace des matériaux (shampooing, couleur des cheveux) et du temps qu'il faudra pour terminer chaque service. Bien que chaque service ait un prix standard, les promotions et d'autres facteurs peuvent affecter le prix réel proposé au client pour le service donné.
Nous devons également garder une trace de nos employés, y compris leur adresse personnelle, leurs coordonnées et leur taux de rémunération. Nous devons garder une trace des coordonnées de chaque client ainsi que de son sexe. Pour les rendez-vous, nous devons connaître la date et l'heure du rendez-vous et le client auquel le rendez-vous est destiné.
Commentaire
Sur la base de la description ci-dessus, construisez un modèle de relation d'entité à l'aide de la notation UML qui capturera tous les besoins de données de l'entreprise.
II. Modèle ER utilisant la notation UML
Sur la base de la description ci-dessus, nous développons le modèle de relation d'entité suivant en utilisant la notation UML.
Commentaire
Ce que nous aimons dans ce modèle :
- Toutes les lignes de relation vont dans une position horizontale ou verticale. Aucune ligne n'est franchie.
- Les noms d'attributs sont épelés sans espaces dans les noms. Aucune abréviation n'est utilisée.
- Chaque relation a deux expressions à partir desquelles nous pouvons créer des phrases de relation (voir la section suivante).
- Le diagramme a également une "légende" dans le coin supérieur droit afin que nous puissions dire ce que le diagramme représente et qui a modifié le diagramme en dernier.
Phrases relationnelles
Un client peut-être prendre un ou plusieurs rendez-vous
Un rendez-vous doit être une réservation pour un et un seul Client
Un SalonService peut-être un service rendu sous la forme d'un ou plusieurs ServiceRendered
Un ServiceRendu doit être un rendu d'un et un seul SalonService
Un Employé peut-être rendu un ou plusieurs ServiceRendered
Un ServiceRendu doit être rendu par un et un seul Employé
Un rendez-vous peut-être une réservation pour fournir un ou plusieurs ServiceRendered
Un ServiceRendu doit être un service spécifique rendu lors d'un et un seul Rendez-vous
Commentaire
Les phrases de relation doivent avoir un sens. Dans cet exemple, les phrases verbales sont soulignées. Les noms des entités sont en caractères gras. La cardinalité minimale (peut être pour 0 et doit être pour 1) sont écrits en italique. La cardinalité maximale s'écrit "un ou plusieurs" pour * et "un et un seul" pour 1.
Une fois le modèle ER finalisé, nous passons à l'étape suivante :convertir le modèle ER conceptuel en un modèle relationnel logique.
III. Conversion en modèle relationnel
L'étape suivante consiste à convertir le diagramme Entity Relationship en un modèle relationnel. Au cours de cette étape, les identifiants dans les entités deviennent des clés dans les relations. Les relations un-à-plusieurs entraînent la copie d'une clé étrangère du côté un vers le côté plusieurs de la relation.
Client ( CustomerID (clé), FirstName, LastName, PhoneNumber, Street, City, State, ZipCode )
SalonService ( ServiceID (clé), ServiceName, ServiceDuration, ServicePrice, ServiceMaterials )
Employé ( EmployeeID (clé), FirstName, LastName, Street, City, State, ZipCode, PayRate )
Rendez-vous ( AppointmentID (clé), AppointmentDate, AppointmentTime, CustomerID (fk) )
ServiceRendu ( AppointmentID (fk)(key), LineItemNumber(key), ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk))
Il s'agit de "l'ensemble initial de relations".
Commentaire
- Remarquez que le ServiceRendered L'entité du modèle ER est dépendante de l'ID, ce qui signifie qu'elle a besoin d'un attribut en plus de LineItemNumber pour former une clé composite.
- Les clés sont affichées avec la désignation (clé) et les clés étrangères sont affichées avec la désignation (fk).
L'étape suivante consiste à normaliser l'ensemble initial de relations.
IV. Normalisation
L'étape suivante consiste à normaliser les relations.
Les étapes à suivre pour chaque relation sont :
- Écrivez la relation, y compris tous les noms d'attributs. Indiquez les clés et les clés étrangères.
- Fournissez des exemples de données pour la relation.
- Indiquez la clé pour la relation et notez toutes les dépendances fonctionnelles .
- Parcourez les définitions de chaque forme normale en commençant par 1NF et en remontant jusqu'à BCNF (ou 3NF selon les exigences de votre projet).
- Si une relation correspond à la définition d'une forme normale, passer à la forme normale supérieure suivante.
- Si une relation ne répond pas à la définition d'une forme normale (par exemple, si elle contient une dépendance de clé partielle ou si elle contient une dépendance transitive), divisez la relation en deux nouvelles relations.
Commencez le processus de normalisation depuis le début avec chacune de ces deux nouvelles relations.
Relation Client
Client (ID client (clé), Prénom, Nom, Téléphone du client, Rue, Ville, État, Code postal, Sexe)
Exemple de données
ID client | Prénom | Nom | Numéro de téléphone | Rue | Ville | État | Code postal | Sexe |
---|---|---|---|---|---|---|---|---|
C101 | Élia | Fawcett | 201-222-2222 | 8989 chemin Smith | Garfield | New Jersey | 07026 | F |
C102 | Ishwarya | Roberts | 201-222-3333 | 65, chemin Hope | Garfield | New Jersey | 07026 | M |
C103 | Frédéric | Fawcett | 201-222-2222 | 8989 chemin Smith | Garfield | New Jersey | 07026 | M |
C104 | Goldie | Montand | 201-222-4321 | 5235 Ironwood Ln | Garfield | New Jersey | 07026 | F |
C105 | Dheeraj | Alexandre | 201-222-4545 | 666 22e avenue | Bergenfield | New Jersey | 07621 | M |
C106 | Josie | Davis | 201-333-6789 | 4200, avenue Bluejay | Bergenfield | New Jersey | 07621 | F |
C107 | Faye | Glenn | 201-333-4242 | 1522, rue Main | Parc de la falaise | New Jersey | 07010 | F |
C108 | Lauren | Hershey | 201-444-1313 | 2360, chemin Maxon | Englewood | New Jersey | 07631 | F |
Clé :CustomerID
FD1 :ID client -> Prénom, Nom, Numéro de téléphone, Rue, Ville, État, Code postal, Sexe
FD2 :Code postal -> Ville, État
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :une dépendance transitive existe :CustomerID -> ZipCode et ZipCode -> City, State
Solution :divisez la relation client en deux nouvelles relations nommées CustomerData et ZipCodes :
CustomerData (CustomerID (clé), FirstName, LastName, CustPhone, Street, ZipCode (fk), Gender )
Clé :CustomerID
FD1 :ID client -> Prénom, Nom, Numéro de téléphone, Rue, Code postal (fk), Sexe
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :pas de dépendances transitives
BCNF :Tous les déterminants sont des clés candidates
Codes postaux (code postal (clé), ville, état)
Clé :code postal
FD1 :Code postal -> Ville, État
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :pas de dépendances transitives
BCNF :Tous les déterminants sont des clés candidates
Relation SalonService
SalonService ( ServiceID (clé), ServiceName, ServiceDuration, ServicePrice, ServiceMaterials )
Exemple de données :
ID de service | ServiceDuration | Prix du service | Matériaux de service | |
---|---|---|---|---|
SV101 | Coupe de cheveux pour hommes | 20 | 22.00 | Aucun |
SV102 | Coupe de cheveux pour femmes | 30 | 32,00 | Aucun |
SV103 | Coupe de cheveux pour enfants | 20 | 15.00 | Aucun |
SV104 | Couleur des cheveux des femmes | 60 | 76,00 | Couleur, réactif, gants, pinceau réactif, feuille |
SV105 | Coupe de cheveux pour femmes | 45 | 56,00 | Shampoing, Après-shampooing |
SV106 | Style de coiffure pour hommes | 45 | 46,00 | Shampoing, Après-shampooing |
Clé :ServiceID
FD1 :ServiceID -> ServiceName, ServiceDuration, ServicePrice, ServiceMaterials
1NF :ServiceMaterials peut être traité comme un attribut à valeurs multiples. Dans ce cas SalonService n'est pas en 1NF.
Solution :divisez ServiceMaterials en une relation distincte.
Pour cet exemple, nous conserverons cependant ServiceMaterials comme attribut de la relation SalonService.
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :pas de dépendances transitives
BCNF :Tous les déterminants sont des clés candidates
Relation Employé
Employee( EmployeeID (key), FirstName, LastName, Street, City, State, ZipCode, PayRate )
Identifiant de l'employé | Prénom | Nom | Rue | Ville | État | Code postal | Taux de rémunération |
---|---|---|---|---|---|---|---|
E300 | Joie | Aveda | 46, avenue Easton | Garfield | New Jersey | 07026 | 18.00 |
E400 | Géraldo | Géraldo | 12 Fortis Blvd. Apte. 2A | Garfield | New Jersey | 07026 | 22.00 |
E500 | Bonjour | Petruzzio | 70, rue Wilard | Garfield | New Jersey | 07026 | 20.00 |
E600 | Landry | Monroe | 73 Holly Terrasse | Parc de la falaise | New Jersey | 07010 | 18.00 |
E700 | Pat | Reese | 2 Place Lincoln | Parc de la falaise | New Jersey | 07010 | 23.00 |
E800 | Hiver | Tanneur | 215, avenue Elm | Collier | New Jersey | 07665 | 23.00 |
Clé :ID de l'employé
FD1 :EmployeeID -> FirstName, LastName, Street, City, State, ZipCode, PayRate
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :une dépendance transitive existe :EmployeeID -> ZipCode et ZipCode -> City, State
Solution :divisez la relation client en deux nouvelles relations nommées EmployeeData et ZipCodes :
EmployeeData(EmployeeID (key), FirstName, LastName, Street, ZipCode (fk), PayRate )
Clé :ID de l'employé
FD1 :EmployeeID -> FirstName, LastName, Street, ZipCode (fk), PayRate
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :pas de dépendances transitives
BCNF :Tous les déterminants sont des clés candidates
Remarque :Nous avons déjà une relation Codes postaux à partir du moment où la relation Client a été scindée. Nous réutilisons donc cette relation ZipCodes. Il n'est pas nécessaire de créer une deuxième relation ZipCodes.
Relation de rendez-vous
Rendez-vous ( AppointmentID (clé), AppointmentDate, AppointmentTime, CustomerID (fk) )
Exemple de données :
ID de rendez-vous | Date du rendez-vous | Heure du rendez-vous | ID client |
---|---|---|---|
A400 | 22/10/2017 | 11:00:00 | C101 |
A401 | 06/11/2017 | 12:45:00 | C102 |
A402 | 07/12/2017 | 14:00:00 | C106 |
A403 | 18/12/2017 | 15:30:00 | C106 |
A404 | 21/12/2017 | 11:30:00 | C108 |
A405 | 31/12/2017 | 10:00:00 | C107 |
A406 | 1/11/2018 | 15:15:00 | C103 |
A407 | 12/01/2018 | 14:30:00 | C104 |
A408 | 22/01/2018 | 16:00:00 | C105 |
Clé :ID de rendez-vous
FD1 :ID de rendez-vous -> Date de rendez-vous, heure de rendez-vous, ID client (fk)
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :pas de dépendances transitives
BCNF :Tous les déterminants sont des clés candidates
Relation rendue par le service
ServiceRendered ( AppointmentID (fk)(key), LineItemNumber(key), ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk) )
Exemple de données :
ID de rendez-vous | LineItemNumber | ID de service | ServiceExtendedPrix | Identifiant de l'employé |
---|---|---|---|---|
A400 | 1 | SV104 | 75,00 | E400 |
A400 | 2 | SV102 | 25,00 | E400 |
A401 | 1 | SV101 | 22.00 | E500 |
A402 | 1 | SV104 | 75,00 | E600 |
A402 | 2 | SV102 | 30,00 | E800 |
A403 | 1 | SV105 | 50,00 | E300 |
A404 | 1 | SV105 | 55,00 | E300 |
A405 | 1 | SV102 | 30,00 | E700 |
A405 | 2 | SV104 | 70,00 | E700 |
A405 | 3 | SV105 | 50,00 | E700 |
Clé :AppointmentID, LineItemNumber
FD1 :ID de rendez-vous, numéro d'élément de ligne > ID de service (fk), prix étendu du service, ID d'employé (fk)
1NF :Répond à la définition d'une relation
2NF :Pas de dépendances de clé partielles
3NF :pas de dépendances transitives
BCNF :Tous les déterminants sont des clés candidates
Ensemble final de relations
Client ( CustomerID (clé) , FirstName, LastName, PhoneNumber, Street, ZipCode (fk), Gender )
Codes postaux (Code postal (clé), Ville, État)
SalonService ( ServiceID (clé), ServiceName, ServiceDuration, ServicePrice, ServiceMaterials )
Employé ( EmployeeID (clé), FirstName, LastName, Street, ZipCode (fk), PayRate )
Rendez-vous ( AppointmentID (clé), AppointmentDate, AppointmentTime, CustomerID (fk) )
ServiceRendu ( AppointmentID (fk)(key), LineItemNumber(key), ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk))
Commentaire
- Notez qu'une seule relation ZipCodes est requise. Il est partagé avec les relations clients et employés.
- Comme indiqué précédemment, l'attribut ServiceMaterials n'a pas été normalisé dans cet exemple. Peut-être que cela peut être fait dans une future affectation ou amélioration du modèle.
Maintenant que les relations sont normalisées, le schéma peut être créé dans un système de gestion de base de données à l'aide d'un langage de requête structuré (SQL).
V. Création du schéma de base de données avec le langage de requête structuré
Créez une table dans la base de données pour chacune des relations dans l'ensemble final de relations.
Le code SQL suivant crée les six tables et ajoute la contrainte PRIMARY KEY à chacune :
CREATE TABLE ZipCodes( code postal VARCHAR(12) NOT NULL, ville VARCHAR(36), état VARCHAR(4), CONSTRAINT pk_zipcodes PRIMARY KEY (code postal))CREATE TABLE Customer( CustomerID VARCHAR(10) NOT NULL, FirstName VARCHAR( 35), LastName VARCHAR(35), PhoneNumber VARCHAR(15), Street VARCHAR(35), ZipCode VARCHAR(12), Gender VARCHAR(2), CONSTRAINT pk_customer PRIMARY KEY (CustomerID))CREATE TABLE Appointment( AppointmentID VARCHAR(10) NOT NULL, AppointmentDateTime DATE, CustomerID VARCHAR(10) NOT NULL, CONTRAINTE pk_appointment PRIMARY KEY (AppointmentID))CREATE TABLE SalonService( ServiceID VARCHAR(10) NOT NULL, ServiceName VARCHAR(35), ServiceDuration INTEGER, ServicePrice NUMBER, ServiceMaterials VARCHAR(255) ), CONTRAINTE pk_salonservice PRIMARY KEY (ServiceID))CREATE TABLE Employee ( EmployeeID VARCHAR(10) NOT N ULL, FirstName VARCHAR(35), LastName VARCHAR(25), Street VARCHAR(45), ZipCode VARCHAR(12), PayRate NUMBER, CONSTRAINT pk_employee PRIMARY KEY (EmployeeID))CREATE TABLE ServiceRendered ( AppointmentID VARCHAR(10) NOT NULL, LineItemNumber INTEGER NOT NULL, ServiceID VARCHAR(10) NOT NULL, ServiceExtendedPrice NUMBER, EmployeeID VARCHAR(10) NOT NULL, CONTRAINTE pk_ServiceRendered PRIMARY KEY (AppointmentID, LineItemNumber))
Ajout de clés étrangères
Les codes SQL suivants ajoutent des contraintes FOREIGN KEY pour lier les tables entre elles :
ALTER TABLE Customer ADD CONSTRAINT fk_customer_zipcodes FOREIGN KEY (ZipCode) REFERENCES ZipCodes (ZipCode)ALTER TABLE Employee ADD CONSTRAINT fk_employee_zipcodes FOREIGN KEY (ZipCode) REFERENCES ZipCodes (ZipCode)ALTER TABLE Appointment ADD CONSTRAINT fk_customer_appointment FOREIGN KEY (CustomerID) REFERENCES Customer (CustomerID) )ALTER TABLE ServiceRendered ADD CONSTRAINT fk_ServiceRendered_Service FOREIGN KEY (ServiceID) REFERENCES SalonService (ServiceID)ALTER TABLE ServiceRendered ADD CONSTRAINT fk_ServiceRendered_Employee FOREIGN KEY (EmployeeID) REFERENCES Employee (EmployeeID)ALTER TABLE ServiceRendered ADD CONSTRAINT fk_ServiceRendered_Appointment FOREIGN KEY (AppointmentID) REFERENCES /pré>Commentaire sur SQL :
- La plupart des SGBD stockent la DATE et l'HEURE dans la même colonne. Ainsi, AppointmentDate et AppointmentTime ont été combinés en une seule colonne dans la base de données nommée AppointmentDateTime
- Les clés et les clés étrangères doivent avoir exactement le même nom et le même type de données. Par exemple, le Key CustomerID est VARCHAR(10) dans la table Customer et également VARCHAR(10) dans la table Appointment.
- Les contraintes reçoivent des noms significatifs tels que pk_customer pour une clé primaire et fk_customer_zipcodes pour une clé étrangère.
- Les colonnes telles que le numéro de téléphone et le code postal doivent utiliser le type de données VARCHAR. Si un type de données NUMBER ou INTEGER est utilisé, les zéros non significatifs seront manquants.
Après avoir créé les tables et ajouté les contraintes de clé étrangère, le schéma de la base de données ressemble maintenant à ceci :
Vue relationnelle
À l'aide de la vue des relations sous Outils de base de données, nous pouvons voir les relations (clés étrangères) entre les tables :
Ajout de données aux tables à l'aide d'instructions SQL INSERT
INSERT INTO ZipCodes VALUES ('07026', 'Garfield', 'NJ');INSERT INTO ZipCodes VALUES ('07621', 'Bergenfield', 'NJ');INSERT INTO ZipCodes VALUES ('07010', 'Cliffside Park', 'NJ');INSERT INTO ZipCodes VALUES ('07631', 'Englewood', 'NJ');INSERT INTO ZipCodes VALUES ('07665', 'Teaneck', 'NJ');INSERT INTO Customer VALUES (' C101', 'Elia', 'Fawcett', '201-222-2222', '8989 Smith Rd', '07026', 'F');INSERT IN TO Customer VALUES ('C102', 'Ishwarya', 'Roberts' , '201-222-3333', '65 Hope Rd', '07026', 'M'); 8989 Smith Rd', '07026', 'M') F' );INSÉRER DANS LES VALEURS DU CLIENT ('C105', 'Dheeraj', 'Alexander', '201-222-4545', '666 22nd Ave', '07621', 'M');INSÉRER DANS LES VALEURS DU CLIENT (' C106', 'Josie', 'Davis', '201-333-6789', '4200 Bluejay Ave', '07621', 'F');INSERT IN TO Customer VALUES ('C107', 'Faye', 'Glenn' , '201-333-4242', '1 522 Main St', '07010', 'F' ); F' );INSERT INTO SalonService VALUES ("SV101", "Coupe de cheveux pour hommes", 20, 22, "Aucun");INSERT INTO SalonService VALUES ("SV102", "Coupe de cheveux pour femmes", 30, 32 , 'Aucun');INSERT INTO SalonService VALUES ('SV103', 'Child Haircut', 20, 15, 'Aucun');INSERT INTO SalonService VALUES ('SV104', 'Women's Hair Color', 60, 76 , 'Color, Reagent, Gloves, Reagent Brush, Foil');INSERT INTO SalonService VALUES ('SV105', 'Women's Hair Style', 45, 56, 'Shampoo, Conditioner');INSERT INTO SalonService VALUES (' SV106', 'Men''s Hair Style', 45, 46, 'Shampooing, Conditioner'); , 18 ); INSÉRER DANS LES VALEURS DES EMPLOYÉS ('E400', 'Geraldo', 'Geraldo', '12 Fortis Blvd. Apte. 2A', '07026', 22);INSÉRER DANS LES VALEURS DES EMPLOYÉS ('E500', 'Koy', 'Petruzzio', '70 Wilard St. ', '07026', 20);INSÉRER DANS LES VALEURS DES EMPLOYÉS ('E600', 'Landry', 'Monroe', '73 Holly Terrace', '07010', 18);INSERT INTO Employee VALUES ('E800', 'Winter', 'Tanner', '215 Elm Ave', '07665', 23);INSERT INTO Appointment VALUES ('A400', '10/22/2017 11:00 :00 AM', 'C101' ); /2017 02:00:00 PM', 'C106');INSERT INTO Appointment VALUES ('A403', '12/18/2017 03:30:00 PM', 'C106');INSERT INTO Appointment VALUES ('A404 ', '21/12/2017 11:30:00', 'C108');INSERT INTO Appointment VALUES ('A405', '12/31/2017 10:00:00 AM', 'C107');INSERT DANS LES VALEURS de rendez-vous ('A406', '11/01/2018 15:15:00', 'C103'); 'C104');INSÉRER DANS LES VALEURS DE RENDEZ-VOUS ('A408', '0 22/01/2018 04:00:00 PM', 'C105');INSERT INTO ServiceRendered VALUES ('A400', 1, 'SV104', 75, 'E400');INSERT INTO ServiceRendered VALUES ('A400', 2 , 'SV102', 25, 'E400');INSERT INTO ServiceRendered VALUES ('A401', 1, 'SV101', 22, 'E500');INSERT INTO ServiceRendered VALUES ('A402', 1, 'SV104', 75 , 'E600' ); INSERT INTO ServiceRendered VALUES ('A404', 1, 'SV105', 55, 'E300');INSERT INTO ServiceRendered VALUES ('A405', 1, 'SV102', 30, 'E700');INSERT INTO ServiceRendered VALUES (' A405', 2, 'SV104', 70, 'E700');INSERT INTO ServiceRendered VALUES ('A405', 3, 'SV105', 50, 'E700');
Commentaire sur les échantillons de données
- Nous ajoutons juste assez de données pour pouvoir tester les relations entre les tables et donner aux développeurs d'applications une base de travail.
- Faites attention à l'ordre dans lequel les données sont ajoutées. Par exemple, tous les codes postaux doivent être insérés en premier, avant que le client ou l'employé (qui utilisent tous deux le code postal comme clé étrangère) puisse être inséré.
- Lorsque vous ajoutez des données VARCHAR avec des guillemets intégrés, utilisez deux guillemets ensemble. par exemple, "Style de coiffure pour femmes"
- À ce stade, le schéma de la base de données est prêt pour que les développeurs d'applications se mettent au travail pour concevoir des formulaires, des rapports et des requêtes.
Maintenant que le schéma de la base de données a été créé et est rempli avec des exemples de données, l'application de base de données peut être développée.
VI. Application de base de données
L'application de base de données se compose d'un ensemble de formulaires, de rapports et de requêtes qui sont liés ensemble sur un formulaire de navigation.
Le formulaire de navigation est le premier formulaire qui apparaît lorsque la base de données est ouverte.
Formulaire de navigation
Différents formulaires de saisie de données et rapports peuvent être affichés en cliquant sur la sélection à gauche.
Formulaire de saisie des données client
Le formulaire de saisie des données client est utilisé pour rechercher des clients existants et saisir de nouvelles informations sur les clients. Les champs Ville et État sont automatiquement remplis en sélectionnant un formulaire de code postal dans la zone de liste déroulante. Le formulaire comporte plusieurs codes VBA personnalisés pour convertir le prénom et le nom en cas correct et pour générer un nouvel identifiant client unique lorsqu'un champ CustomerID vide apparaît. après avoir créé un nouvel enregistrement.
Formulaire de saisie des données des services de salon
Le formulaire de saisie de données de service de salon est utilisé pour interroger, mettre à jour et ajouter de nouveaux services de salon.
Formulaire de saisie des données de rendez-vous
Le formulaire de saisie de données de rendez-vous est utilisé pour créer un nouveau rendez-vous pour un client. Comme pour le formulaire Client, un nouvel ID de rendez-vous peut être créé en cliquant dans un champ vide d'ID de rendez-vous après la création d'un nouvel enregistrement. Le client peut être sélectionné dans la zone de liste déroulante ID client comme indiqué ci-dessous :
S'il s'agit d'un nouveau client prenant rendez-vous, l'utilisateur peut cliquer sur le bouton Nouveau client pour afficher le formulaire de saisie des données client. Une fois les informations du nouveau client enregistrées, l'utilisateur peut revenir au formulaire de saisie des données de rendez-vous et prendre le rendez-vous.
Formulaire de rendez-vous et de services
Ce formulaire a pour but de saisir les différentes prestations associées à un rendez-vous. Ce formulaire peut également être utilisé pour générer une facture pour le client. Le service et l'employé peuvent être sélectionnés dans leurs listes déroulantes respectives, comme indiqué ci-dessous :
Rapport sur les totaux des rendez-vous clients
Ce rapport fournit un résumé du nombre de rendez-vous et du montant total dépensé par chaque client.
Basé sur la requête :
SELECT Customer.CustomerID, FirstName, LastName, SUM(q.TotalSpent) AS TotalSpent, COUNT(q.AppointmentID) AS NumberOfAppointmentsFROM Customer, Appointment, Query_Total_Spent_Each_Appointment AS qWHERE Customer.CustomerID =Appointment.CustomerID AND Appointment.AppointmentID =q. AppointmentIDGROUP BY Customer.CustomerID, FirstName, LastNameORDER BY LastName, FirstName;
Et requête Total_Spent_Each_Appointment
SELECT Appointment.AppointmentID, SUM(ServiceExtendedPrice) AS TotalSpentFROM Appointment, ServiceRenderedWHERE Appointment.AppointmentID =ServiceRendered.AppointmentIDGROUP BY Appointment.AppointmentIDORDER BY Appointment.AppointmentID ;
Rapport sur les services et les remises
Ce rapport montre chacun des services avec les totaux du prix du service régulier, le prix étendu et une indication du montant de la remise appliquée aux services rendus dans le passé.
Basé sur la requête :
SELECT SalonService.ServiceID, ServiceName, SUM(ServicePrice) AS TotalServicePrice, SUM(ServiceExtendedPrice) AS TotalExtPrice, FORMAT(1.0 - (SUM(ServiceExtendedPrice) / SUM(ServicePrice)), "0.00%") AS DiscountFROM SalonService, ServiceRenderedWHERE SalonService.ServiceID =ServiceRendered.ServiceIDGROUP BY SalonService.ServiceID, ServiceNameORDER BY SalonService.ServiceID, ServiceName ;
Rapport sur les adresses des clients
Ce rapport affiche les noms et adresses complets de chaque client.
VII. Conclusion
Le développement d'une application de base de données suit un cycle de vie de développement de système qui commence par la modélisation conceptuelle et passe par un ensemble structuré d'étapes comprenant la modélisation logique, la normalisation, la mise en œuvre physique et le développement d'applications. L'exemple du projet Hair Salon illustre chacune de ces grandes étapes. Cependant, certains détails n'ont pas été entièrement documentés. Par exemple, des travaux supplémentaires peuvent être nécessaires pour normaliser la relation Salon Services afin de tenir compte des différents matériaux utilisés pour chaque service. Des détails supplémentaires sur la mise en œuvre de l'application, tels que d'autres codes VBA et des descriptions plus détaillées de l'utilisation de chaque formulaire et rapport, peuvent également être ajoutés.