Access
 sql >> Datenbank >  >> RDS >> Access

Das Friseursalon-Datenbankprojekt

Aktualisiert:22. Januar 2018 von Richard Holowczak

Die folgenden Materialien dokumentieren das Design und die Entwicklung einer Datenbankanwendung zur Unterstützung eines kleinen Friseursalons. Das Projekt beginnt mit einer Beschreibung des Geschäfts und setzt sich fort durch konzeptionelle (E-R) Modellierung, logische (relationale) Modellierung, physikalische Modellierung und schließlich Implementierung einer Datenbankanwendung. Anmerkungen (Kommentare) werden am Ende jedes Abschnitts bereitgestellt, um einige Besonderheiten der auszuführenden Schritte zu erläutern.

Inhaltsverzeichnis

Ich. Geschäftsszenario
II. ER-Modell mit UML-Notation
III. Umstellung auf relationales Modell
IV. Normalisierung
V. Erstellen des Datenbankschemas mit SQL
VI. Datenbankanwendung
VII. Schlussfolgerungen

.

Ich. Geschäftsszenario

Unser Unternehmen besitzt und betreibt seit 7 Jahren einen Friseur- und Nagelsalon in Midtown Manhattan. Wir haben Tabellenkalkulationen und ein Logbuch aus Papier verwendet, um Kunden, Termine und Zahlungen im Auge zu behalten. Wir möchten diese manuelle Methode der Geschäftsverfolgung durch eine Datenbank ersetzen.

In unserem Geschäft vereinbaren Kunden Termine mit ihrem Lieblingsfriseur (Leute, die Kundenhaare schneiden und stylen) oder anderen Mitarbeitern und können sich einer Reihe von Dienstleistungen wie grundlegendem Haarschnitt/Styling, Haarfarbe, Highlights, Dauerwelle, Gesichtsbehandlung, Maniküre, Pediküre usw. Wir müssen die Materialien (Shampoo, Haarfarbe) und die Zeit, die für die Durchführung jeder Dienstleistung benötigt wird, im Auge behalten. Während jeder Service einen Standardpreis hat, können Werbeaktionen und andere Faktoren den tatsächlichen Preis beeinflussen, der dem Kunden für den jeweiligen Service gewährt wird.

Wir müssen auch unsere Mitarbeiter im Auge behalten, einschließlich ihrer Privatadresse, Kontaktinformationen und Gehaltssätze. Wir müssen die Kontaktinformationen jedes Kunden sowie sein Geschlecht im Auge behalten. Für Termine müssen wir das Datum und die Uhrzeit des Termins sowie den Kunden kennen, für den der Termin bestimmt ist.

Kommentar

Erstellen Sie basierend auf der obigen Beschreibung ein Entity-Relationship-Modell unter Verwendung der UML-Notation, das alle Datenanforderungen des Unternehmens erfasst.

II. ER-Modell mit UML-Notation

Basierend auf der obigen Beschreibung entwickeln wir das folgende Entity-Relationship-Modell unter Verwendung der UML-Notation.

Kommentar

Was uns an diesem Modell gefällt:

  • Alle Beziehungslinien gehen in eine horizontale oder vertikale Position. Es werden keine Grenzen überschritten.
  • Attributnamen werden ohne Leerzeichen in den Namen geschrieben. Es werden keine Abkürzungen verwendet.
  • Jede Beziehung hat genau zwei Ausdrücke, aus denen wir Beziehungssätze bilden können (siehe nächster Abschnitt).
  • Das Diagramm hat auch eine „Legende“ in der oberen rechten Ecke, damit wir erkennen können, was das Diagramm darstellt und wer das Diagramm zuletzt geändert hat.

Beziehungssätze

Ein Kunde kann sein einen oder mehrere Termine vereinbaren

Ein Termin muss sein eine Reservierung für einen und nur einen Kunden

Ein SalonService kann sein ein Dienst, der als ein oder mehrere ServiceRendered erbracht wird

Ein ServiceRendered muss sein eine Wiedergabe von einem und nur einem SalonService

Ein Mitarbeiter kann sein Rendern ein oder mehrere ServiceRendered

Ein ServiceRendered muss sein erbracht von einem und nur einem Mitarbeiter
 

Ein Termin kann sein eine Reservierung, um einen oder mehrere ServiceRendered bereitzustellen

