sql >> Database teknologi >  >> RDS >> Database

Udlejning af biler er lige så enkelt som at køre:En datamodel for et biludlejningsfirma

Du har muligvis lejet en bil på din sidste ferie. Du reserverede din bil online og hentede den derefter fra dens udpegede placering efter at have betalt alle de tidligere aftalte gebyrer. Når du var færdig, returnerede du den til bureauet og betalte måske nogle ekstra gebyrer. Har du nogensinde tænkt på systemet, der får alle disse ting til at ske? I denne artikel vil vi se på en datamodel for et biludlejningssystem.

Hvorfor bygge endnu en billejedatamodel?

Jeg ønsker at designe en datamodel af et fuldt funktionelt system for et internationalt biludlejningsfirma. Virksomheden holder køretøjer til leje i forskellige segmenter (mini, økonomi, mellemklasse, SUV, fragt og limousine). Det driver sine aktiviteter fra forskellige byer på tværs af flere lande. Virksomheden giver deres kunder mulighed for at leje en bil fra ét sted (afhentningssted) og aflevere den et andet sted (afleveringssted).

Lad os på dette tidspunkt henvise til en tidligere artikel, der forklarer en simpel biludlejningsfirmamodel. Denne model henvender sig til alle de grundlæggende tjenester, der tilbydes af et biludlejningsfirma.




Inden vi tilføjer nye funktioner, vil jeg gerne inkorporere nogle mindre ændringer i denne model, nemlig:

  • Tilføjelse af city som en kolonne i location bord, og fjernelse af bybordet helt.
  • Tilføjelse af en ekstra kolonne, zip (som i postnummer eller postnummer) på location bord. Dette system vil identificere et afhentnings-/afleveringssted ved dets postnummer. Der er mange lande, hvor postnummer er et alfanumerisk tal, så jeg vil beholde denne kolonne som en varchar-kolonne.

  • Tilføjer driving license issue date til customer bord. Der er nogle lande, hvor den maksimale hastighedsgrænse afhænger af, hvornår kørekortet blev udstedt til føreren.

  • Omdøbning af category tabel til car_category , som beskriver dens indhold mere præcist.
  • Lagring af en kundes flyoplysninger, hvis afhentningsstedet er i nærheden af ​​en lufthavn. Dette gør det muligt for systemet at foretage passende ændringer af kundens reservationsanmodning i tilfælde af flyforsinkelser eller aflysninger. For at gøre dette tilføjer jeg en anden tabel kaldet flight_detail og tilslut den til reservation tabel.

Tilføjelse af kundefakturaoplysninger

Til fakturering skal vi opbevare en lejeværdi for hver lagervare, inklusive biler og udstyr. Lejeprisen tildeles hver kategori, fordi reservationsprocessen omhandler kategorier frem for individuelle biler.

Lad mig tilføje rental_value i car_category og equipment_category tabeller.

På lignende linjer skal der være nogle omkostninger forbundet med forsikring. Denne pris fastsættes af forsikringsselskabet. Indtil videre vil jeg tilføje en kolonne mere, pris, i insurance tabel.

Til fakturering opretter jeg en separat tabel til at gemme alle fakturadetaljer. På denne måde kan de samme detaljer nemt hentes, når det er nødvendigt. Da beregningen af ​​disse værdier er en smule vanskelig, vil jeg ikke gentage dem igen og igen for en faktura. Jeg tilføjer én tabel, nemlig rental_invoice , der primært er forbundet med rental bord.

