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

Datový model autoservisu

Provozování autoservisu/autoservisu je opravdu složitá záležitost. Budete si muset domluvit schůzku, zatímco někteří zákazníci přijedou autem, a nechcete, aby čekali hodiny. Také budete muset organizovat zaměstnance, sledovat opravy, materiály, účtovat zákazníkům atd. Určitě budete potřebovat IT řešení a samozřejmě datový model na pozadí. Dnes budeme mluvit o jednom takovém modelu.

Nápad

Již jsem zmínil, že tento obchodní model je opravdu složitý. Proto se nebudu snažit pokrýt vše. Záměrně jsem vynechal sledovací materiály a náhradní díly a také jsem zjednodušil některé části modelu. Důvod je docela jednoduchý. Kdybych zahrnul opravdu všechno, model by byl prostě příliš velký na článek přiměřené velikosti. Takže začněme.

Datový model




Model se skládá z 5 tematických oblastí:

  • Repair shops & employees
  • Customers & contacts
  • Vehicles
  • Services & offers a
  • Visits

Každou z těchto 5 oblastí popíšeme v pořadí, v jakém byly uvedeny.

Část 1:Opravny a zaměstnanci

První předmět, se kterým začneme, je Repair shops & employees předmětová oblast. Je zcela zřejmé, že potřebujeme vědět, co máme k dispozici, než budeme moci nabízet zákazníkům.

city slovník slouží k uložení všech jednotlivých měst, kde máme opravny nebo odkud pocházejí naši zákazníci. Každé město je jednoznačně definováno dvojicí postal_codecity_name . Mohli bychom se rozhodnout mít pouze jeden záznam pro každé město, i když toto město má více poštovních směrovacích čísel. V takovém případě bychom použili pouze „hlavní“ PSČ pro toto město. Přesto máme možnost mít více položek pro stejné město a různá poštovní směrovací čísla – v případě, že to chceme.

repair_shop tabulka je místo, kde budeme ukládat seznam všech našich opraváren. Můžeme očekávat, že v určitém okamžiku budeme provozovat více než jeden. Každý obchod je jednoznačně definován svým shop_name a id města, ke kterému patří (city_id ). Uložíme také adresu obchodu a další details v textovém formátu, pokud existuje.

position slovník se používá k ukládání jedinečných position_names které by mohly být přiděleny našim zaměstnancům. Zatímco většina pozic bude souviset s naším hlavním předmětem podnikání, budeme mít také některé, které nejsou součástí hlavního podnikání (technické role/pozice), ale jsou také nezbytné (administrativa, prodej atd.).

Seznam všech našich zaměstnanců je uložen v employee stůl. Pro každého zaměstnance uložíme jeho:

  • first_name &last_name – Jméno a příjmení zaměstnance.
  • employment_start_date &employment_end_date – Datum zahájení a ukončení zaměstnance ve společnosti. Koncové datum bude obsahovat hodnotu NULL, dokud jej nebudeme moci definovat.
  • position_id – Odkaz na aktuální pozici ve společnosti.
  • city_id – Odkaz na město, kde zaměstnanec aktuálně žije.
  • is_active – Příznak označující, zda je zaměstnanec aktuálně aktivní nebo ne.

Poslední tabulkou v této tematické oblasti je schedule stůl. V této tabulce uložíme přesné rozvrhy pro všechny naše zaměstnance na denní úrovni. Budeme mít také možnost uložit více intervalů pro stejného zaměstnance během stejného dne. Abychom toho dosáhli, použijeme následující atributy:

  • repair_shop_id – Odkaz na související opravnu.
  • employee_id – Odkaz na příbuzného zaměstnance.
  • position_id – Odkaz na související pozici, kterou by zaměstnanec měl během definovaného časového období. Ve většině případů by to byla jeho současná pozice, ale máme možnost zde přidělit jinou pozici.
  • schedule_date – Datum, ke kterému se tento záznam vztahuje.
  • time_from &time_to – Tento pár definuje časové období, ke kterému se tento záznam vztahuje.
  • plan – Vlajka označující, zda se jednalo o plánovaný vstup. Vstup nebude plánován pouze v případě, že jej vložíme ad-hoc.
  • actual – Tento příznak označuje, zda byl tento záznam realizován. Všimněte si, že ve většině případů by oba příznaky, plán i skutečný, byly nastaveny na hodnotu True. To by poukázalo na to, že jsme plán naplánovali a skutečně realizovali.
  • insert_ts – Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

Kombinace repair_shop_id - employee_id - schedule_date - time_from tvoří UNIKÁTNÍ/alternativní klíč této tabulky. Před vložením nového záznamu bychom také měli zkontrolovat nový interval time_fromtime_to se nepřekrývá s žádným existujícím intervalem pro stejného zaměstnance a datum.

