Rozliczenie pojazdu baza danych

Pierwszym elementem, którym się zajmiemy to rozliczenie pojazdu bazy danych. Podczas budowy naszej aplikacji, pierwszym krokiem jest zaprojektowanie baza danych i utworzenie tabele. Na początku musimy określić, co tak naprawdę jest nam potrzebne i jakie dane będziemy przechowywać w bazie danych.

Możesz zadać pytanie, czy warto zajmować się budową tabel. Skoro można rozpocząć od budowy klas JPA. Jednak ja uważam, że warto. W ostatecznym rozrachunku JPA generuje tabele za nas na podstawie klas. Dlatego po zaprojektowaniu klas i uruchomieniu aplikacji. Możemy wejść do bazy i sprawdzić, czy na pewno osiągnęliśmy to, co JPA wygenerowało. Łatwiej wtedy poprawić klasy lub tabele. Problem pojawi się później, gdy aplikacja będzie miała jakieś dane.

Jeżeli zaczynasz swoją przygodę i nie rozumiesz baz danych. Zapraszam do przeczytania artykułu Jak zrozumieć bazę danych.

Rozliczenie pojazdu baza danych – utworzenie bazy

Zajmiemy się stworzenie bazy danych w MySQL, w której będziemy tworzyć nasze tabele. Sposób instalacji dla każdego systemu operacyjnego znacząco się różni. Dlatego należy w Google wpisać taką teks: 'MySQL install’ i nazwę swojego operacyjnego. Sam nie używam systemu Windows, dlatego zapraszam do instalacji do stron, które dobrze to opisują. Pokaże natomiast jak utworzyć bazę danych już po instalacji MySQL. Jeżeli jesteś gotowy, wykonuj następujące polecenia:

# mysql -u root -p

Gdy udało się nam zalogować, możemy utworzyć bazę danych.

create database transport DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

Po utworzeniu bazy danych należy utworzyć również użytkownika. Można tego nie robić i ustawić sobie login i hasło root, ale wtedy w kodzie mamy dane uwierzytelniające root do bazy danych. Niepowołana osoba może zrobić wszystko z naszą bazą danych. Nie jest to tak ważne, gdy tworzymy bazę danych na własnym komputerze czy laptopie, ale uczmy się bezpiecznych praktyk już na tym etapie nauki. Bezpieczeństwa nigdy za wiele, a to są tylko dwie linijki kodu, które wykonujemy teraz.

create user transport identified by 'transport';


GRANT ALL PRIVILEGES ON transport.* TO transport WITH GRANT OPTION;

W pierwszej linijce tworzymy użytkownika. W drugiej powiążemy użytkownika z bazą danych. Takie rozwiązanie zabezpiecza nas przed przejęciem naszej bazy danych, ponieważ jeżeli nawet ktoś niepowołany będzie miał dostęp do kodu i wpisze login i hasło będzie w stanie przejąć kontrole tylko nad jedną bazą, a nie nad całym systemem baz danych. Można również ograniczyć uprawnienia do tworzenia i usuwania tabel. Dzięki temu będziemy trochę bezpieczniejsi.

Rozliczenie pojazdu baza danych – tabele

Pierwszą tabelą, jaką się zajmę to tabela Person (osoba). Zakładam, że osoba zarejestrowana w systemie ma dostęp tylko do swoich danych. Wykorzystam tę tabelę do zarządzania pojazdami, przejazdami i tankowaniami oraz do logowania użytkownika.

Tabela Person (osoba)

Jednak tabela Person w obecnej chwili będzie bardzo ograniczona. Nie zamierzam na samym początku tworzyć od razu rozbudowanej tabeli Person. Teraz stworzymy bardzo prostą tabele Person, która nam pozwoli zbudować projekt. Gdy przyjdzie czas na budowę systemu logowania. Wtedy rozbudujemy naszą tabele Person o potrzebne elementy niezbędne do prawidłowego działania uwierzytelniania.

