sql >> Databasteknik >  >> RDS >> Database

Använda arbetsflödesmönster för att hantera tillståndet för alla enheter

Har du någonsin stött på en situation där du behöver hantera tillståndet för en enhet som förändras över tiden? Det finns många exempel där ute. Låt oss börja med en enkel sådan:slå samman kundregister.

Anta att vi slår samman listor över kunder från två olika källor. Vi kan ha något av följande tillstånd:Dubletter identifierade – Systemet har hittat två potentiellt duplicerade enheter; Bekräftade dubbletter – en användare validerar att de två enheterna verkligen är dubbletter; eller Bekräftad unik – användaren bestämmer att de två enheterna är unika. I någon av dessa situationer har användaren bara ett ja-nej-beslut att fatta.

Men hur är det med mer komplexa situationer? Finns det något sätt att definiera det faktiska arbetsflödet mellan stater? Läs vidare...

Hur saker lätt kan gå fel

Många organisationer behöver hantera jobbansökningar. I en enkel modell kan du ha en tabell som heter JOB_APPLICATION , och du kan spåra applikationens tillstånd med hjälp av en referensdatatabell som innehåller värden som dessa:


Programstatus
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


Dessa värden kan väljas i valfri ordning när som helst. Det förlitar sig på slutanvändarna för att säkerställa att ett logiskt och korrekt urval görs i varje steg. Ingenting förbjuder en ologisk sekvens av tillstånd.

Låt oss till exempel säga att en ansökan har avslagits. Den nuvarande statusen skulle uppenbarligen vara APPLICATION_REJECTED . Det finns inget som kan göras på applikationsnivå för att hindra en oerfaren användare från att sedan välja INVITED_TO_INTERVIEW eller något annat ologiskt tillstånd.

Vad som behövs är något som vägleder användaren att välja nästa logiska tillstånd, något som definierar ett logiskt arbetsflöde .

Och vad händer om du har olika krav på olika typer av jobbansökningar? Till exempel kan vissa jobb kräva att den sökande gör ett lämplighetstest. Visst, du kan lägga till fler värden till listan för att täcka dessa, men det finns inget i den nuvarande designen som hindrar slutanvändaren från att göra ett felaktigt val för den aktuella typen av applikation. Verkligheten är att det finns olika arbetsflöden för olika sammanhang .

En annan punkt att tänka på:är de listade alternativen verkligen alla stater ? Eller är några faktiskt resultat ? Till exempel kan erbjudandet om ett jobb accepteras eller avslås av den sökande. Därför JOB_OFFER_MADE har verkligen två resultat:JOB_OFFER_ACCEPTED och JOB_OFFER_DECLINED .

Ett annat resultat kan vara att ett jobberbjudande dras tillbaka. Du kanske vill anteckna anledningen till att den drogs tillbaka med hjälp av ett kval. Om du bara lägger till dessa skäl till listan ovan, vägleder ingenting slutanvändaren att göra logiska val.

Så egentligen, ju mer komplexa tillstånden, resultaten och kvalificeringarna blir, desto mer behöver du definiera arbetsflödet av en process .

Organisera processer, tillstånd och resultat

Det är viktigt att förstå vad som händer med din data innan du försöker modellera den. Du kanske till en början är benägen att tro att det finns en strikt hierarki av typer här:processtillståndresultat .

När vi tittar närmare på exemplet ovan ser vi att INVITED_TO_INTERVIEW och JOB_OFFER_MADE tillstånd delar samma möjliga resultat, nämligen ACCEPTED och DECLINED . Detta berättar för oss att det finns en många-till-många-relation mellan tillstånd och resultat. Detta är ofta sant för andra delstater, resultat och kvalificeringar.

På en konceptuell nivå är det alltså detta som faktiskt händer med vår metadata:

Om du skulle transformera den här modellen till den fysiska världen med standardmetoden skulle du ha tabeller som heter PROCESS , STATE , OUTCOME och QUALIFIER; du skulle också behöva ha mellanliggande tabeller mellan dem – PROCESS_STATE , STATE_OUTCOME och OUTCOME_QUALIFIERför att lösa många-till-många-relationerna . Detta komplicerar designen.

