== Релациска шема (со мапирачка трансформација) === Ознаки - Примарните клучеви се означени со bold и underline - Надворешните клучеви се означени со * === Табели ''Clients'' (**__Id__**, !FirstName, !LastName, !PhoneNumber)\\ ''Motorcycles'' (**__Id__**, Model, Year, !ChassisNumber, Registration, Kilometers, '''!ClientId''' *Clients)\\ ''Mechanics'' (**__EMBG__**, !FirstName, !LastName)\\ ''!ServiceItems'' (**__Id__**, Description, !MeasurementUnit, !PricePerUnit, Tax)\\ ''Services'' (**__Id__**, !DateOfService, !LaborCost, !TotalPrice, '''!MotorcycleId''' *Motorcycles)\\ ''!ServiceAssignments'' (**__ServiceId__** *Services, **__MechanicEMBG__** *Mechanics, **__ServiceItemId__** *!ServiceItems, !UnitsUsed)\\ ''!ServiceInvoices'' (**__Id__**, !IssueDate, !ImagePath, '''!ServiceId''' *Services)\\ ''!FiscalBills'' (**__Id__**, !IssueDateTime, Description, DDV, EDB, '''!ServiceInvoiceId''' *!ServiceInvoices)\\ == DDL скрипта за бришење на табелите и креирање на табелите {{{ -- Create database CREATE DATABASE motorcycle_service; -- Connect to database \c motorcycle_service; CREATE TABLE Clients ( Id SERIAL PRIMARY KEY, FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50), PhoneNumber VARCHAR(20) ); CREATE TABLE Mechanics ( EMBG VARCHAR(13) PRIMARY KEY, FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50) NOT NULL ); CREATE TABLE Motorcycles ( Id SERIAL PRIMARY KEY, ClientId INT NOT NULL REFERENCES Clients(Id) ON DELETE CASCADE, Model VARCHAR(50) NOT NULL, Year INT, ChassisNumber VARCHAR(50) UNIQUE, Registration VARCHAR(20), Kilometers INT ); CREATE TABLE ServiceItems ( Id SERIAL PRIMARY KEY, Description TEXT NOT NULL, MeasurementUnit VARCHAR(20) NOT NULL, PricePerUnit DECIMAL(10,2) NOT NULL, Tax DECIMAL(5,2) NOT NULL ); -- Price has to be calculated by the program due to PostgreSQL limitations. CREATE TABLE Services ( Id SERIAL PRIMARY KEY, MotorcycleId INT NOT NULL REFERENCES Motorcycles(Id) ON DELETE CASCADE, DateOfService DATE NOT NULL, LaborCost DECIMAL(10,2) NOT NULL, TotalPrice DECIMAL(10,2) NOT NULL -- Manually calculated by app ); CREATE TABLE ServiceAssignments ( ServiceId INT REFERENCES Services(Id) ON DELETE CASCADE, MechanicEMBG VARCHAR(13) REFERENCES Mechanics(EMBG) ON DELETE CASCADE, ServiceItemId INT REFERENCES ServiceItems(Id) ON DELETE CASCADE, UnitsUsed DECIMAL(10,2) NOT NULL, PRIMARY KEY (ServiceId, MechanicEMBG, ServiceItemId) ); CREATE TABLE ServiceInvoices ( Id SERIAL PRIMARY KEY, ServiceId INT UNIQUE NOT NULL REFERENCES Services(Id) ON DELETE CASCADE, IssueDate TIMESTAMP NOT NULL DEFAULT NOW(), ImagePath TEXT NOT NULL ); CREATE TABLE FiscalBills ( Id SERIAL PRIMARY KEY, ServiceInvoiceId INT UNIQUE NOT NULL REFERENCES ServiceInvoices(Id) ON DELETE CASCADE, IssueDateTime TIMESTAMP NOT NULL DEFAULT NOW(), Description TEXT, DDV DECIMAL(5,2) NOT NULL, EDB VARCHAR(15) NOT NULL ); }}} == DML скрипта за полнење на табелите со податоци {{{ -- Insert Clients INSERT INTO Clients (FirstName, LastName, PhoneNumber) VALUES ('John', 'Doe', '555-1234'), ('Jane', 'Smith', '555-5678'); -- Insert Mechanics INSERT INTO Mechanics (EMBG, FirstName, LastName) VALUES ('1234567890123', 'Mike', 'Johnson'), ('9876543210987', 'Sarah', 'Williams'); -- Insert Motorcycles INSERT INTO Motorcycles (ClientId, Model, Year, ChassisNumber, Registration, Kilometers) VALUES (1, 'Harley-Davidson Street Glide', 2020, '1HDRS12345', 'ABC-123', 15000), (2, 'Honda CBR600RR', 2022, '2HNDR67890', 'XYZ-789', 5000); -- Insert Service Items INSERT INTO ServiceItems (Description, MeasurementUnit, PricePerUnit, Tax) VALUES ('Engine Oil', 'Liter', 10.50, 0.18), ('Oil Filter', 'Piece', 15.00, 0.18), ('Brake Pads', 'Set', 45.00, 0.18); -- Insert Services (with app-calculated totals) INSERT INTO Services (MotorcycleId, DateOfService, LaborCost, TotalPrice) VALUES (1, '2023-10-01', 50.00, 111.07), -- Calculated by app: (3.5*10.50*1.18) + (1*15.00*1.18) + 50 (2, '2023-10-02', 75.00, 131.40); -- Calculated by app: (2*45.00*1.18) + 75 -- Insert Service Assignments INSERT INTO ServiceAssignments (ServiceId, MechanicEMBG, ServiceItemId, UnitsUsed) VALUES (1, '1234567890123', 1, 3.5), (1, '1234567890123', 2, 1.0), (2, '9876543210987', 3, 2.0); -- Insert Service Invoices INSERT INTO ServiceInvoices (ServiceId, ImagePath) VALUES (1, '/invoices/service1.png'), (2, '/invoices/service2.png'); -- Insert Fiscal Bills INSERT INTO FiscalBills (ServiceInvoiceId, Description, DDV, EDB) VALUES (1, 'Full service package', 0.18, '123456789012345'), (2, 'Brake system maintenance', 0.18, '123456789012345'); }}} == Релациски дијаграм изваден од pgAdmin 4 [[Image(Database_ERD.png, 90%, center)]]