Narazili jste někdy na situaci, kdy potřebujete řídit stav subjektu, který se v čase mění? Existuje mnoho příkladů. Začněme tím jednoduchým:sloučením záznamů zákazníků.
Předpokládejme, že slučujeme seznamy zákazníků ze dvou různých zdrojů. Mohlo by dojít k některému z následujících stavů:Identifikace duplikátů – systém nalezl dvě potenciálně duplicitní entity; Potvrzené duplikáty – uživatel ověří, že tyto dvě entity jsou skutečně duplikáty; nebo Potvrzené jedinečné – uživatel rozhodne, že tyto dvě entity jsou jedinečné. V kterékoli z těchto situací má uživatel na výběr pouze ano-ne.
Ale co složitější situace? Existuje způsob, jak definovat skutečný pracovní postup mezi státy? Čtěte dále…
Jak se věci mohou snadno pokazit
Mnoho organizací potřebuje spravovat žádosti o zaměstnání. V jednoduchém modelu můžete mít tabulku nazvanou JOB_APPLICATION a mohli byste sledovat stav aplikace pomocí referenční datové tabulky obsahující hodnoty, jako jsou tyto:
| Stav aplikace |
|---|
APPLICATION_RECEIVED |
APPLICATION_UNDER_REVIEW |
APPLICATION_REJECTED |
INVITED_TO_INTERVIEW |
INVITATION_DECLINED |
INVITATION_ACCEPTED |
INTERVIEW_PASSED |
INTERVIEW_FAILED |
REFERENCES_SOUGHT |
REFERENCES_ACCEPTABLE |
REFERENCES_UNACCEPTABLE |
JOB_OFFER_MADE |
JOB_OFFER_ACCEPTED |
JOB_OFFER_DECLINED |
APPLICATION_CLOSED |
Tyto hodnoty lze kdykoli vybrat v libovolném pořadí. Spoléhá na koncové uživatele, kteří zajistí, že v každé fázi bude proveden logický a správný výběr. Nic nezakazuje nelogický sled stavů.
Řekněme například, že žádost byla zamítnuta. Aktuální stav by zjevně byl APPLICATION_REJECTED . Na úrovni aplikace nelze udělat nic, co by nezkušenému uživateli zabránilo v následném výběru INVITED_TO_INTERVIEW nebo nějaký jiný nelogický stav.
Je potřeba něco, co uživatele povede k výběru dalšího logického stavu, něco, co definuje logický pracovní postup .
A co když máte různé požadavky na různé typy žádostí o zaměstnání? Některá zaměstnání mohou například vyžadovat, aby uchazeč absolvoval zkoušku způsobilosti. Jistě, můžete do seznamu přidat další hodnoty, aby je pokryly, ale v aktuálním návrhu není nic, co by koncovému uživateli nebránilo v nesprávném výběru typu dané aplikace. Realita je taková, že existují různé pracovní postupy pro různé kontexty .
Další bod k zamyšlení:jsou uvedené možnosti skutečně všechny stavy ? Nebo jsou některé ve skutečnosti výsledky ? Například nabídku práce může uchazeč přijmout nebo odmítnout. Proto JOB_OFFER_MADE skutečně má dva výsledky:JOB_OFFER_ACCEPTED a JOB_OFFER_DECLINED .
Dalším výsledkem může být stažení pracovní nabídky. Možná budete chtít zaznamenat důvod, proč byl stažen, pomocí kvalifikátoru. Pokud pouze přidáte tyto důvody do výše uvedeného seznamu, nic nevede koncového uživatele k logickému výběru.
Takže skutečně, čím složitější jsou stavy, výsledky a kvalifikátory, tím více musíte definovat pracovní postup procesu .
Organizace procesů, stavů a výsledků
Než se pokusíte je modelovat, je důležité porozumět tomu, co se s vašimi daty děje. Zpočátku se můžete přiklánět k názoru, že zde existuje přísná hierarchie typů:
Když se blíže podíváme na výše uvedený příklad, uvidíme, že INVITED_TO_INTERVIEW a JOB_OFFER_MADE státy sdílejí stejné možné výsledky, jmenovitě ACCEPTED a DECLINED . To nám říká, že existuje vztah mnoho k mnoha mezi stavy a výsledky. To často platí pro jiné stavy, výsledky a kvalifikátory.
Na koncepční úrovni se tedy s našimi metadaty vlastně děje toto:
Pokud byste tento model transformovali do fyzického světa pomocí standardního přístupu, měli byste tabulky nazvané PROCESS , STATE , OUTCOME a QUALIFIER; budete také potřebovat střední tabulky mezi nimi – PROCESS_STATE , STATE_OUTCOME a OUTCOME_QUALIFIER – vyřešit vztahy mnoho k mnoha . To komplikuje design.
I když musí být zachována logická hierarchie úrovní (proces → stav → výsledek → kvalifikátor), existuje jednodušší způsob, jak fyzicky uspořádat naše metadata.
Vzor pracovního postupu
Níže uvedený diagram definuje hlavní součásti databázového modelu pracovního postupu:
Žluté tabulky nalevo obsahují metadata pracovního postupu a modré tabulky napravo obsahují obchodní data.
První věc, kterou je třeba zdůraznit, je, že může být spravována jakákoli entita bez nutnosti zásadních změn tohoto modelu. YOUR_ENTITIY_TO_MANAGE tabulka je ta pod správou workflow. V našem příkladu by to byla JOB_APPLICATION stůl.
Dále musíme jednoduše přidat wf_state_type_process_id sloupec do jakékoli tabulky, kterou chceme spravovat. Tento sloupec ukazuje na skutečný proces pracovního postupu používá k řízení entity. Toto není výhradně sloupec cizího klíče, ale umožňuje nám rychle dotazovat WORKFLOW_STATE_TYPE pro správný proces. Tabulka, která bude obsahovat historii stavu je MANAGED_ENTITY_STATE . Zde byste si opět vybrali svůj vlastní konkrétní název tabulky a upravili jej podle svých vlastních požadavků.
Metadata
Různé úrovně pracovního postupu jsou definovány v WORKFLOW_LEVEL_TYPE . Tato tabulka obsahuje následující:
| Typový klíč | Popis |
|---|---|
| PROCESOVAT | Proces pracovního postupu na vysoké úrovni. |
| STATE | Stav v procesu. |
| VÝSLEDEK | Jak stav skončí, jeho výsledek. |
| KVALIFIKÁTOR | Volitelný, podrobnější kvalifikátor pro výsledek. |
WORKFLOW_STATE_TYPE a WORKFLOW_STATE_HIERARCHY tvoří klasickou strukturu kusovníku (BOM) . Tato struktura, která velmi dobře popisuje skutečný výrobní kusovník, je v datovém modelování zcela běžná. Může definovat hierarchie nebo být aplikován na mnoho rekurzivních situací. Využijeme to zde k definování naší logické hierarchie procesů, stavů, výsledků a volitelných kvalifikátorů.
Než budeme moci definovat hierarchii, musíme definovat jednotlivé komponenty. To jsou naše základní stavební kameny. Budu je pouze odkazovat pomocí TYPE_KEY (což je unikátní) z důvodu stručnosti. Pro náš příklad máme:
| Typ úrovně pracovního postupu | Klíč stavu pracovního postupu Type.Type |
|---|---|
| VÝSLEDEK | PROSTĚNO |
| VÝSLEDEK | SELHALO |
| VÝSLEDEK | PŘIJÍMÁNO |
| VÝSLEDEK | ODMÍTNUTO |
| VÝSLEDEK | CANDIDATE_CANCELLED |
| VÝSLEDEK | EMPLOYER_CANCELLED |
| VÝSLEDEK | ZAMÍTNUTO |
| VÝSLEDEK | EMPLOYER_WITHDRAWER |
| VÝSLEDEK | NO_SHOW |
| VÝSLEDEK | NAJATO |
| VÝSLEDEK | NOT_HIRED |
| STATE | APPLICATION_RECEIVED |
| STATE | APLIKACE_REVIEW |
| STATE | INVITED_TO_INTERVIEW |
| STATE | ROZHOVOR |
| STATE | TEST_APTITUDE |
| STATE | SEEK_REFERENCES |
| STATE | MAKE_OFFER |
| STATE | APPLICATION_UZAVŘENA |
| PROCESOVAT | STANDARD_JOB_APPLICATION |
| PROCESOVAT | TECHNICAL_JOB_APPLICATION |
Nyní můžeme začít definovat naši hierarchii. Zde bereme naše stavební kameny a definujeme naši strukturu. Pro každý stav definujeme možné výsledky. Ve skutečnosti je pravidlem tohoto systému pracovních postupů, že každý stav musí skončit s výsledkem:
| Typ rodiče – STÁTY | Typ dítěte – VÝSLEDKY |
|---|---|
| APPLICATION_RECEIVED | PŘIJÍMÁNO |
| APPLICATION_RECEIVED | ZAMÍTNUTO |
| APLIKACE_REVIEW | PROSTĚNO |
| APLIKACE_REVIEW | SELHALO |
| INVITED_TO_INTERVIEW | PŘIJÍMÁNO |
| INVITED_TO_INTERVIEW | ODMÍTNUTO |
| ROZHOVOR | PROSTĚNO |
| ROZHOVOR | SELHALO |
| ROZHOVOR | CANDIDATE_CANCELLED |
| ROZHOVOR | NO_SHOW |
| MAKE_OFFER | PŘIJÍMÁNO |
| MAKE_OFFER | ODMÍTNUTO |
| SEEK_REFERENCES | PROSTĚNO |
| SEEK_REFERENCES | SELHALO |
| APPLICATION_CLOSED | NAJATO |
| APPLICATION_CLOSED | NOT_HIRED |
| TEST_APTITUDE | PROSTĚNO |
| TEST_APTITUDE | SELHALO |
Naše procesy jsou jednoduše souborem stavů, z nichž každý existuje po určitou dobu. V níže uvedené tabulce jsou uvedeny v logickém pořadí, které však nedefinuje skutečné pořadí zpracování.
| Rodičovský typ – PROCESY | Typ dítěte – STÁTY |
|---|---|
| STANDARD_JOB_APPLICATION | APPLICATION_RECEIVED |
| STANDARD_JOB_APPLICATION | APLIKACE_REVIEW |
| STANDARD_JOB_APPLICATION | INVITED_TO_INTERVIEW |
| STANDARD_JOB_APPLICATION | ROZHOVOR |
| STANDARD_JOB_APPLICATION | MAKE_OFFER |
| STANDARD_JOB_APPLICATION | SEEK_REFERENCES |
| STANDARD_JOB_APPLICATION | APPLICATION_UZAVŘENA |
| TECHNICAL_JOB_APPLICATION | APPLICATION_RECEIVED |
| TECHNICAL_JOB_APPLICATION | APLIKACE_REVIEW |
| TECHNICAL_JOB_APPLICATION | INVITED_TO_INTERVIEW |
| TECHNICAL_JOB_APPLICATION | TEST_APTITUDE |
| TECHNICAL_JOB_APPLICATION | ROZHOVOR |
| TECHNICAL_JOB_APPLICATION | MAKE_OFFER |
| TECHNICAL_JOB_APPLICATION | SEEK_REFERENCES |
| TECHNICAL_JOB_APPLICATION | APPLICATION_UZAVŘENA |
V souvislosti s hierarchií kusovníku je třeba uvést důležitý bod. Stejně jako fyzický kusovník definuje sestavy a podsestavy až po nejmenší komponenty, máme podobné uspořádání v naší hierarchii. To znamená, že můžeme znovu použít „sestavy“ a „podsestavy“.
Jako příklad:Oba STANDARD_JOB_APPLICATION a TECHNICAL_JOB_APPLICATION procesy mít INTERVIEW stát . Na druhé straně INTERVIEW stát má PASSED , FAILED , CANDIDATE_CANCELLED a NO_SHOW výsledky pro to definované.
Když použijete stav v procesu, automaticky s ním získáte jeho podřízené výsledky, protože se již jedná o sestavení. To znamená, že v INTERVIEW existují stejné výsledky pro oba typy žádostí o zaměstnání etapa. Pokud chcete různé výsledky pohovorů pro různé typy žádostí o zaměstnání, musíte definovat, řekněme, TECHNICAL_INTERVIEW a STANDARD_INTERVIEW uvádí, že každý z nich má své vlastní specifické výsledky.
V tomto příkladu je jediný rozdíl mezi těmito dvěma typy žádostí o zaměstnání v tom, že technická žádost o zaměstnání obsahuje test způsobilosti.
Než odejdete
Část 1 tohoto dvoudílného článku představila vzor databáze pracovního postupu. Ukázal, jak jej můžete začlenit do správy životního cyklu jakékoli entity ve vaší databázi.
Část 2 vám ukáže, jak definovat skutečný pracovní postup pomocí dalších konfiguračních tabulek. Zde budou uživateli předloženy další povolené kroky. Předvedeme také techniku, jak obejít striktní opětovné použití „sestav“ a „podsestav“ v kusovnících.