sql >> Databáze >  >> RDS >> Database

Vytvoření datového modelu pro spolujízdu

V současné době je spolujízda přijímána a propagována lidmi po celém světě. Určitě to snižuje vlastní uhlíkovou stopu a může to být nákladově efektivnější než pronájem nebo nákup auta.

Spolujízda také vyžaduje hodně práce – organizační práce, kterou lze snadno provést pomocí dobře navržené databáze. Tento článek vysvětluje podrobný datový model, který by mohl web pro spolujízdu používat.

Datový design, seznamte se se spolujízdou

Potřebujeme tedy navrhnout datový model pro webovou stránku spolujízdy (aka carpooling).

Spolujízda je trochu něco jiného než půjčovna aut. V carpoolingu je auto ve vlastnictví jedné osoby a ostatním nabízejí svezení. Všichni spolucestující zaplatí náklady na jízdu, včetně paliva, silničních poplatků atd.

Požadavky projektu:

  • Webové stránky by měly umožnit uživatelům (aka členové sdílené jízdy), aby se zaregistrovali pomocí svého jména, telefonního čísla, e-mailové adresy, čísla řidičského průkazu atd.
  • Členové by měli mít možnost nastavit si předvolby ohledně jízd a spolucestujících.
  • Členové zvaní vlastníci jízdy mohou vytvořit jízdu zadáním podrobností o své cestě (tj. počáteční a cílové body, čas zahájení, náklady na jezdce atd.)
  • Ostatní členové mohou vyhledávat dostupné jízdy do cílového města .
  • Členové, kteří hledají jízdu, mohou kontaktovat vlastníka jízdy a provést rezervaci pro jejich sedadla.
  • Vlastník jízdy by měl mít možnost schvalovat nebo odmítat žádosti o rezervaci.
  • Na základě opatření, které provedl vlastník jízdy na základě žádosti o rezervaci, by měl být aktualizován počet dostupných míst.
  • Vlastník jízdy může také označit města na trase, což jsou města na cestě z výchozího bodu do cíle. Pokud si to přejí, měli by mít majitelé jízd také možnost ubytovat lidi ve městech na trase.

S ohledem na tyto parametry identifikujme hlavní entity a vztahy pro náš datový model spolujízdy.

Identifikace entit a vztahů

Když vidím požadavky jako celek, snadno zjistím hlavní entity. Jsou to:

  • členové (včetně vlastníků jezdců a spolucestující )
  • auto
  • předvolby
  • jízda
  • město
  • požadavek na jízdu

Člen – Každý, kdo navštíví tuto webovou stránku, se musí před jejím použitím zaregistrovat. V tomto procesu musí poskytnout podrobnosti jako first_name , last_name , gender , email a contact number . Pro spolucestující jsou tyto položky dostačující. Majitelé jízdy, kteří budou pravděpodobně řídit, musí vyplnit některé další údaje, jako je driving_license_number a driving_license_valid_from by měly být také zahrnuty. Informace o průkazu spolucestujícím řeknou něco o řidičských zkušenostech majitele jízdy. To pomůže spolucestujícím vybrat si nejlepší dostupnou jízdu. Přidám jednu tabulku s názvem member se všemi povinnými sloupci.

Auto – Majitel jízdy musí před vytvořením jízdy přidat podrobnosti o alespoň jednom autě. Vytvořme tedy další tabulku s názvem car k uložení těchto informací. Jeden člen může vlastnit více než jedno auto. Jízda může záviset na dvojici člen-auto, takže k vytvoření tohoto vztahu potřebujeme další tabulku. Tuto tabulku budeme nazývat member_car . Primární klíč této tabulky budu odkazovat ve své ride tabulka, kam budu ukládat jízdní detaily. Přidám také jeden sloupec, konkrétně comfort_level , která ukládá úroveň pohodlí vozu na stupnici od 0 do 5. Tato úroveň je systémem automaticky vypočítána na základě podrobností o voze poskytnutých ostatními členy.

Předvolby – Na preferencích záleží pro každého. Webová stránka umožňuje členům vyplnit jejich preference ohledně vozu a jejich spolucestujících. Tyto údaje zůstávají v době registrace nepovinné, ale musí být vyplněny před vytvořením jízdy . Majitel jízdy bude pravděpodobně hledat lidi s podobnými preferencemi, aby všichni cestovali pohodlně. Lidé, kteří hledají jízdy, dělají totéž.