Část 2:Zákazníci a kontakty

Nyní jsme připraveni přejít k části modelu související se zákazníky.

Všechny zákazníky, se kterými jsme dříve spolupracovali nebo jsme s nimi byli v kontaktu, uložíme do customer stůl. Pro každého zákazníka uložíme:

  • first_name &last_name – Jméno a příjmení zákazníka, v případě, že je naším zákazníkem soukromá osoba.
  • company_name – Název společnosti, v případě, že zákazník je společnost, nikoli soukromá osoba.
  • address – adresa zákazníka.
  • mobile – Číslo mobilního telefonu zákazníka.
  • email – E-mail zákazníka
  • details – Veškeré další podrobnosti o zákazníkovi, pokud existují, v textovém formátu.
  • insert_ts – Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

Většina atributů v této tabulce má hodnotu null, protože některé z nich pravděpodobně nebudeme mít a některé (first_name &last_name vs. company_name ) vyloučit ostatní.

Budeme muset sledovat všechny kontakty, které jsme navázali s každým zákazníkem. K tomu použijeme dvě tabulky. První, contact_type table, je jednoduchý slovník obsahující pouze UNIKÁTNÍ type_name hodnotu.

Skutečná kontaktní data jsou uložena v contact stůl. Uložíme odkazy na typ tohoto kontaktu (contact_type_id ), zákazníka, se kterým jsme byli v kontaktu (customer_id ), zaměstnance, který tento kontakt provedl (schedule_id ), a také ukládat kontaktní údaje a čas, kdy byl tento záznam vložen do tabulky (insert_ts ).

Část 3:Vozidla

Poté, co známe naše zdroje a zákazníky, musíme uložit vozidla, se kterými budeme pracovat. Kromě sledování dat a vytváření interních zpráv budeme ve většině zemí muset vytvářet také zprávy pro regulační orgány, pojišťovny, policii.

Nejprve definujeme modely našich vozidel. K tomu použijeme 3 tabulky. V make slovníku, uvedeme jedinečné make_names pro všechny výrobce/značky automobilů/vozidel. Kromě toho budeme potřebovat znát typy vozidel, takže použijeme ještě jeden slovník s pouze jedním jedinečným atributem hodnoty – type_name . Použitý 3 slovník je model slovník. Tento bude obsahovat seznam všech modelů, které prošly našimi dveřmi. Pro každý model definujeme jedinečnou kombinaci model_namemake_idvechicle_type_id .

Dokončíme popis této oblasti pomocí vehicle stůl. Toto je jediná tabulka v této oblasti obsahující „skutečné“ údaje. Tuto tabulku použijeme k uložení následujících podrobností:

  • vin – Identifikační číslo vozidla, které toto vozidlo jednoznačně definuje.
  • license_plate – Aktuální poznávací značka.
  • customer_id – Odkaz na zákazníka, kterému toto vozidlo patří. V případě, že vozidlo změní vlastníka, vložíme jej jako nový záznam, ale na základě sériového čísla budeme vědět, že se jedná o stejné vozidlo.
  • model_id – Odkaz na modelový slovník.
  • manufactured_year &manufactured_month – Označte rok a měsíc, kdy bylo toto vozidlo vyrobeno.
  • details – Všechny další podrobnosti v textovém formátu.
  • insert_ts – Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

Část 4:Služby a nabídky

Jsme připraveni udělat další velký krok. Musíme definovat, co nabízíme našim (potenciálním) zákazníkům. Mohou to být jednotlivé úkoly nebo soubor úkolů – služeb.

Seznam všech služeb je uložen v service_catalog slovník. Každá služba se skládá z několika úloh a je jednoznačně definována svým service_name . Kromě názvu uložíme také popis, pokud nějaký máme, procento service_discount a is_active vlajka. Sleva na službu se uplatní na všechny úkony zahrnuté v této službě.

Dále definujeme úkoly. Úkoly jsou součástí našich služeb. Jsou základní činností, kterou lze provádět samostatně. Každá úloha je definována těmito hodnotami v task_catalog tabulka:

  • task_name &service_catalog_id – Název, který použijeme k popisu tohoto úkolu a služby, ke které patří. Tento pár atributů tvoří jedinečný klíč tabulky.
  • description – Dodatečný textový popis, pokud existuje, použitý k popisu tohoto úkolu.
  • ref_interval – Příznak označující, zda budeme měřit interval pro tento úkol.
  • ref_interval_min &ref_interval_max – Minimální a maximální hranice referenčního rozsahu.
  • describe – Příznak označující, zda máme k tomuto úkolu přidat textový komentář.
  • task_price – Aktuální cena za tento úkol bez servisních slev.
  • is_active – Příznak označující, zda je úkol aktuálně aktivní (v naší nabídce) či nikoli.