rental_invoice tabel indeholder følgende kolonner:

  • id – den primære nøgle i denne tabel.
  • rental_id – den primære nøgle til rental bord. Jeg vil tilføje en unik begrænsning i denne kolonne:Der kan kun være én post for hver leje.
  • car_rent – Denne kolonne angiver lejeomkostningerne for det lejede køretøj.
  • Denne pris kan bestemmes ved hjælp af følgende SQL:

    select a.rental_value from car_category a, car b, rental c
    where  c.car_id = b.car_id and b.category_id = a.id
    and c.id = ;
    

  • equipment_rent_total – Denne kolonne viser det beløb, der skal opkræves for eventuelt udstyr, der er udlejet til kunden
  • De samlede omkostninger kan bestemmes ved hjælp af følgende SQL:

    select sum(a.rental_value) from equipment_category a, equipment b, car_equipment c, car d, rental e
    where  a.id = b.equipment_category_id and b.id = c.equipment_id
    and c.car_id = d.id and d.id = e.car_id 
    and e.id = ;
    

  • insurance_cost_total – Denne kolonne er for kundens samlede forsikringsomkostninger. Dette kan bestemmes ved at bruge følgende SQL

    select sum(a.cost) from insurance a, rental_insurance b, rental c
    where a.id = b.insurance_id and b.rental_id = c.id 
    and c.id = ;
    

  • service_tax og VAT – Som deres navne antyder, gemmer disse kolonner værdier for gældende serviceafgift og moms.
  • total_amount_payable – Denne kolonne vil indeholde værdien af ​​det samlede fakturabeløb. Dette ville være summen af ​​følgende kolonner:

    total_amount_payable =car_rent + equipment_rent_total + insurance_cost_total

  • waiver_amount og net_amount_payable – Disse kolonner gemmer værdier for frafaldsbeløb (hvis nogen) og det nettobeløb, der skal betales. waiver_amount er, hvor meget der frafaldes af den samlede faktura. Det bruges ofte, når et udlejningsfirma tilbyder rabat til kunder. Formlen til bestemmelse af net_amount_payable ser sådan ud:

    net_amount_payable =total_amount_payable – waiver_amount

Mobilbeholdning – For et biludlejningsfirma er dets beholdning altid mobilt, fordi det flytter fra et sted til et andet. Hvis du har lagt mærke til et afkrydsningsfelt, der siger 'vender tilbage til en anden placering?', når du reserverer en bil online, har du set den i aktion. Systemet behandler din anmodning en smule anderledes, hvis returneringsstedet IKKE er det samme som afhentningsstedet. Systemet holder altid styr på sin beholdning, når og når den udlejes og returneres.

For eksempel lejer en kunde en bil fra Chicago, bekræfter, at afleveringsstedet vil være anderledes, og kører til sin destination i Saint Louis. Det er klart, at han afleverer bilen på virksomhedens Saint Louis-lokation. I dette tilfælde, så snart han kører bilen fra Chicago-lokationen, er denne del af inventaret ikke længere bundet til det kontor. Bilen vil blive registreret igen, denne gang på Saint Louis-kontoret, så snart han er færdig med den.

For at inkorporere denne mekanisme vil jeg tilføje en kolonne, nemlig current_location_id , i car tabellen samt equipment bord. Denne kolonne indeholder kun de gyldige id'er for lokationer fra location tabel.

Så med ovenstående eksempel er bilens oprindelige placering Chicago; den vil blive opdateret, efter kunden returnerer bilen til destinationskontoret.

Opsætning af brændstofindstillinger

De fleste biludlejningsfirmaer tilbyder følgende typer brændstofmuligheder:
  1. Forskud på brændstofservice – kunden betaler for en fuld tank brændstof på forhånd, og returnerer bilen med tom tank.
  2. Brændstofservicegebyr – kunden får bilen med fuld tank brændstof, men betaler for det baseret på brændstofforbrug.
  3. Brændstofselvbetjening – kunden modtager bilen med fuld tank brændstof og returnerer bilen med fuld tank. Dette er den mest accepterede mulighed af de tre.

Her er vi ikke bekymrede for, hvilken mulighed kunden vælger. Det, vi ønsker, er at registrere deres valg, mens vi behandler lejeanmodningen.

For at imødekomme dette behov tilføjer jeg én tabel, fuel_option , der gemmer alle mulige muligheder for tankning af bilen. Der skal være en-til-en kortlægning mellem en lejeanmodning og fuel_option , da kunden bliver bedt om at vælge en på tidspunktet for booking af lejen.

Den endelige billejedatamodel




På mange områder skifter biludlejningsfirmaer mod at bruge en nøglefri, selvbetjent lejeoplevelse for deres kunder. De ønsker ikke at få deres kunder til at vente ved en skranke bare for at færdiggøre papirarbejde og hente bilnøgler. Kan vores nuværende datamodel imødekomme sådanne krav? Hvilke ændringer er nødvendige i vores datamodel for at få det til at ske?

Har du nogen tanker om vores billejedatamodel? Lad os starte en diskussion! Du er velkommen til at dele dit input i kommentarfeltet.


  1. UPSERT til tabel med dynamisk tabelnavn

  2. Giv privilegier til en bestemt database i PostgreSQL

  3. Best Practices for Multi-Language Database Design

  4. SQLite INTERSECT Operator