Ein ServiceRendered muss sein eine bestimmte Dienstleistung, die während eines und nur eines Termins erbracht wird

Kommentar

Die Beziehungssätze sollten Sinn machen. In diesem Beispiel sind die Verbphrasen unterstrichen. Die Namen der Entitäten sind fett gedruckt. Die minimale Kardinalität (kann sein für 0 und muss sein zu 1) sind kursiv geschrieben. Die maximale Kardinalität wird als „one or more“ für * und „one and only one“ für 1 geschrieben.

Nachdem das ER-Modell fertiggestellt ist, fahren wir mit dem nächsten Schritt fort – der Umwandlung des konzeptionellen ER-Modells in ein logisches relationales Modell.

III. Konvertierung in relationales Modell

Der nächste Schritt besteht darin, das Entity-Relationship-Diagramm in ein relationales Modell umzuwandeln. Während dieses Schritts werden Identifikatoren in den Entitäten zu Schlüsseln in den Relationen. Eins-zu-Viele-Beziehungen führen dazu, dass ein Fremdschlüssel von der Eins-Seite auf die Viele-Seite der Beziehung kopiert wird.

Kunde ( Kunden-ID (Schlüssel), Vorname, Nachname, Telefonnummer, Straße, Stadt, Bundesland, Postleitzahl )

SalonService ( ServiceID (Schlüssel), ServiceName, ServiceDuration, ServicePrice, ServiceMaterials )

Mitarbeiter ( EmployeeID (key), FirstName, LastName, Street, City, State, Postleitzahl, PayRate )

Termin ( Termin-ID (Schlüssel), Termindatum, Terminzeit, Kunden-ID (fk) )

ServiceRendered ( AppointmentID (fk)(key), LineItemNumber(key), ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk))

Dies ist der „Anfangssatz von Beziehungen.“

Kommentar

  • Beachten Sie, dass der ServiceRendered Entität aus dem ER-Modell ist ID-abhängig, was bedeutet, dass sie zusätzlich zu LineItemNumber ein Attribut benötigt, um einen zusammengesetzten Schlüssel zu bilden.
  • Schlüssel werden mit der Bezeichnung (key) und Fremdschlüssel mit der Bezeichnung (fk) dargestellt.

Der nächste Schritt besteht darin, den anfänglichen Satz von Beziehungen zu normalisieren.

IV. Normalisierung

Der nächste Schritt ist die Normalisierung der Beziehungen.

Die für jede Beziehung zu befolgenden Schritte sind:

  1. Schreiben Sie die Relation inklusive aller Attributnamen aus. Schlüssel und Fremdschlüssel angeben.
  2. Geben Sie einige Beispieldaten für die Beziehung an.
  3. Geben Sie den Schlüssel an für die Beziehung und notieren Sie alle Funktionalen Abhängigkeiten .
  4. Gehen Sie die Definitionen jeder Normalform durch, beginnend mit 1NF und aufsteigend bis BCNF (oder 3NF, abhängig von Ihren Projektanforderungen).
  5. Wenn eine Relation die Definition einer Normalform erfüllt, gehe zur nächsthöheren Normalform auf.
  6. Wenn eine Relation die Definition einer Normalform nicht erfüllt (z. B. eine partielle Schlüsselabhängigkeit oder eine transitive Abhängigkeit enthält), teilen Sie die Relation in zwei neue Relationen auf.
    Beginnen Sie mit dem Normalisierungsprozess von Anfang an mit jeder dieser beiden neuen Beziehungen.

Kundenbeziehung

Kunde ( Kunden-ID (Schlüssel) , Vorname, Nachname, Telefon des Kunden, Straße, Stadt, Bundesland, Postleitzahl, Geschlecht )

Beispieldaten

Kundennummer Vorname Nachname Telefonnummer Straße Stadt Staat Postleitzahl Geschlecht
C101 Elia Fawcett 201-222-2222 8989 Smith Road Garfield NJ 07026 F
C102 Ishwarya Roberts 201-222-3333 Hope Rd 65 Garfield NJ 07026 M
C103 Frederic Fawcett 201-222-2222 8989 Smith Road Garfield NJ 07026 M
C104 Goldie Montand 201-222-4321 5235 Ironwood Ln Garfield NJ 07026 F
C105 Dheeraj Alexander 201-222-4545 666 22nd Avenue Bergenfield NJ 07621 M
C106 Josie Davis 201-333-6789 4200 Bluejay Avenue Bergenfield NJ 07621 F
C107 Faye Glenn 201-333-4242 Hauptstraße 1522 Cliffside Park NJ 07010 F
C108 Lauren Hershey 201-444-1313 2360 Maxon Road Englewood NJ 07631 F