Některé základní preference pro cestování autem jsou:

  • Je v autě povoleno kouření?
  • Jsou povoleni domácí mazlíčci?
  • Jak upovídaný je majitel jízdy? Jaká míra štěbetání je během jízdy přijatelná? (Možné odpovědi zde zahrnují žádné, lehké klábosení, gabfest.)
  • Jaký typ hudby má majitel jízdy rád?
  • Jakou hlasitost hudby povoluje majitel jízdy?

Protože tyto údaje jsou při registraci volitelné, vytvořím další tabulku s názvem member_preference k uložení těchto podrobností. Dvě další tabulky ukládají možné možnosti hudby (music_preference ) a konverzaci v autě (chitchat_preference ).

Mějme vztah nula ku jedné mezi member a member_preference tabulky, protože členové mohou nebo nemusí nastavit své preference do systému, když se zaregistrují, a pro každého člena existuje pouze jeden záznam pro preference.

Město – Jeden hlavní stůl, city , je potřeba k uložení seznamu všech měst obsluhovaných webem. Měl by obsahovat příslušné informace o státu a zemi pro každé město.

Jízda – Člen může vytvořit jízdu vyplněním, kterým autem cestuje; ze kterého města vyjíždí; ke kterému městu míří; datum a čas cesty; počet dostupných míst; a příspěvek na hlavu. Příspěvek na hlavu je částka, kterou musí každý spolucestující zaplatit na náklady na jízdu. Majitel jízdy může také uvést, kolik zavazadel od spolucestujících očekává, aby se do auta vše vešlo. Přidáme tedy jeden sloupec, luggage_size_allowed , pro tuto položku. Možné hodnoty pro tento sloupec by byly lehký, střední a těžký.

Požadavek na jízdu – Členové se mohou podívat na seznam dostupných jízd z jednoho města do druhého nebo zadat požadavek na konkrétní cestu. Pro uložení podrobností o takových požadavcích rozhodně potřebujeme jednu tabulku. Tabulka s názvem request vyhovuje účelu. Požadavek je zpočátku zadán jako „odeslaný“ požadavek a vlastník jízdy je jedinou osobou, která jej může schválit nebo zamítnout. Počet dostupných sedadel v jízdní tabulce bude upraven pro každé schválení a/nebo zamítnutí.

Města na trase – Sdílení jízdy není jen o jízdě přímo z výchozího bodu do cíle. Jeden může sdílet jízdu s ostatními také pro města na trase. Pokud například muž cestuje z Chicaga do Miami, může ubytovat někoho, kdo chce jet z Chicaga do Nashvillu. Nashville je jedním z měst, kterým na své trase projede, takže je to město na cestě. Náš systém by měl majitelům jízd umožnit nastavit města na trase na základě trasy, kterou se budou držet, aby dosáhli svého cíle. Pokud spolucestující chtějí, mohou vystoupit v kterémkoli z měst na trase; jejich cestovní náklady budou podle toho poměrné.

Vytvoříme další tabulku s názvem enroute_city pro tento účel. Záznamy budou přidány, když vlastník jízdy přidá ke své jízdě města na trase. Členové pak mohou požádat o rezervaci cesty do jednoho z měst na trase. Primární klíč této tabulky proto odkazuji do request stůl.

order_from_source v enroute_city tabulka označuje kurz, kterým se majitel jízdy bude na cestě držet.

Zprávy na webu:

Na této webové stránce lze zobrazit různé zprávy (výtahy dat). Dovolte mi vysvětlit několik z nich:

  1. Dostupné jízdy z jednoho konkrétního města do druhého – Toto je jedna ze zpráv, která bude extrahována poměrně často, protože zobrazuje podstatu tohoto webu. Většina členů vstoupí na tuto webovou stránku, aby hledala alternativy cestování nebo sdílení jízd. Při extrahování tohoto přehledu musí členové zadat název výchozího a cílového města. SQL následuje:

    Select m.first_name || ‘ ‘ || m.last_name as “Ride Owner”, c.name as “Car”, c.comfort_level as “Comfort Level”, mp.is_smoking_allowed, mp.is_pet_allowed, r.travel_start_time, r.contribution_per_head, seats_offered 
    from ride r, member_car mc, car c, member m, member_preference mp
    where r.member_car_id = mc.id and mc.member_id = u.id 
    and mc.car_id = c.id and m.id = mp.member_id
    and source_city_id = (select city_id from city where city_name = ‘CHICAGO’)
    and destination_city_id = (select city_id from city where city_name = ‘MIAMI’)
    and seats_offered > (select count(id) from request req, request_status reqs where req.request_status_id = reqs.id and upper(reqs.description) = ‘APPROVE’ and req.ride_id = r.id);
    

  2. Seznam odeslaných / schválených žádostí o jízdu – Tato zpráva se zobrazí majiteli jízdy. Ukáže, kdo odeslal žádost o jízdu, a vlastník může zasáhnout pouze na žádostech z tohoto přehledu. SQL pro to následuje:

    select first_name || ‘ ‘ || last_name as “Submitter”,  req.created_on as “Submitted on”, rs.description as “Request Status” 
    from member m, request req, request_status rs
    where m.id = req.requester_id and rs.id = req.request_status_id
    and req.ride_id = ;
    

  3. Předchozí a aktuální nabízené jízdy – Tyto zprávy se zobrazí majitelům jízd na jejich vlastních dashboardech. Následující SQL lze použít ke generování seznamu jízd, které majitel jízdy aktuálně nabízí:

    Select m.first_name || ‘ ‘ || m.last_name as “Ride Owner”, c.name as “Car”, c.comfort_level as “Comfort Level”, mp.is_smoking_allowed, mp.is_pet_allowed, r.travel_start_time, r.contribution_per_head, decode(seats_offered,0,’FULL’, seats_offered || ‘ seats available‘) from ride r, member_car mc, car c, member m, member_preference mp
    where r.member_car_id = mc.id and mc.member_id = m.id 
    and mc.car_id = c.id and u.id = mp.member_id
    and r.travel_start_time >= sysdate
    and m.id = ;
    

    A toto SQL lze použít k extrahování seznamu dříve nabízených jízd:

    Select m.first_name || ‘ ‘ || m.last_name as “Ride Owner”, c.name as “Car”, c.comfort_level as “Comfort Level”, mp.is_smoking_allowed, mp.is_pet_allowed, r.travel_start_time, r.contribution_per_head, decode(seats_offered,0,’FULL’, seats_offered || ‘ seats available‘) from ride r, member_car mc, car c, member m, member_preference mp
    where r.member_car_id = mc.id and mc.member_id = m.id 
    and mc.car_id = c.id and u.id = mp.member_id
    and r.travel_start_time < sysdate
    and m.id = ;
    

  4. Seznam spolucestujících na vyjížďce – Tato zpráva bude k dispozici všem spolucestujícím, včetně vlastníka jízdy. Všichni mohou vygenerovat seznam všech spolucestujících pro jakoukoli ze svých minulých nebo budoucích jízd.

    select first_name || ‘ ‘ || last_name 
    from member m, request req, request_status rs
    where m.id = req.requester_id and rs.id = req.request_status_id
    and rs.description = ‘APPROVED’
    and req.ride_id = 
    UNION
    select first_name || ‘ ‘ || last_name 
    from member m, member_car mc, ride r
    where m.id = mc.member_id and mc.id = r.member_car_id 
    and r.id = ;
    

Konečný datový model




A co vylepšení?

Můžeme tento model dále vylepšit? Ano, můžeme! Stále existují oblasti, o které je třeba se postarat.

Co když někdo chce vytvářet opakované požadavky na jízdu? Předpokládejme, že řidič cestuje z jednoho města do druhého každý víkend a je vždy ochoten se o tuto jízdu podělit. Opakovaný požadavek by byl pohodlnější.

Jak se může člověk spolehnout na neznámého kluka, který nabízí odvoz? Měl by existovat způsob, jak lidem pomoci zhodnotit ostatní, než požádají o jízdu. Jedním ze schůdných mechanismů je zveřejňování a sdílení zpětné vazby o majitelích jízd a spolucestujících. Tyto detaily jistě pomohou ostatním k sebevědomější rezervaci jízdy s cizími lidmi. Jaké změny jsou nutné v našem datovém modelu, aby se tak stalo?

Neváhejte a podělte se o své názory na tento model.


  1. Nesprávné výsledky s Merge Join

  2. Jak importovat a exportovat databázi přes phpMyAdmin (chyba 'Přístup odepřen vytvořit databázi db_name')

  3. SQL dotaz kde sloupec ='' vracející se znaky Emoji 🎃 a 🍰

  4. Převod mezi datovými typy data a času na serveru SQL (příklady T-SQL)