Skip to content

Commit a8ac2cc

Browse files
Add pet vaccination schema, data scripts, and docs
Introduces a normalized SQL Server schema for pet vaccinations (Owners, Pets, Vaccines, Veterinarians, VaccinationRecords) with constraints and indexes. Adds sample data and verification queries, a script to insert extracted vaccination data for a new pet, an unattended demo notebook, and supporting documentation.
1 parent 0a13e99 commit a8ac2cc

File tree

5 files changed

+1806
-352
lines changed

5 files changed

+1806
-352
lines changed
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
-- Pet Vaccination Database Schema
2+
-- Target: tempdb on localhost (Windows Authentication)
3+
-- Normalized design with proper constraints and indexing
4+
5+
USE tempdb;
6+
GO
7+
8+
-- Drop existing tables if they exist (in reverse dependency order)
9+
IF OBJECT_ID('dbo.VaccinationRecords', 'U') IS NOT NULL DROP TABLE dbo.VaccinationRecords;
10+
IF OBJECT_ID('dbo.Pets', 'U') IS NOT NULL DROP TABLE dbo.Pets;
11+
IF OBJECT_ID('dbo.Owners', 'U') IS NOT NULL DROP TABLE dbo.Owners;
12+
IF OBJECT_ID('dbo.Veterinarians', 'U') IS NOT NULL DROP TABLE dbo.Veterinarians;
13+
IF OBJECT_ID('dbo.Vaccines', 'U') IS NOT NULL DROP TABLE dbo.Vaccines;
14+
GO
15+
16+
-- =============================================================================
17+
-- Table: Owners
18+
-- Description: Pet owner contact information
19+
-- =============================================================================
20+
CREATE TABLE dbo.Owners (
21+
OwnerId INT IDENTITY(1,1) NOT NULL,
22+
FirstName NVARCHAR(50) NOT NULL,
23+
LastName NVARCHAR(50) NOT NULL,
24+
StreetAddress NVARCHAR(200) NULL,
25+
City NVARCHAR(100) NULL,
26+
State NVARCHAR(50) NULL,
27+
ZipCode VARCHAR(10) NULL,
28+
Phone VARCHAR(20) NULL,
29+
Email NVARCHAR(255) NULL,
30+
CreatedDate DATETIME2 NOT NULL DEFAULT GETDATE(),
31+
ModifiedDate DATETIME2 NULL,
32+
33+
CONSTRAINT PK_Owners PRIMARY KEY CLUSTERED (OwnerId),
34+
CONSTRAINT CK_Owners_Email CHECK (Email IS NULL OR Email LIKE '%_@_%.__%')
35+
);
36+
GO
37+
38+
-- Index for searching owners by name
39+
CREATE NONCLUSTERED INDEX IX_Owners_Name
40+
ON dbo.Owners (LastName, FirstName);
41+
GO
42+
43+
-- =============================================================================
44+
-- Table: Pets
45+
-- Description: Pet information with foreign key to owner
46+
-- =============================================================================
47+
CREATE TABLE dbo.Pets (
48+
PetId INT IDENTITY(1,1) NOT NULL,
49+
OwnerId INT NOT NULL,
50+
PetName NVARCHAR(100) NOT NULL,
51+
Species VARCHAR(50) NOT NULL DEFAULT 'Dog',
52+
Breed NVARCHAR(100) NULL,
53+
Color NVARCHAR(50) NULL,
54+
Gender CHAR(1) NULL,
55+
DateOfBirth DATE NULL,
56+
MicrochipNumber VARCHAR(50) NULL,
57+
IsActive BIT NOT NULL DEFAULT 1,
58+
CreatedDate DATETIME2 NOT NULL DEFAULT GETDATE(),
59+
ModifiedDate DATETIME2 NULL,
60+
61+
CONSTRAINT PK_Pets PRIMARY KEY CLUSTERED (PetId),
62+
CONSTRAINT FK_Pets_Owners FOREIGN KEY (OwnerId)
63+
REFERENCES dbo.Owners (OwnerId) ON DELETE CASCADE,
64+
CONSTRAINT CK_Pets_Gender CHECK (Gender IS NULL OR Gender IN ('M', 'F')),
65+
CONSTRAINT CK_Pets_Species CHECK (Species IN ('Dog', 'Cat', 'Bird', 'Rabbit', 'Other'))
66+
);
67+
GO
68+
69+
-- Index for searching pets by owner
70+
CREATE NONCLUSTERED INDEX IX_Pets_OwnerId
71+
ON dbo.Pets (OwnerId)
72+
INCLUDE (PetName, Species, Breed);
73+
GO
74+
75+
-- Index for searching pets by name
76+
CREATE NONCLUSTERED INDEX IX_Pets_Name
77+
ON dbo.Pets (PetName);
78+
GO
79+
80+
-- =============================================================================
81+
-- Table: Vaccines
82+
-- Description: Reference table for vaccine types
83+
-- =============================================================================
84+
CREATE TABLE dbo.Vaccines (
85+
VaccineId INT IDENTITY(1,1) NOT NULL,
86+
VaccineName NVARCHAR(100) NOT NULL,
87+
VaccineCode VARCHAR(20) NOT NULL,
88+
Description NVARCHAR(500) NULL,
89+
ApplicableSpecies VARCHAR(50) NOT NULL DEFAULT 'Dog',
90+
RecommendedInterval INT NULL, -- Days between doses
91+
IsActive BIT NOT NULL DEFAULT 1,
92+
93+
CONSTRAINT PK_Vaccines PRIMARY KEY CLUSTERED (VaccineId),
94+
CONSTRAINT UQ_Vaccines_Code UNIQUE (VaccineCode)
95+
);
96+
GO
97+
98+
-- =============================================================================
99+
-- Table: Veterinarians
100+
-- Description: Veterinarian information
101+
-- =============================================================================
102+
CREATE TABLE dbo.Veterinarians (
103+
VeterinarianId INT IDENTITY(1,1) NOT NULL,
104+
FirstName NVARCHAR(50) NOT NULL,
105+
LastName NVARCHAR(50) NOT NULL,
106+
LicenseNumber VARCHAR(50) NULL,
107+
ClinicName NVARCHAR(200) NULL,
108+
Phone VARCHAR(20) NULL,
109+
Email NVARCHAR(255) NULL,
110+
IsActive BIT NOT NULL DEFAULT 1,
111+
112+
CONSTRAINT PK_Veterinarians PRIMARY KEY CLUSTERED (VeterinarianId)
113+
);
114+
GO
115+
116+
-- Index for searching veterinarians by name
117+
CREATE NONCLUSTERED INDEX IX_Veterinarians_Name
118+
ON dbo.Veterinarians (LastName, FirstName);
119+
GO
120+
121+
-- =============================================================================
122+
-- Table: VaccinationRecords
123+
-- Description: Records of administered vaccinations (junction table)
124+
-- =============================================================================
125+
CREATE TABLE dbo.VaccinationRecords (
126+
RecordId INT IDENTITY(1,1) NOT NULL,
127+
PetId INT NOT NULL,
128+
VaccineId INT NOT NULL,
129+
VeterinarianId INT NULL,
130+
AdministrationDate DATE NOT NULL,
131+
ExpirationDate DATE NULL,
132+
DoseNumber TINYINT NULL DEFAULT 1,
133+
LotNumber VARCHAR(50) NULL,
134+
Notes NVARCHAR(500) NULL,
135+
CreatedDate DATETIME2 NOT NULL DEFAULT GETDATE(),
136+
137+
CONSTRAINT PK_VaccinationRecords PRIMARY KEY CLUSTERED (RecordId),
138+
CONSTRAINT FK_VaccinationRecords_Pets FOREIGN KEY (PetId)
139+
REFERENCES dbo.Pets (PetId) ON DELETE CASCADE,
140+
CONSTRAINT FK_VaccinationRecords_Vaccines FOREIGN KEY (VaccineId)
141+
REFERENCES dbo.Vaccines (VaccineId),
142+
CONSTRAINT FK_VaccinationRecords_Veterinarians FOREIGN KEY (VeterinarianId)
143+
REFERENCES dbo.Veterinarians (VeterinarianId),
144+
CONSTRAINT CK_VaccinationRecords_Dates CHECK (ExpirationDate IS NULL OR ExpirationDate > AdministrationDate)
145+
);
146+
GO
147+
148+
-- Index for querying vaccination history by pet
149+
CREATE NONCLUSTERED INDEX IX_VaccinationRecords_PetId
150+
ON dbo.VaccinationRecords (PetId, AdministrationDate DESC)
151+
INCLUDE (VaccineId, VeterinarianId);
152+
GO
153+
154+
-- Index for finding pets due for vaccinations
155+
CREATE NONCLUSTERED INDEX IX_VaccinationRecords_Expiration
156+
ON dbo.VaccinationRecords (ExpirationDate)
157+
WHERE ExpirationDate IS NOT NULL;
158+
GO
159+
160+
-- =============================================================================
161+
-- Insert reference data for common dog vaccines
162+
-- =============================================================================
163+
INSERT INTO dbo.Vaccines (VaccineName, VaccineCode, Description, ApplicableSpecies, RecommendedInterval)
164+
VALUES
165+
('Distemper', 'DIST', 'Canine distemper virus vaccine', 'Dog', 365),
166+
('Measles', 'MEAS', 'Measles vaccine for puppies', 'Dog', NULL),
167+
('Parainfluenza', 'PARA', 'Canine parainfluenza virus vaccine', 'Dog', 365),
168+
('DHPP', 'DHPP', 'Distemper, Hepatitis, Parainfluenza, Parvovirus combination', 'Dog', 365),
169+
('Bordetella', 'BORD', 'Kennel cough vaccine', 'Dog', 180),
170+
('Coronavirus', 'CORO', 'Canine coronavirus vaccine', 'Dog', 365),
171+
('Leptospirosis', 'LEPT', 'Leptospirosis vaccine', 'Dog', 365),
172+
('Lyme Disease', 'LYME', 'Borrelia burgdorferi vaccine', 'Dog', 365),
173+
('Rabies', 'RABI', 'Rabies virus vaccine (legally required)', 'Dog', 1095);
174+
GO
175+
176+
-- =============================================================================
177+
-- Insert sample data from the vaccination record
178+
-- =============================================================================
179+
180+
-- Insert owner
181+
INSERT INTO dbo.Owners (FirstName, LastName, StreetAddress, City, State, ZipCode)
182+
VALUES ('Jane', 'Doe', '1575 McDonald Street', 'Mount Pleasant', 'TX', '38474');
183+
184+
-- Insert veterinarian
185+
INSERT INTO dbo.Veterinarians (FirstName, LastName, ClinicName)
186+
VALUES ('John', 'Smith', NULL);
187+
188+
-- Insert pet
189+
INSERT INTO dbo.Pets (OwnerId, PetName, Species, Breed, Color, Gender, DateOfBirth)
190+
VALUES (1, 'Chewy', 'Dog', 'Labrador', 'Brown', 'M', '2014-02-25');
191+
192+
-- Insert vaccination records from the document
193+
DECLARE @PetId INT = 1;
194+
DECLARE @VetId INT = 1;
195+
196+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, DoseNumber)
197+
VALUES
198+
-- Distemper: 02/01/2014
199+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'DIST'), @VetId, '2014-02-01', 1),
200+
-- Measles: 02/01/2015
201+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'MEAS'), @VetId, '2015-02-01', 1),
202+
-- Parainfluenza: 02/01/2014
203+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'PARA'), @VetId, '2014-02-01', 1),
204+
-- DHPP: 02/01/2016, 08/01/2017, 08/01/2018
205+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'DHPP'), @VetId, '2016-02-01', 1),
206+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'DHPP'), @VetId, '2017-08-01', 2),
207+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'DHPP'), @VetId, '2018-08-01', 3),
208+
-- Bordetella: 02/01/2016, 08/01/2017, 08/01/2018
209+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'BORD'), @VetId, '2016-02-01', 1),
210+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'BORD'), @VetId, '2017-08-01', 2),
211+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'BORD'), @VetId, '2018-08-01', 3),
212+
-- Coronavirus: 02/01/2016, 08/01/2017, 08/01/2018
213+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'CORO'), @VetId, '2016-02-01', 1),
214+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'CORO'), @VetId, '2017-08-01', 2),
215+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'CORO'), @VetId, '2018-08-01', 3),
216+
-- Leptospirosis: 02/01/2016, 08/01/2017, 08/01/2018
217+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'LEPT'), @VetId, '2016-02-01', 1),
218+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'LEPT'), @VetId, '2017-08-01', 2),
219+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'LEPT'), @VetId, '2018-08-01', 3),
220+
-- Lyme Disease: 02/01/2016, 08/01/2017
221+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'LYME'), @VetId, '2016-02-01', 1),
222+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'LYME'), @VetId, '2017-08-01', 2),
223+
-- Rabies: 02/01/2016, 08/01/2018
224+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'RABI'), @VetId, '2016-02-01', 1),
225+
(@PetId, (SELECT VaccineId FROM dbo.Vaccines WHERE VaccineCode = 'RABI'), @VetId, '2018-08-01', 2);
226+
GO
227+
228+
-- =============================================================================
229+
-- Verification queries
230+
-- =============================================================================
231+
PRINT 'Schema created successfully. Running verification...';
232+
PRINT '';
233+
234+
SELECT 'Owners' AS TableName, COUNT(*) AS RecordCount FROM dbo.Owners
235+
UNION ALL
236+
SELECT 'Pets', COUNT(*) FROM dbo.Pets
237+
UNION ALL
238+
SELECT 'Vaccines', COUNT(*) FROM dbo.Vaccines
239+
UNION ALL
240+
SELECT 'Veterinarians', COUNT(*) FROM dbo.Veterinarians
241+
UNION ALL
242+
SELECT 'VaccinationRecords', COUNT(*) FROM dbo.VaccinationRecords;
243+
GO
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
-- Insert extracted vaccination data for Max from immunization_page_001.png
2+
-- Target: tempdb on localhost (Windows Authentication)
3+
4+
USE tempdb;
5+
SET QUOTED_IDENTIFIER ON;
6+
SET ANSI_NULLS ON;
7+
GO
8+
9+
-- Store IDs for foreign key relationships
10+
DECLARE @OwnerId INT;
11+
DECLARE @PetId INT;
12+
DECLARE @VeterinarianId INT;
13+
14+
-- =============================================================================
15+
-- Insert Owner (John Smith)
16+
-- =============================================================================
17+
INSERT INTO dbo.Owners (FirstName, LastName, StreetAddress, City, State, ZipCode)
18+
VALUES ('John', 'Smith', '123 Oak Street', 'Springfield', 'IL', '62701');
19+
20+
SET @OwnerId = SCOPE_IDENTITY();
21+
PRINT 'Owner inserted: OwnerId = ' + CAST(@OwnerId AS NVARCHAR(10));
22+
23+
-- =============================================================================
24+
-- Insert Veterinarian (Dr. Sarah Johnson)
25+
-- =============================================================================
26+
INSERT INTO dbo.Veterinarians (FirstName, LastName, ClinicName)
27+
VALUES ('Sarah', 'Johnson', 'Sunny Valley Animal Hospital');
28+
29+
SET @VeterinarianId = SCOPE_IDENTITY();
30+
PRINT 'Veterinarian inserted: VeterinarianId = ' + CAST(@VeterinarianId AS NVARCHAR(10));
31+
32+
-- =============================================================================
33+
-- Insert Pet (Max - Labrador Retriever)
34+
-- =============================================================================
35+
INSERT INTO dbo.Pets (OwnerId, PetName, Species, Breed, Color, Gender, DateOfBirth)
36+
VALUES (@OwnerId, 'Max', 'Dog', 'Labrador Retriever', 'Yellow', 'M', '2019-02-25');
37+
38+
SET @PetId = SCOPE_IDENTITY();
39+
PRINT 'Pet inserted: PetId = ' + CAST(@PetId AS NVARCHAR(10));
40+
41+
-- =============================================================================
42+
-- Insert Vaccination Records
43+
-- =============================================================================
44+
45+
-- DHPP: 02/15/2023 (expires 02/15/2024)
46+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
47+
SELECT @PetId, VaccineId, @VeterinarianId, '2023-02-15', '2024-02-15', 1, 'Routine vaccination'
48+
FROM dbo.Vaccines WHERE VaccineCode = 'DHPP';
49+
50+
-- Rabies: 02/15/2023 (expires 02/15/2026 - 3 year vaccine)
51+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
52+
SELECT @PetId, VaccineId, @VeterinarianId, '2023-02-15', '2026-02-15', 1, '3-year rabies vaccine'
53+
FROM dbo.Vaccines WHERE VaccineCode = 'RABI';
54+
55+
-- Bordetella: 03/20/2023 (expires 03/20/2024 - kennel cough)
56+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
57+
SELECT @PetId, VaccineId, @VeterinarianId, '2023-03-20', '2024-03-20', 1, 'Kennel cough vaccine'
58+
FROM dbo.Vaccines WHERE VaccineCode = 'BORD';
59+
60+
-- DHPP Booster: 02/15/2024 (expires 02/15/2025)
61+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
62+
SELECT @PetId, VaccineId, @VeterinarianId, '2024-02-15', '2025-02-15', 2, 'Annual booster'
63+
FROM dbo.Vaccines WHERE VaccineCode = 'DHPP';
64+
65+
-- Rabies Booster: 02/15/2024 (expires 02/15/2027 - 3 year vaccine)
66+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
67+
SELECT @PetId, VaccineId, @VeterinarianId, '2024-02-15', '2027-02-15', 2, '3-year rabies booster'
68+
FROM dbo.Vaccines WHERE VaccineCode = 'RABI';
69+
70+
-- Bordetella Booster: 03/20/2024 (expires 03/20/2025)
71+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
72+
SELECT @PetId, VaccineId, @VeterinarianId, '2024-03-20', '2025-03-20', 2, 'Annual booster'
73+
FROM dbo.Vaccines WHERE VaccineCode = 'BORD';
74+
75+
-- Leptospirosis: 02/15/2023 (expires 02/15/2024 - included in DHPP)
76+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
77+
SELECT @PetId, VaccineId, @VeterinarianId, '2023-02-15', '2024-02-15', 1, 'Included in DHPP'
78+
FROM dbo.Vaccines WHERE VaccineCode = 'LEPT';
79+
80+
-- Leptospirosis Booster: 02/15/2024 (expires 02/15/2025)
81+
INSERT INTO dbo.VaccinationRecords (PetId, VaccineId, VeterinarianId, AdministrationDate, ExpirationDate, DoseNumber, Notes)
82+
SELECT @PetId, VaccineId, @VeterinarianId, '2024-02-15', '2025-02-15', 2, 'Annual booster'
83+
FROM dbo.Vaccines WHERE VaccineCode = 'LEPT';
84+
85+
PRINT '';
86+
PRINT 'All vaccination records inserted successfully!';
87+
GO
88+
89+
-- =============================================================================
90+
-- Verification: Display all inserted data
91+
-- =============================================================================
92+
PRINT '';
93+
PRINT '=== VERIFICATION QUERY ===';
94+
PRINT '';
95+
96+
PRINT 'OWNER INFORMATION:';
97+
SELECT OwnerId, FirstName, LastName, StreetAddress, City, State, ZipCode
98+
FROM dbo.Owners
99+
WHERE FirstName = 'John' AND LastName = 'Smith';
100+
101+
PRINT '';
102+
PRINT 'VETERINARIAN INFORMATION:';
103+
SELECT VeterinarianId, FirstName, LastName, ClinicName
104+
FROM dbo.Veterinarians
105+
WHERE FirstName = 'Sarah' AND LastName = 'Johnson';
106+
107+
PRINT '';
108+
PRINT 'PET INFORMATION:';
109+
SELECT p.PetId, p.PetName, p.Species, p.Breed, p.Color, p.Gender, p.DateOfBirth, o.FirstName + ' ' + o.LastName AS Owner
110+
FROM dbo.Pets p
111+
JOIN dbo.Owners o ON p.OwnerId = o.OwnerId
112+
WHERE p.PetName = 'Max';
113+
114+
PRINT '';
115+
PRINT 'VACCINATION RECORDS:';
116+
SELECT
117+
vr.RecordId,
118+
v.VaccineName,
119+
vr.AdministrationDate,
120+
vr.ExpirationDate,
121+
vr.DoseNumber,
122+
vr.Notes,
123+
vet.FirstName + ' ' + vet.LastName AS Veterinarian
124+
FROM dbo.VaccinationRecords vr
125+
JOIN dbo.Vaccines v ON vr.VaccineId = v.VaccineId
126+
LEFT JOIN dbo.Veterinarians vet ON vr.VeterinarianId = vet.VeterinarianId
127+
WHERE vr.PetId = (SELECT PetId FROM dbo.Pets WHERE PetName = 'Max')
128+
ORDER BY vr.AdministrationDate, v.VaccineName;
129+
130+
PRINT '';
131+
PRINT 'SUMMARY:';
132+
SELECT 'Owners' AS TableName, COUNT(*) AS RecordCount FROM dbo.Owners
133+
UNION ALL
134+
SELECT 'Pets', COUNT(*) FROM dbo.Pets
135+
UNION ALL
136+
SELECT 'Veterinarians', COUNT(*) FROM dbo.Veterinarians
137+
UNION ALL
138+
SELECT 'VaccinationRecords', COUNT(*) FROM dbo.VaccinationRecords;
139+
GO

0 commit comments

Comments
 (0)