Schlüssel:Kunden-ID

FD1:Kunden-ID -> Vorname, Nachname, Telefonnummer, Straße, Stadt, Bundesland, Postleitzahl, Geschlecht

FD2:Postleitzahl -> Stadt, Bundesland

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Transitive Abhängigkeit existiert:CustomerID -> Postleitzahl und Postleitzahl -> Stadt, Bundesland

Lösung:Teilen Sie die Kundenbeziehung in zwei neue Beziehungen mit den Namen CustomerData und ZipCodes auf:

Kundendaten (Kundennummer (Schlüssel), Vorname, Nachname, Telefon des Kunden, Straße, Postleitzahl (fk), Geschlecht )

Schlüssel:Kunden-ID

FD1:KundenID -> Vorname, Nachname, Telefonnummer, Straße, Postleitzahl (fk), Geschlecht

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Keine transitiven Abhängigkeiten

BCNF:Alle Determinanten sind Kandidatenschlüssel

Postleitzahlen (Postleitzahl (Schlüssel), Stadt, Bundesland)

Schlüssel:Postleitzahl

FD1:Postleitzahl -> Stadt, Bundesland

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Keine transitiven Abhängigkeiten

BCNF:Alle Determinanten sind Kandidatenschlüssel

SalonService-Beziehung

SalonService ( ServiceID (Schlüssel), ServiceName, ServiceDuration, ServicePrice, ServiceMaterials )

Beispieldaten:

Dienst-ID Dienstdauer ServicePreis Servicematerialien
SV101 Herrenhaarschnitt 20 22.00 Keine
SV102 Frauenhaarschnitt 30 32,00 Keine
SV103 Kinderhaarschnitt 20 15.00 Keine
SV104 Haarfarbe für Frauen 60 76,00 Farbe, Reagenz, Handschuhe, Reagenzpinsel, Folie
SV105 Frauenfrisur 45 56,00 Shampoo, Conditioner
SV106 Herrenfrisur 45 46,00 Shampoo, Conditioner

Schlüssel:ServiceID

FD1:ServiceID -> ServiceName, ServiceDuration, ServicePrice, ServiceMaterials

1NF:ServiceMaterials kann als mehrwertiges Attribut behandelt werden. In diesem Fall ist SalonService nicht in 1NF.

Lösung:ServiceMaterials in eine separate Relation ausgliedern.

Für dieses Beispiel behalten wir jedoch ServiceMaterials als Attribut der Beziehung SalonService bei.

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Keine transitiven Abhängigkeiten

BCNF:Alle Determinanten sind Kandidatenschlüssel

Mitarbeiterbeziehung

Mitarbeiter (Mitarbeiter-ID (Schlüssel), Vorname, Nachname, Straße, Stadt, Bundesland, Postleitzahl, Lohnsatz)

Mitarbeiter-ID Vorname Nachname Straße Stadt Staat Postleitzahl PayRate
E300 Freude Aveda 46 Easton Ave. Garfield NJ 07026 18.00
E400 Geraldo Geraldo 12 Fortis Blvd. Geeignet. 2A Garfield NJ 07026 22.00
E500 Koi Petruzzo 70 Wilard St. Garfield NJ 07026 20.00
E600 Landry Monroe 73 Holly Terrace Cliffside Park NJ 07010 18.00
E700 Pat Reese 2 Lincoln Place Cliffside Park NJ 07010 23.00
E800 Winter Gerber 215 Elm Ave Teenacken NJ 07665 23.00

Schlüssel:MitarbeiterID

FD1:MitarbeiterID -> Vorname, Nachname, Straße, Ort, Bundesland, Postleitzahl, Lohnsatz

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Transitive Abhängigkeit vorhanden:EmployeeID -> Postleitzahl und Postleitzahl -> Stadt, Bundesland

Lösung:Teilen Sie die Kundenbeziehung in zwei neue Beziehungen mit den Namen EmployeeData und ZipCodes auf:

EmployeeData(EmployeeID (key), FirstName, LastName, Street, Postleitzahl (fk), PayRate )

Schlüssel:MitarbeiterID

FD1:MitarbeiterID -> Vorname, Nachname, Straße, Postleitzahl (fk), Lohnsatz

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Keine transitiven Abhängigkeiten

BCNF:Alle Determinanten sind Kandidatenschlüssel

Hinweis:Wir haben bereits eine ZipCodes-Beziehung aus der Zeit, als die Kundenbeziehung aufgeteilt wurde. Also verwenden wir diese ZipCodes-Beziehung wieder. Es ist nicht erforderlich, eine zweite ZipCodes-Beziehung zu erstellen.

Terminbeziehung

Termin ( AppointmentID (Schlüssel), AppointmentDate, AppotinmentTime, CustomerID (fk) )

Beispieldaten:

Termin-ID Termindatum Terminzeit Kundennummer
A400 22.10.2017 11:00:00 Uhr C101
A401 6.11.2017 12:45:00 C102
A402 7.12.2017 14:00:00 Uhr C106
A403 18.12.2017 15:30:00 C106
A404 21.12.2017 11:30:00 Uhr C108
A405 31.12.2017 10:00:00 Uhr C107
A406 11.01.2018 15:15:00 C103
A407 12.01.2018 14:30 Uhr C104
A408 22.01.2018 16:00:00 C105

Schlüssel:TerminID

FD1:TerminID -> TerminDatum, TerminUhrzeit, KundenID (fk)

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Keine transitiven Abhängigkeiten

BCNF:Alle Determinanten sind Kandidatenschlüssel

ServiceRendered-Beziehung

ServiceRendered ( AppointmentID (fk)(key), LineItemNumber(key), ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk) )

Beispieldaten:

Termin-ID Positionsnummer Dienst-ID ServiceExtendedPrice Mitarbeiter-ID
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

Schlüssel:AppointmentID, LineItemNumber

FD1:AppointmentID, LineItemNumber -> ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk)

1NF:Erfüllt die Definition einer Relation

2NF:Keine partiellen Schlüsselabhängigkeiten

3NF:Keine transitiven Abhängigkeiten

BCNF:Alle Determinanten sind Kandidatenschlüssel

Endgültiger Satz von Beziehungen

Kunde ( Kundennummer (Schlüssel) , Vorname, Nachname, Telefonnummer, Straße, Postleitzahl (fk), Geschlecht )

Postleitzahlen ( Postleitzahl (Schlüssel), Stadt, Bundesland)

SalonService ( ServiceID (Schlüssel), ServiceName, ServiceDuration, ServicePrice, ServiceMaterials )

Mitarbeiter ( EmployeeID (key), FirstName, LastName, Street, Postleitzahl (fk), PayRate )

Termin ( Termin-ID (Schlüssel), Termindatum, Terminzeit, Kunden-ID (fk) )

ServiceRendered ( AppointmentID (fk)(key), LineItemNumber(key), ServiceID (fk), ServiceExtendedPrice, EmployeeID(fk))

Kommentar

  • Beachten Sie, dass nur eine ZipCodes-Beziehung erforderlich ist. Es wird sowohl mit Kunden- als auch mit Mitarbeiterbeziehungen geteilt.
  • Wie bereits erwähnt, wurde das ServiceMaterials-Attribut in diesem Beispiel nicht normalisiert. Vielleicht kann dies in einer zukünftigen Aufgabe oder Erweiterung des Modells erfolgen.

Nachdem die Beziehungen nun normalisiert sind, kann das Schema in einem Datenbankverwaltungssystem unter Verwendung einer strukturierten Abfragesprache (SQL) erstellt werden.

V. Erstellen des Datenbankschemas mit der strukturierten Abfragesprache

Erstellen Sie eine Tabelle in der Datenbank für jede der Beziehungen im endgültigen Satz von Beziehungen.

Der folgende SQL-Code erstellt die sechs Tabellen und fügt jeder die PRIMARY KEY-Einschränkung hinzu:

CREATE TABLE ZipCodes( zipcode VARCHAR(12) NOT NULL, city VARCHAR(36), state VARCHAR(4), CONSTRAINT pk_zipcodes PRIMARY KEY (zipcode))CREATE TABLE Customer( CustomerID VARCHAR(10) NOT NULL, FirstName VARCHAR( 35), Nachname VARCHAR(35), Telefonnummer VARCHAR(15), Straße VARCHAR(35), Postleitzahl VARCHAR(12), Geschlecht VARCHAR(2), CONSTRAINT pk_customer PRIMARY KEY (CustomerID))CREATE TABLE Appointment( AppointmentID VARCHAR(10) NOT NULL, AppointmentDateTime DATE, CustomerID VARCHAR(10) NOT NULL, CONSTRAINT pk_appointment PRIMARY KEY (AppointmentID))CREATE TABLE SalonService( ServiceID VARCHAR(10) NOT NULL, ServiceName VARCHAR(35), ServiceDuration INTEGER, ServicePrice NUMBER, ServiceMaterials VARCHAR(255 ), CONSTRAINT pk_salonservice PRIMARY KEY (ServiceID))CREATE TABLE Employee (EmployeeID VARCHAR(10) NOT N ULL, FirstName VARCHAR(35), LastName VARCHAR(25), Street VARCHAR(45), Postleitzahl 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, CONSTRAINT pk_ServiceRendered PRIMARY KEY (AppointmentID, LineItemNumber))

Fremdschlüssel hinzufügen

Die folgenden SQL-Codes fügen FOREIGN KEY-Einschränkungen hinzu, um die Tabellen miteinander zu verknüpfen:

ALTER TABLE Kunde ADD CONSTRAINT fk_customer_zipcodes FOREIGN KEY (Postleitzahl) REFERENCES Postleitzahlen (Postleitzahl)ALTER TABLE Mitarbeiter ADD CONSTRAINT fk_employee_zipcodes FOREIGN KEY (Postleitzahl) REFERENCES Postleitzahlen (Postleitzahl)ALTER TABLE Termin ADD CONSTRAINT fk_customer_appointment FOREIGN KEY (CustomerID) REFERENCES Kunde (Kunden-ID) REFERENCES )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 Mitarbeiter (EmployeeID)ALTER TABLE ServiceRendered ADD CONSTRAINT fk_ServiceRendered_Appointment REFERENCES /pre> 

Kommentar zu SQL:

  • Die meisten DBMS speichern DATUM und ZEIT in derselben Spalte. Daher wurden AppointmentDate und AppointmentTime in einer Spalte mit dem Namen AppointmentDateTime
  • in der Datenbank zusammengefasst
  • Schlüssel und Fremdschlüssel sollten genau denselben Namen und denselben Datentyp haben. Beispielsweise ist der Schlüssel CustomerID VARCHAR(10) in der Customer-Tabelle und auch VARCHAR(10) in der Appointment-Tabelle.
  • Einschränkungen erhalten aussagekräftige Namen wie pk_customer für einen Primärschlüssel und fk_customer_zipcodes für einen Fremdschlüssel.
  • Spalten wie Telefonnummer und Postleitzahl sollten den Datentyp VARCHAR verwenden. Wenn ein NUMBER- oder INTEGER-Datentyp verwendet wird, dann fehlen die führenden Nullen.

Nach dem Erstellen der Tabellen und dem Hinzufügen der Fremdschlüsseleinschränkungen sieht das Datenbankschema nun wie folgt aus:

Beziehungsansicht

Mit der Beziehungsansicht unter Datenbank-Tools können wir die Beziehungen (Fremdschlüssel) zwischen den Tabellen sehen:

