Logika przebiegu samochodu w bazie danych.

Logika przebiegu samochodu w bazie danych.
P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 181
0

Witam serdecznie wszystkich forumowiczów.

Ostatnio zaprojektowałem bazę danych do swojej aplikacji mobilnej która ma umożliwić prowadzenie histroii pojazdów , statystyki itd. Baza danych będzie w sqlite i nie wiem jak rozwiązać problem z przebiegiem samochodu. Logika według mnie powinna oddawać jak najbardziej realia czyli bez żadnego cofania licznika ale umożliwić użytkownikom edytowanie i kasowanie tankowań i usług gdzie użytkownik mógł przez przypadek podać błędny przebieg np większy niż obecnie ma i chce go poprawić do poprawnego. Jeśli chodzi o Vehicle to wymyśliłem że będzie automatycznie wybierany największy przebieg z tabel Service i Refueling i aktualizowane za pomocą triggerów. Jeśli coś będzie potrzebne to proszę pisać to będę starał się udzelić informacji jak najszybciej.

Może ktoś z was ma jakiś kierunek lub pomysł na rozwiązanie takiego problem.

Oto kod Sql do tworzenia tabel:

Kopiuj
PRAGMA foreign_keys = on;

CREATE TABLE FuelType (
    FuelTypeId   INTEGER PRIMARY KEY AUTOINCREMENT,
    FuelTypeName TEXT    NOT NULL
);

CREATE TABLE TransmissionType (
    TransmissionTypeId   INTEGER PRIMARY KEY AUTOINCREMENT,
    TransmissionTypeName TEXT    NOT NULL
);

CREATE TABLE Vehicle (
    VehicleId          INTEGER PRIMARY KEY AUTOINCREMENT,
    TransmissionTypeId INTEGER REFERENCES TransmissionType (TransmissionTypeId) ON DELETE NO ACTION
                                                                                ON UPDATE NO ACTION,
    FuelTypeId         INTEGER REFERENCES FuelType (FuelTypeId) ON DELETE NO ACTION
                                                                ON UPDATE NO ACTION,
    Make               TEXT    NOT NULL,
    Model              TEXT    NOT NULL,
    Odometer           INTEGER NOT NULL,
    EnginePower        INTEGER,
    EngineDisplacement INTEGER,
    Year               TEXT,
    PlateNumber        TEXT,
    VIN                TEXT
);


CREATE TABLE Refueling (
    RefuelingId   INTEGER PRIMARY KEY AUTOINCREMENT,
    VehicleId     INTEGER REFERENCES Vehicle (VehicleId) ON DELETE CASCADE
                                                         ON UPDATE NO ACTION,
    StationName   TEXT    NOT NULL,
    UnitPrice     TEXT    NOT NULL,
    Volume        TEXT    NOT NULL,
    TotalCost     TEXT    NOT NULL,
    Odometer      INTEGER NOT NULL,
    RefuelingDate TEXT    NOT NULL
);



CREATE TABLE Service (
    ServiceId   INTEGER PRIMARY KEY AUTOINCREMENT,
    VehicleId   INTEGER REFERENCES Vehicle (VehicleId) ON DELETE CASCADE
                                                       ON UPDATE NO ACTION,
    ServiceName TEXT    NOT NULL,
    ServiceCost TEXT    NOT NULL,
    Odometer    INTEGER NOT NULL,
    ServiceDate TEXT
);



CREATE TABLE ServiceItem (
    ServiceItemId INTEGER PRIMARY KEY AUTOINCREMENT,
    ServiceId     INTEGER REFERENCES Service (ServiceId) ON DELETE CASCADE
                                                         ON UPDATE NO ACTION,
    ItemName      TEXT    NOT NULL,
    ItemCost      TEXT    NOT NULL
);

Dziękuję bardzo za każdą pomocą i życzę miłego dnia.

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9236
0

W ogóle nie patrzę na kod SQL, napiszę jak ja bym do tematu podszedł.

  1. Pytanie - czy chcesz tą logikę o której pisałeś zawrzeć w SQL (triggery, procedury składowane - chociaż z tymi to tak średnio w SQLite) czy logika po stronie aplikacji?
  2. Dla kogo ta apka jest skierowana - osoby prywatne, czy użytek firmowy? Bo o ile ja w swojej apce, którą mam tylko na własny użytek, mogę grzebać - ale jeśli to firmowe to raczej takie dziwne akcje powinny być autoryzowane przez przełożonego, a na pewno powinien zostać po nich ślad w systemie
  3. Czy myślałeś o jakimś sprawdzeniu danych na etapie wprowadzania? Coś w stylu Ej, podałeś zły przebieg - jest on niższy od ostataniego albo Sprawdź podane dane, podejrzewam że mogły zostać źle wprowadzone - gdy np. ktoś wpisze dane i wyjdzie, że zawsze miał spalanie 8,5 litra a teraz wyszło 23.
  4. Jest też opcja, żeby po skorygowaniu jakiegoś wcześniejszego wpisu wszystkie następne przeliczyć zgodnie z tym, co powinno być. Tylko nie wiem dokładnie co ta apka ma robić, ale edycja wcześniejszego wpisu może spowodować, że kolejne są jakieś randomowe. Także (o ile dopuszczasz edycję starych danych) to chyba najlepiej będzie zrobić rekalkulację.
SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1145
0

Jeśli chodzi o Vehicle to wymyśliłem że będzie automatycznie wybierany największy przebieg z tabel Service i Refueling i aktualizowane za pomocą triggerów.

Duplikacja nie ma sensu jak da się to zrobić inaczej albo nie wpływa to bardzo negatywnie na wydajność. Po prostu wyciągaj tą informację zawsze z bazy. Możesz dodać jakiś indeks na VehicleID, Odometer jeśli chcesz znaleźć największą wartość szybko.

Samo wskazanie Odometer możesz też przenieść do osobnej tabeli, bo ta informacja jest używana zarówno w Refueling jak i Service. Ewentualnie można ten model odwrócić i będziesz miał jakaś tabele np. Event , która będzie zawierała te wspolne informacje i Refueling jak i Service będą się do niej odnosiły

Co do błędnych stanów (np. cofanie licznika) to po prostu sprawdziłbym to po stronie aplikacji.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.