Po kontaktu se zákazníky jim nabídneme. Nabídka může být kompletní službou se všemi jejími úkoly nebo souborem úkolů. Všechny nabídky jsou uloženy v offer stůl. U každé nabídky uložíme:

  • customer_id – ID souvisejícího zákazníka.
  • contact_id – ID souvisejícího kontaktu, pokud nějaký byl. To by mohla být důležitá informace pro určení, kolik nabídek přišlo jako výsledek předchozích kontaktů.
  • offer_description – Dodatečný textový popis této nabídky.
  • service_catalog_id – ID služby, kterou jsme zákazníkovi nabídli. Toto ID může být NULL v případě, že jsme mu nenabídli kompletní službu, ale jeden nebo více úkolů, které nejsou součástí služby.
  • service_discount – Sleva na službu v okamžiku vytvoření nabídky. Tato hodnota bude obsahovat NULL v případě, že nabídka nesouvisela se službou.
  • offer_price – Konečná cena této nabídky. Dalo by se vypočítat jako součet všech úkolů mínus sleva na službu.
  • insert_ts – Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

Poslední tabulkou v této oblasti je offer_task stůl. U každé nabídky, bez ohledu na to, zda jsme nabízeli kompletní službu nebo ne, uložíme sadu všech úkolů. Potřebujeme uložit následující podrobnosti:

  • offer_id – ID související nabídky.
  • task_catalog_id – ID souvisejícího úkolu. Společně s offer_id , tvoří jedinečný/alternativní klíč této tabulky
  • task_price – Aktuální cena tohoto úkolu v okamžiku vložení tohoto záznamu.
  • insert_ts - Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

Část 5:Návštěvy

Poslední předmětová oblast v našem modelu se používá k ukládání skutečných návštěv zákazníků v naší opravně. Přestože to vypadá složitě, máme zde pouze 2 nové stoly, visit a visit_task .

Když zákazník souhlasí s naší nabídkou nebo jen přijde do našeho obchodu, budeme to považovat za visit . Pro každou takovou událost uložíme následující podrobnosti:

  • repair_shop_id – Odkaz na související opravnu.
  • customer_id – Odkaz na zákazníka, kterého se tato návštěva týká.
  • vehicle_id – Odkaz na vozidlo, kterého se tato návštěva týká.
  • visit_start_date – Datum zahájení návštěvy (plánované).
  • visit_start_time – Čas zahájení návštěvy (plánovaný).
  • visit_end_date – Datum zahájení návštěvy (skutečné). Tato hodnota se nastaví, když návštěva skutečně skončí.
  • visit_end_time – Čas zahájení návštěvy (skutečný). Tato hodnota se nastaví, když návštěva skutečně skončí.
  • license_plate – Číslo SPZ v okamžiku návštěvy. Všimněte si, že SPZ se v průběhu času mění.
  • offer_id – ID související nabídky, pokud existuje.
  • service_catalog_id – ID související služby, pokud existuje.
  • service_discount – Procentuální výše slevy v okamžiku přidání tohoto záznamu a v případě, že nabízíme kompletní službu.
  • visit_price – Celková cena, kterou by měl zákazník zaplatit za tuto návštěvu.
  • invoice_created – Časové razítko, kdy byla faktura vygenerována.
  • invoice_due – Časové razítko, kdy se faktura stala splatnou.
  • invoice_charged – Časové razítko, kdy byla faktura účtována.
  • insert_ts – Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

Poslední tabulkou v našem modelu je visit_task stůl. Toto je místo pro uložení všech úkolů, které byly skutečně součástí této návštěvy. Pro každý záznam zde uložíme následující hodnoty:

  • visit_id – Odkaz na tuto návštěvu.
  • task_catalog_id – Odkaz na související úkol
  • value_measured – Hodnota, která byla naměřena během této úlohy, pokud úloha vyžadovala měření.
  • task_description – Popis související s tímto úkolem, pokud úkol vyžadoval popis.
  • pass – Příznak označující, zda byla tato úloha v očekávaném intervalu či nikoli.
  • task_price – Skutečná cena tohoto úkolu v okamžiku vložení do této tabulky.
  • insert_ts – Časové razítko označující okamžik, kdy byl tento záznam vložen do tabulky.

I když je tento model značně zjednodušený, obsahuje všechny potřebné prvky, které budete potřebovat k sestavení kompletního modelu kolem něj. Díly, které vyžadují vylepšení, jsou určitě použitý materiál a zpracování plateb. Přidali byste k tomuto modelu ještě něco?


  1. Tipy a triky pro implementaci řízení přístupu k databázi na základě rolí pro MariaDB

  2. Jak získat kumulativní součet

  3. Postgres ručně mění sekvenci

  4. Jak číslovat řádky v SQL