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

Brug af arbejdsgangsmønstre til at administrere enhver enheds tilstand

Er du nogensinde stødt på en situation, hvor du har brug for at styre en enheds tilstand, der ændrer sig over tid? Der er mange eksempler derude. Lad os starte med en nem en:flette kunderegistreringer.

Antag, at vi slår lister over kunder fra to forskellige kilder sammen. Vi kunne have en af ​​følgende tilstande opstået:Dubletter identificeret – systemet har fundet to potentielt duplikerede enheder; Bekræftede dubletter – en bruger validerer, at de to enheder faktisk er dubletter; eller Bekræftet unik – brugeren beslutter, at de to enheder er unikke. I enhver af disse situationer har brugeren kun en ja-nej-beslutning at træffe.

Men hvad med mere komplekse situationer? Er der en måde at definere den faktiske arbejdsgang mellem stater? Læs videre...

Hvordan ting nemt kan gå galt

Mange organisationer har brug for at administrere jobansøgninger. I en simpel model kunne du have en tabel kaldet JOB_APPLICATION , og du kan spore applikationens tilstand ved hjælp af en referencedatatabel, der indeholder værdier som disse:


Applikationsstatus
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


Disse værdier kan til enhver tid vælges i enhver rækkefølge. Den er afhængig af slutbrugerne for at sikre, at der foretages et logisk og korrekt valg på hvert trin. Intet forbyder en ulogisk sekvens af tilstande.

Lad os for eksempel sige, at en ansøgning er blevet afvist. Den aktuelle status ville naturligvis være APPLICATION_REJECTED . Der er intet, der kan gøres på applikationsniveau for at forhindre en uerfaren bruger i efterfølgende at vælge INVITED_TO_INTERVIEW eller en anden ulogisk tilstand.

Det, der er brug for, er noget til at guide brugeren til at vælge den næste logiske tilstand, noget der definerer en logisk arbejdsgang .

Og hvad hvis du har forskellige krav til forskellige typer jobansøgninger? For eksempel kan nogle job kræve, at ansøgeren skal tage en egnethedsprøve. Selvfølgelig kan du tilføje flere værdier til listen for at dække disse, men der er intet i det nuværende design, der forhindrer slutbrugeren i at foretage et forkert valg for den pågældende type applikation. Virkeligheden er, at der er forskellige arbejdsgange til forskellige sammenhænge .

Et andet punkt at tænke over:er de anførte muligheder virkelig alle stater ? Eller er nogle faktisk resultater ? Eksempelvis kan tilbuddet om et job accepteres eller afvises af ansøgeren. Derfor JOB_OFFER_MADE har virkelig to resultater:JOB_OFFER_ACCEPTED og JOB_OFFER_DECLINED .

Et andet resultat kunne være, at et jobtilbud trækkes tilbage. Du ønsker måske at registrere årsagen til, at den blev trukket tilbage ved hjælp af en kvalifikation. Hvis du blot tilføjer disse grunde til ovenstående liste, guider intet slutbrugeren til at foretage logiske valg.

Så jo mere komplekse tilstande, resultater og kvalifikationer bliver, jo mere skal du definere arbejdsgangen af en proces .

Organisering af processer, tilstande og resultater

Det er vigtigt at forstå, hvad der sker med dine data, før du forsøger at modellere dem. Du kan i første omgang være tilbøjelig til at tro, at der er et strengt hierarki af typer her:procestilstandresultat .

Når vi ser nærmere på ovenstående eksempel, ser vi, at INVITED_TO_INTERVIEW og JOB_OFFER_MADE stater deler de samme mulige udfald, nemlig ACCEPTERET og AFVISET . Dette fortæller os, at der er et mange-til-mange forhold mellem tilstande og resultater. Dette gælder ofte for andre stater, resultater og kvalifikationer.

På et konceptuelt niveau er det altså, hvad der faktisk foregår med vores metadata:

Hvis du skulle transformere denne model til den fysiske verden ved hjælp af standardtilgangen, ville du have tabeller kaldet PROCESS , STAT , RESULTAT , og QUALIFIER ; du skal også have mellemliggende tabeller mellem dem – PROCESS_STATE , STATE_OUTCOME , og OUTCOME_QUALIFIER at løse mange-til-mange-relationerne . Dette komplicerer designet.

Mens det logiske hierarki af niveauer (proces → tilstand → resultat → kvalifikation) skal opretholdes, er der en enklere måde at organisere vores metadata fysisk på.

Workflow-mønsteret

Diagrammet nedenfor definerer hovedkomponenterne i en workflow-databasemodel:




De gule tabeller til venstre indeholder workflowmetadata, og de blå tabeller til højre indeholder forretningsdata.

Den første ting at påpege er, at enhver enhed kan administreres uden at kræve større ændringer af denne model. YOUR_ENTITIY_TO_MANAGE tabellen er den, der er under workflow management. I forhold til vores eksempel ville dette være JOB_APPLICATION bord.

Dernæst skal vi blot tilføje wf_state_type_process_id kolonne til den tabel, vi ønsker at administrere. Denne kolonne peger på den faktiske arbejdsgang proces bruges til at administrere enheden. Dette er ikke udelukkende en fremmednøglekolonne, men det giver os mulighed for hurtigt at forespørge WORKFLOW_STATE_TYPE for den korrekte proces. Tabellen, der vil indeholde tilstandshistorikken er MANAGED_ENTITY_STATE . Igen, du ville vælge dit eget specifikke tabelnavn her og ændre det efter dine egne behov.

Metadataene

De forskellige niveauer af arbejdsgange er defineret i WORKFLOW_LEVEL_TYPE . Denne tabel indeholder følgende:


Typenøgle Beskrivelse
PROCES Workflowproces på højt niveau.
STAT En tilstand i processen.
RESULTAT Hvordan en stat ender, dens udfald.
QUALIFIER En valgfri, mere detaljeret kvalifikation til et resultat.


WORKFLOW_STATE_TYPE og WORKFLOW_STATE_HIERARCHY danne en klassisk styklistestruktur . Denne struktur, som er meget beskrivende for en faktisk fremstillingsstykliste, er ret almindelig i datamodellering. Det kan definere hierarkier eller anvendes på mange rekursive situationer. Vi vil bruge det her til at definere vores logiske hierarki af processer, tilstande, resultater og valgfrie kvalifikationer.

Før vi kan definere et hierarki, skal vi definere de enkelte komponenter. Det er vores grundlæggende byggesten. Jeg vil bare henvise til disse ved hjælp af TYPE_KEY (hvilket er unikt) for korthedens skyld. For vores eksempel har vi:


Workflow Level Type Workflow State Type.Type Key
RESULTAT Bestået
RESULTAT FEJLDE
RESULTAT ACCEPTERET
RESULTAT AFSLAG
RESULTAT CANDIDATE_CANCELLED
RESULTAT EMPLOYER_CANCELLED
RESULTAT AFVISET
RESULTAT EMPLOYER_WITHDRAWN
RESULTAT NO_SHOW
RESULTAT LEJET
RESULTAT NOT_HIRED
STAT APPLICATION_RECEIVED
STAT APPLICATION_REVIEW
STAT INVITED_TO_INTERVIEW
STAT INTERVIEW
STAT TEST_APTITUDE
STAT SEEK_REFERENCES
STAT MAKE_OFFER
STAT APPLICATION_CLOSED
BEHANDLING STANDARD_JOB_APPLICATION
BEHANDLING TECHNICAL_JOB_APPLICATION


Nu kan vi begynde at definere vores hierarki. Det er her, vi tager vores byggeklodser og definerer vores struktur. For hver stat definerer vi de mulige resultater. Faktisk er det en regel i dette workflow-system, at hver tilstand skal afsluttes med et resultat:


Forældretype – STATE Barnetype – RESULTATER
APPLICATION_RECEIVED ACCEPTERET
APPLICATION_RECEIVED AFVISET
APPLICATION_REVIEW Bestået
APPLICATION_REVIEW FEJLDE
INVITED_TO_INTERVIEW ACCEPTERET
INVITED_TO_INTERVIEW AFSLAG
INTERVIEW Bestået
INTERVIEW FEJLDE
INTERVIEW CANDIDATE_CANCELLED
INTERVIEW NO_SHOW
MAKE_OFFER ACCEPTERET
MAKE_OFFER AFSLAG
SEEK_REFERENCES Bestået
SEEK_REFERENCES FEJLDE
APPLICATION_CLOSED LEJET
APPLICATION_CLOSED NOT_HIRED
TEST_APTITUDE Bestået
TEST_APTITUDE FEJLDE


Vores processer er simpelthen et sæt tilstande, der hver især eksisterer i en periode. I tabellen nedenfor er de præsenteret i en logisk rækkefølge, men dette definerer ikke den faktiske rækkefølge for behandling.


Forældretype – PROCESSER Child Type – STATES
STANDARD_JOB_APPLICATION APPLICATION_RECEIVED
STANDARD_JOB_APPLICATION APPLICATION_REVIEW
STANDARD_JOB_APPLICATION INVITED_TO_INTERVIEW
STANDARD_JOB_APPLICATION INTERVIEW
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 INTERVIEW
TECHNICAL_JOB_APPLICATION MAKE_OFFER
TECHNICAL_JOB_APPLICATION SEEK_REFERENCES
TECHNICAL_JOB_APPLICATION APPLICATION_CLOSED


Der er en vigtig pointe at gøre med et styklistehierarki. Ligesom en fysisk stykliste definerer samlinger og undersamlinger ned til de mindste komponenter, har vi et lignende arrangement i vores hierarki. Det betyder, at vi kommer til at genbruge ’samlinger’ og ’undersamlinger’.

Som eksempel:Både STANDARD_JOB_APPLICATION og TECHNICAL_JOB_APPLICATION processer har INTERVIEW stat . Til gengæld er INTERVIEW stat har PASSED , FEJLDE , CANDIDATE_CANCELLED og NO_SHOW resultater defineret til det.

Når du bruger en tilstand i en proces, får du automatisk dens underordnede resultater med den, fordi den allerede er en samling. Det betyder, at de samme resultater eksisterer for begge typer jobansøgninger ved INTERVIEW scene. Hvis du ønsker forskellige samtaleresultater for forskellige typer jobansøgninger, skal du definere f.eks. TECHNICAL_INTERVIEW og STANDARD_INTERVIEW angiver, at hver har deres egne specifikke resultater.

I dette eksempel er den eneste forskel mellem de to typer jobansøgninger, at en teknisk jobansøgning indeholder en egnethedstest.

Før du går

Del 1 af denne todelte artikel har introduceret workflowdatabasemønsteret. Det har vist, hvordan du kan inkorporere det for at administrere livscyklussen for enhver enhed i din database.

Del 2 viser dig hvordan du definerer den faktiske arbejdsgang ved hjælp af yderligere konfigurationstabeller. Det er her, brugeren vil blive præsenteret for tilladte næste trin. Vi vil også demonstrere en teknik til at omgå den strenge genbrug af 'samlinger' og 'undersamlinger' i styklister.


  1. Sådan konfigurerer du Spotlight Cloud og fejlfinder effektivt SQL Server

  2. Hent en liste over private procedurer/funktioner fra et pakkelegeme

  3. Android SQLite-databasetabel oprettes ikke

  4. Sådan komprimeres din database, så den kører hurtigere