Hinzufügen von Daten zu den Tabellen mit SQL INSERT-Anweisungen

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 INTO Customer VALUES ('C102', 'Ishwarya', 'Roberts' , '201-222-3333', '65 Hope Rd', '07026', 'M');INSERT INTO Customer VALUES ('C103', 'Frederic', 'Fawcett', '201-222-2222', ' 8989 Smith Rd', '07026', 'M');INSERT INTO Customer VALUES ('C104', 'Goldie', 'Montand', '201-222-4321', '5235 Ironwood Ln', '07026', ' F');INSERT INTO Customer VALUES ('C105', 'Dheeraj', 'Alexander', '201-222-4545', '666 22nd Ave', '07621', 'M');INSERT INTO Customer VALUES (' C106', 'Josie', 'Davis', '201-333-6789', '4200 Bluejay Ave', '07621', 'F');INSERT INTO Customer VALUES ('C107', 'Faye', 'Glenn' , '201-333-4242', '1 522 Main St', '07010', 'F'); INSERT INTO Customer VALUES ('C108', 'Lauren', 'Hershey', '201-444-1313', '2360 Maxon Rd', '07631', ' F');INSERT INTO SalonService VALUES ('SV101', 'Herrenhaarschnitt', 20, 22, 'None');INSERT INTO SalonService VALUES ('SV102', 'Damenhaarschnitt', 30, 32 , 'None');INSERT INTO SalonService VALUES ('SV103', 'Child Haircut', 20, 15, 'None');INSERT INTO SalonService VALUES ('SV104', 'Women''s Hair Color', 60, 76 , 'Farbe, Reagenz, Handschuhe, Reagenzpinsel, Folie');INSERT INTO SalonService VALUES('SV105', 'Women''s Hair Style', 45, 56, 'Shampoo, Conditioner');INSERT INTO SalonService VALUES (' SV106', 'Männerfrisur', 45, 46, 'Shampoo, Spülung'); IN MitarbeiterWERTE EINFÜGEN ('E300', 'Joy', 'Aveda', '46 Easton Ave.', '07026') , 18);INSERT INTO Employee VALUES ('E400', 'Geraldo', 'Geraldo', '12 Fortis Blvd. Geeignet. 2A', '07026', 22);INSERT INTO Employee VALUEs ('E500', 'Koy', 'Petruzzio', '70 Wilard St. ', '07026', 20);INSERT INTO Employee VALUEs ('E600', 'Landry', 'Monroe', '73 Holly Terrace', '07010', 18);INSERT INTO Employee VALUES ('E700', 'Pat', 'Reese', '2 Lincoln Place', '07010', 23);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');INSERT INTO Appointment VALUES ('A401', '11/06/2017 12:45:00 PM', 'C102');INSERT INTO Appointment VALUES ('A402', '12/07 /2017 14:00:00', 'C106');INSERT INTO Appointment VALUES ('A403', '12/18/2017 15:30:00 PM', 'C106');INSERT INTO Appointment VALUES ('A404 ', '21.12.2017 11:30:00', 'C108');INSERT INTO Appointment VALUES ('A405', '31.12.2017 10:00:00', 'C107');INSERT INTO Appointment VALUES ('A406', '01/11/2018 15:15:00 PM', 'C103');INSERT INTO Appointment VALUES ('A407', '01/12/2018 14:30:00 PM', 'C104');INSERT INTO Appointment VALUES ('A408', '0 22.01.2018 16:00:00', '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 ('A402', 2, 'SV102', 30, 'E800');INSERT INTO ServiceRendered VALUES ('A403', 1, 'SV105', 50, 'E300'); 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');

Kommentar zu Datenbeispielen

  • Wir fügen gerade genug Daten hinzu, um die Beziehungen zwischen den Tabellen testen zu können und den Anwendungsentwicklern etwas zu geben, mit dem sie arbeiten können.
  • Achten Sie auf die Reihenfolge, in der Daten hinzugefügt werden. Beispielsweise müssen zuerst alle Postleitzahlen eingefügt werden, bevor entweder Kunde oder Mitarbeiter (die beide Postleitzahlen als Fremdschlüssel verwenden) eingefügt werden können.
  • Wenn Sie VARCHAR-Daten mit eingebetteten Anführungszeichen hinzufügen, verwenden Sie zwei Anführungszeichen zusammen. B. „Frauenfrisur“
  • An diesem Punkt ist das Datenbankschema bereit für die Anwendungsentwickler, damit sie mit der Gestaltung von Formularen, Berichten und Abfragen beginnen können.

Nachdem das Datenbankschema erstellt und mit einigen Beispieldaten gefüllt wurde, kann die Datenbankanwendung entwickelt werden.

VI. Datenbankanwendung

Die Datenbankanwendung besteht aus einer Reihe von Formularen, Berichten und Abfragen, die in einem Navigationsformular miteinander verknüpft sind.

Das Navigationsformular ist das erste Formular, das erscheint, wenn die Datenbank geöffnet wird.

Navigationsformular

Durch Klicken auf die Auswahl auf der linken Seite können verschiedene Datenerfassungsformulare und Berichte angezeigt werden.