Medan den logiska hierarkin av nivåer (process → tillstånd → resultat → kvalificering) måste bibehållas, finns det ett enklare sätt att fysiskt organisera vår metadata.

Arbetsflödesmönstret

Diagrammet nedan definierar huvudkomponenterna i en arbetsflödesdatabasmodell:




De gula tabellerna till vänster innehåller arbetsflödesmetadata och de blå tabellerna till höger innehåller affärsdata.

Det första att påpeka är att alla enheter kan hanteras utan att kräva större förändringar av denna modell. YOUR_ENTITIY_TO_MANAGE tabellen är den under arbetsflödeshantering. I vårt exempel skulle detta vara JOB_APPLICATION tabell.

Därefter behöver vi helt enkelt lägga till wf_state_type_process_id kolumn till vilken tabell vi vill hantera. Den här kolumnen pekar på den faktiska processen för arbetsflödet används för att hantera enheten. Det här är inte strikt en främmande nyckelkolumn, men den tillåter oss att snabbt fråga WORKFLOW_STATE_TYPE för rätt process. Tabellen som kommer att innehålla tillståndshistoriken är MANAGED_ENTITY_STATE . Återigen, du skulle välja ditt eget specifika tabellnamn här och ändra det för dina egna krav.

Metadata

De olika arbetsflödesnivåerna definieras i WORKFLOW_LEVEL_TYPE . Den här tabellen innehåller följande:


Typnyckel Beskrivning
PROCESS Arbetsflödesprocess på hög nivå.
STATE Ett tillstånd i processen.
RESULTAT Hur en stat slutar, dess resultat.
QUALIFIER En valfri, mer detaljerad kvalificering för ett resultat.


WORKFLOW_STATE_TYPE och WORKFLOW_STATE_HIERARCHY bildar en klassisk styckliststruktur . Denna struktur, som är mycket beskrivande för en faktisk tillverkningsstyck, är ganska vanlig inom datamodellering. Det kan definiera hierarkier eller tillämpas på många rekursiva situationer. Vi kommer att använda det här för att definiera vår logiska hierarki av processer, tillstånd, resultat och valfria kvalificerare.

Innan vi kan definiera en hierarki måste vi definiera de enskilda komponenterna. Dessa är våra grundläggande byggstenar. Jag kommer bara att referera till dessa med TYPE_KEY (vilket är unikt) för korthetens skull. För vårt exempel har vi:


Typ av arbetsflödesnivå Workflow State Type.Type Key
RESULTAT GODKÄND
RESULTAT MISSLYCKADES
RESULTAT ACCEPTERAT
RESULTAT AVVISADE
RESULTAT CANDIDATE_CANCELLED
RESULTAT EMPLOYER_CANCELLED
RESULTAT AVVISAD
RESULTAT EMPLOYER_WITHDRAWN
RESULTAT NO_SHOW
RESULTAT ANhyrd
RESULTAT NOT_HIRED
STATE APPLICATION_RECEIVED
STATE APPLICATION_REVIEW
STATE INVITED_TO_INTERVIEW
STATE INTERVJU
STATE TEST_APTITUDE
STATE SEEK_REFERENCES
STATE MAKE_OFFER
STATE APPLICATION_CLOSED
BEHANDLING STANDARD_JOB_APPLICATION
BEHANDLING TECHNICAL_JOB_APPLICATION


Nu kan vi börja definiera vår hierarki. Det är här vi tar våra byggstenar och definierar vår struktur. För varje stat definierar vi de möjliga resultaten. Faktum är att det är en regel för detta arbetsflödessystem att varje tillstånd måste avslutas med ett resultat:


Föräldratyp – STATES Barntyp – RESULTAT
APPLICATION_RECEIVED ACCEPTERAT
APPLICATION_RECEIVED AVVISAD
APPLICATION_REVIEW GODKÄND
APPLICATION_REVIEW MISSLYCKADES
INVITED_TO_INTERVIEW ACCEPTERAT
INVITED_TO_INTERVIEW AVVISADE
INTERVJU GODKÄND
INTERVJU MISSLYCKADES
INTERVJU CANDIDATE_CANCELLED
INTERVJU NO_SHOW
MAKE_OFFER ACCEPTERAT
MAKE_OFFER AVVISADE
SEEK_REFERENCES GODKÄND
SEEK_REFERENCES MISSLYCKADES
APPLICATION_CLOSED ANhyrd
APPLICATION_CLOSED NOT_HIRED
TEST_APTITUDE GODKÄND
TEST_APTITUDE MISSLYCKADES


Våra processer är helt enkelt en uppsättning tillstånd som var och en existerar under en tidsperiod. I tabellen nedan presenteras de i en logisk ordning, men detta definierar inte den faktiska bearbetningsordningen.


Föräldratyp – PROCESSER Barntyp – STATES
STANDARD_JOB_APPLICATION APPLICATION_RECEIVED
STANDARD_JOB_APPLICATION APPLICATION_REVIEW
STANDARD_JOB_APPLICATION INVITED_TO_INTERVIEW
STANDARD_JOB_APPLICATION INTERVJU
STANDARD_JOB_APPLICATION MAKE_OFFER
STANDARD_JOB_APPLICATION SEEK_REFERENCES
STANDARD_JOB_APPLICATION APPLICATION_CLOSED
TECHNICAL_JOB_APPLICATION APPLICATION_RECEIVED
TECHNICAL_JOB_APPLICATION APPLICATION_REVIEW
TECHNICAL_JOB_APPLICATION INVITED_TO_INTERVIEW
TECHNICAL_JOB_APPLICATION TEST_APTITUDE
TECHNICAL_JOB_APPLICATION INTERVJU
TECHNICAL_JOB_APPLICATION MAKE_OFFER
TECHNICAL_JOB_APPLICATION SEEK_REFERENCES
TECHNICAL_JOB_APPLICATION APPLICATION_CLOSED


Det finns en viktig poäng att göra angående en BOM-hierarki. Precis som en fysisk stycklista definierar sammansättningar och underenheter ner till de minsta komponenterna, har vi ett liknande arrangemang i vår hierarki. Det betyder att vi får återanvända 'sammansättningar' och 'undersammansättningar'.

Som exempel:Både STANDARD_JOB_APPLICATION och TECHNICAL_JOB_APPLICATION processer har INTERVIEW tillstånd . I sin tur, INTERVIEW tillstånd har PASSED , FAILED , CANDIDATE_CANCELLED och NO_SHOW resultat definieras för det.

När du använder ett tillstånd i en process får du automatiskt dess underordnade resultat med det eftersom det redan är en sammansättning. Detta innebär att samma resultat finns för båda typerna av jobbansökningar vid INTERVIEW skede. Om du vill ha olika intervjuresultat för olika typer av jobbansökningar måste du definiera t.ex. TECHNICAL_INTERVIEW och STANDARD_INTERVIEW anger att var och en har sina egna specifika resultat.

I det här exemplet är den enda skillnaden mellan de två typerna av jobbansökningar att en teknisk jobbansökan innehåller ett lämplighetstest.

Innan du går

Del 1 av denna tvådelade artikel har introducerat arbetsflödesdatabasmönstret. Den har visat hur du kan integrera den för att hantera livscykeln för alla enheter i din databas.

Del 2 visar dig hur du definierar det faktiska arbetsflödet med hjälp av ytterligare konfigurationstabeller. Det är här användaren kommer att presenteras för tillåtna nästa steg. Vi kommer också att visa en teknik för att komma runt den strikta återanvändningen av "sammansättningar" och "undersammansättningar" i stycklistor.


  1. Installera Percona XtraDB Cluster på CentOS 7

  2. Använda pivot på flera kolumner i en Oracle-rad

  3. 3 sätt att returnera en lista över SQL Server Agent-jobb (T-SQL)

  4. Django :Bordet finns inte