CREATE TABLE `Person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `firstName` varchar(20) NOT NULL,
  `lastName` varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

O co tak naprawdę chodzi w tym zapisie. Pierwsza linij to zapis informujący MySQL, że chcemy stworzyć tabele w bazie danych. W drugiej linijce tworzymy identyfikator Id. W tym miejscu przechowujemy identyfikator rekordu(numer wiersza) w tabeli, jest to nam potrzebne do relacji, między tabelami. AUTO_INCREMENT informuje, że chcemy tworzyć ten identyfikator automatycznie, a PRIMARY KEY informuje, że jest to klucz główny. Wytłumaczę to na późniejszym etapie tego artykułu.

Kolejne dwie linijki to firstName(Imię), lastName(Nazwisko). Varchar oznacza, że mamy do czynienia z polem tekstowym. Dwadzieścia w nawiasach oznacza, że wielkość tego pola to dwadzieścia znaków. Kolejny zapis to NOT NULL, który mówi MySQL, że nie przewidujemy, aby dane pole miało wartość null. Co to oznacza, mówi MySQL, że musimy za każdym razem wypełnić to pole podczas wstawiania danych.

Ostatnia linijka zawiera dane informujące MySQL o konfiguracji naszej tabeli. Pierwszy InnoDB to typ MySQL. Drugi to numer, od jakiego ma zostać odliczany identyfikator. Ostatni zapis informuje MySQL, że chcemy używać kodowania znaków utf8

Tabela Vehicle (pojazd)

W tej tabeli będziemy przechowywać dane dotyczące pojazdu. Projekt, który tworze jest uproszczony. Dlatego, że takie mam założenia. Jeżeli stworzysz projekt, który będziesz używać w firmie, musisz rozbudować tę tabelę o potrzebne kolumny. Ja w tym projekcie upraszczam tę tabelę, gdyż projekt będę używać do rozliczania prywatnego samochodu i gromadzenie rozbudowanych danych nie jest mi potrzebne.

CREATE TABLE `Vehicle` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `idPerson` bigint(20) NOT NULL,
  `createDate` datetime NOT NULL,
  `registrationNumber` varchar(100) NOT NULL,
  `mark` varchar(100) NOT NULL,
  KEY `Vehicle_idPerson_index` (`idPerson`),
  CONSTRAINT `Vehicle_Person_id_fk` FOREIGN KEY (`idPerson`) REFERENCES `Person` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Większość elementów spotkaliśmy już w tabeli osoba, ale mamy kilka nowych, więc przyjrzyjmy się im.

Pierwszy element, którego nie było wcześniej, jest createDate. Jest to kolumna, która przechowuje po prostu datę i czas, w naszym przypadku jest to data i czas utworzenia wpisu.

Drugi element dotyczy zapisu IdPerson oraz CONSTRAINT. Jest to powiązanie kolumny idPerson z tabelą Person. Dzięki temu wiemy, który pojazd należy do jakiej osoby. Jest to relacja jeden do wielu, gdzie tabela Person występuje jako jeden a tabela Vehicle jako wiele.

Dodatkowym elementem, który nie występował w tabeli Person to linijka KEY. Ten zapis tworzy index dla danej kolumny. Pozwala to szybciej przeszukiwać kolumnę, dzięki temu przyśpieszamy wykonanie zapytań.

Tabela Ride (przejazd)

To jest tabela zawierająca wszystkie przejazdy. Dzięki tej tabeli możemy określić, gdzie jechaliśmy, ile przejechaliśmy kilometrów, ile zużyliśmy paliwa oraz jaka norma zużycia paliwa jest dla każdego przejazdu.

CREATE TABLE `Ride` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `idVehicle` bigint(20) NOT NULL,
  `createDate` datetime NOT NULL,
  `rideDate` datetime NOT NULL,
  `counterBefore` int(11) NOT NULL,
  `counterAfter` int(11) NOT NULL,
  `km` int(11) NOT NULL,
  `whence` varchar(100) NOT NULL,
  `where` varchar(100) NOT NULL,
  `rideKind` varchar(100) NOT NULL,
  `fuelCondition` double NOT NULL,
  `fuelAdd` double NOT NULL,
  `fuelAfter` double NOT NULL,
  `fuelConsumed` double NOT NULL,
  `fuelNorm` double NOT NULL,
  KEY `Ride_idVehicle_index` (`idVehicle`),
  CONSTRAINT `Ride_Vecicle_id_fk` FOREIGN KEY (`idVehicle`) REFERENCES `Vehicle` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Jak widać, ta tabela ma powiązanie jedynie z tabelą Vehicle (pojazd), dzięki temu wiemy który pojazd jest powiązany z danym przejazdem.

Tabela Refuel (tankowanie)

Refuel to tabela zawierająca wszystkie tankowania pojazdów. Dzięki użyciu tej tabeli ułatwimy rozliczenia każdego przejazdu.

CREATE TABLE `Refuel` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `idVehicle` bigint(20) NOT NULL,
  `idRide` bigint(20) NOT NULL,
  `createDate` datetime NOT NULL,
  `refuelDate` datetime NOT NULL,
  `name` varchar(100) NOT NULL,
  `counterBefore` int(11) NOT NULL,
  `counterAfter` int(11) NOT NULL,
  `km` int(11) NOT NULL,
  `refuel` double NOT NULL,
  `price` double NOT NULL,
  `value` double NOT NULL,
  `fuelNorm` int(11) NOT NULL,
  KEY `Refuel_idVehicle_index` (`idVehicle`),
  KEY `Refuel_idRide_index` (`idRide`),
  CONSTRAINT `Refuel_Ride_id_fk` FOREIGN KEY (`idRide`) REFERENCES `Ride` (`id`),
  CONSTRAINT `Refuel_Vecicle_id_fk` FOREIGN KEY (`idVehicle`) REFERENCES `Vehicle` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Ta tabela posiada dwie relacje. Z tabelą Vecicle (pojazd) oraz Ride (przejazd) jak wcześniej jest to relacja jeden to wielu. Czyli w pierwszej relacji jeden pojazd i wiele tankowań, w drugiej jeden przejazd i wiele tankowań. Taka relacja pozwala nam określić, przy którym przejeździe nastąpiło tankowanie. Oczywiście jest to relacja jedne do wielu, ponieważ do jednego przejazdu możemy przypisać wiele tankowań, jeżeli jedziemy w daleką trasę.

Tabela Settlement ()

Jest to tabela, dzięki której możemy powiązanie każdy pojazd do przejazdu i tankowania. Dzięki temu będzie możliwe prześledzić ile tak naprawdę kosztował nas każdy przejazd.

CREATE TABLE `Settlement` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `idVehicle` bigint(20) NOT NULL,
  `idRide` bigint(20) NOT NULL,
  `idRefuel` bigint(20) NOT NULL,
  `createDate` datetime NOT NULL,
  `fuel` double NOT NULL DEFAULT '0',
  KEY `Settlement_idVehicle_index` (`idVehicle`),
  KEY `Settlement_idRide_index` (`idRide`),
  KEY `Settlement_idRefuel_index` (`idRefuel`),
  CONSTRAINT `Settlement_Refuel_id_fk` FOREIGN KEY (`idRefuel`) REFERENCES `Refuel` (`id`),
  CONSTRAINT `Settlement_Ride_id_fk` FOREIGN KEY (`idRide`) REFERENCES `Ride` (`id`),
  CONSTRAINT `Settlement_Vecicle_id_fk` FOREIGN KEY (`idVehicle`) REFERENCES `Vehicle` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Jak widać mamy tutaj powiązanie zarówno z tabelą Verhicle (pojazd), Ride (przejazdy) i Refuel (tankowania). Dzięki temu mamy powiązane wszystkie przejazdy i tankowania z pojazdem.

Teraz możemy obejrzeć wszystkie stworzone przez nas tabeli w całej okazałości:

Transport baza danych - Pokazanie widoku wszystkich stworzonych tabel

Widać wszystkie tabele i relacje między nimi. Sprawdźmy więc rozliczenie pojazdu baza danych. Sprawdźmy tylko, czy wszystko się zgadza i przejdźmy dalej do następnego artykułu.