Kundendaten-Eingabeformular

Das Kundendateneingabeformular wird verwendet, um bestehende Kunden zu suchen und neue Kundeninformationen einzugeben. Die Felder „Stadt“ und „Bundesstaat“ werden automatisch ausgefüllt, indem eine Postleitzahl aus dem Kombinationsfeld ausgewählt wird. Das Formular verfügt über mehrere benutzerdefinierte VBA-Codes, um den Vor- und Nachnamen in die richtige Groß- und Kleinschreibung umzuwandeln und eine neue, eindeutige Kunden-ID zu generieren, wenn ein leeres Kunden-ID-Feld angezeigt wird nach dem Erstellen eines neuen Datensatzes.

Dateneingabeformular für Salondienste

Das Salonservice-Dateneingabeformular wird verwendet, um neue Salonservices abzufragen, zu aktualisieren und hinzuzufügen.

Termindaten-Eingabeformular

Das Formular Dateneingabe für Termine wird verwendet, um einen neuen Termin für einen Kunden zu erstellen. Wie beim Kundenformular kann eine neue Termin-ID erstellt werden, indem in ein leeres Termin-ID-Feld geklickt wird, nachdem ein neuer Datensatz erstellt wurde. Der Kunde kann wie unten gezeigt aus dem Kombinationsfeld Kunden-ID ausgewählt werden:

Wenn es sich um einen neuen Kunden handelt, der einen Termin vereinbart, kann der Benutzer auf die Schaltfläche „Neuer Kunde“ klicken, um das Kundendateneingabeformular aufzurufen. Nachdem die Informationen des neuen Kunden gespeichert wurden, kann der Benutzer zum Formular zur Termindateneingabe zurückkehren und den Termin vereinbaren.

Termin- und Dienstleistungsformular

Der Zweck dieses Formulars besteht darin, verschiedene mit einem Termin verbundene Dienstleistungen einzugeben. Dieses Formular könnte auch verwendet werden, um eine Rechnung für den Kunden zu erstellen. Der Dienst und der Mitarbeiter können wie unten gezeigt aus ihren jeweiligen Kombinationsfeldern ausgewählt werden:

Bericht über die Gesamtzahl der Kundentermine

Dieser Bericht enthält eine Zusammenfassung der Anzahl der Termine und des Gesamtbetrags, die von jedem Kunden ausgegeben wurden.

Basierend auf der Abfrage:

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. TerminIDGROUP BY Kunde.KundenID, Vorname, NachnameORDER BY Nachname, Vorname;

Und fragen Sie Total_Spent_Each_Appointment

ab
SELECT Appointment.AppointmentID, SUM(ServiceExtendedPrice) AS TotalSpentFROM Appointment, ServiceRenderedWHERE Appointment.AppointmentID =ServiceRendered.AppointmentIDGROUP BY Appointment.AppointmentIDORDER BY Appointment.AppointmentID;

Dienstleistungs- und Rabattbericht

Dieser Bericht zeigt jede der Dienstleistungen mit Summen des regulären Servicepreises, des erweiterten Preises und einer Angabe des Rabattbetrags, der auf die in der Vergangenheit erbrachten Dienstleistungen angewendet wurde.

Basierend auf der Abfrage:

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;

Kundenadressenbericht

Dieser Bericht zeigt die vollständigen Namen und Adressen jedes Kunden.

VII. Schlussfolgerungen

Die Entwicklung einer Datenbankanwendung folgt einem Systementwicklungslebenszyklus, der mit der konzeptionellen Modellierung beginnt und eine strukturierte Reihe von Schritten durchläuft, die logische Modellierung, Normalisierung, physische Implementierung und Anwendungsentwicklung umfassen. Das Projektbeispiel „Friseursalon“ veranschaulicht jeden dieser Hauptschritte. Einige Details sind jedoch nicht vollständig dokumentiert. Zum Beispiel kann einige zusätzliche Arbeit erforderlich sein, um die Salondienstleistungsbeziehung zu normalisieren, um unterschiedliche Materialien zu berücksichtigen, die für jede Dienstleistung verwendet werden. Zusätzliche Anwendungsimplementierungsdetails wie andere VBA-Codes und detailliertere Beschreibungen der Verwendung jedes Formulars und Berichts könnten ebenfalls hinzugefügt werden.