|
Tags: Database | Oracle
| ||
| ||
The never ending story of business rules
Door Toon KoppelaarsBij elk informatiesysteem komen we het fenomeen business rules tegen. De term wordt vaak in de mond genomen zonder dat deze helder gedefinieerd wordt. Wat is nou precies een business rule? Er is geen algemeen geaccepteerde definitie voor dit concept.Er is echter wel een ander, zeer helder gedefinieerd (en ook algemeen geaccepteerd) concept, wat erg in de buurt komt van wat men bedoelt met de term business rules. Dit betreft het concept van data integriteit constraints.Data integriteit constraintsData integriteits constraints zijn beperkingsregels op de data die we toestaan in de database. Het zijn dus regels die beschrijven welke vulling we wel en welke we niet toestaan in de tabellen van ons database design. In de praktijk zien we dat business rules vaak één-op-één te vertalen zijn naar een beperkingsregel in het onderliggende database design van een informatiesysteem. De business rules die niet als constraint beschouwd kunnen worden, blijken vaak rules te zijn (beperkingen, condities, automatische akties, etc.) met betrekking tot de functies en bedrijfsprocessen die het informatiesysteem ondersteunt. Het is belangrijk om duidelijk onderscheid te maken tussen de data integriteit constraints, en deze overige rules (laten we ze voor het gemak process rules noemen). De constraints hebben met de data te maken. De process rules hebben met de business logic van het informatiesysteem te maken.Ten tijde van implementeren blijken process rules en constraints twee wezenlijk verschillende zaken te zijn.
Een voor de hand liggende manier om dit dreigend onderhoudsprobleem van constraints te voorkomen, is om alle constraint implementerende code éénmalig en liefst zo dicht mogelijk bij de data te implementeren. Een SQL DBMS biedt ons hiertoe twee opties: declaratieve constraints en tabel triggers. Implementeren van constraintsBij de implementatie van data integriteit constraints is het raadzaam om een classificatie van constraints te hanteren. Hierdoor ben je in staat om standaarden met betrekking tot het implementeren van constraints, per klasse van constraints te ontwikkelen. De algemeen geaccepteerde classificatie van data integriteit constraints gaat uit van de scope die een constraint in het database design heeft. Deze classificatie blijkt tevens een erg praktische te zijn, omdat de scope van een constraint een sterke correlatie heeft met de benodigde implementatie effort voor die constraint.
NB: er is nog een vijfde klasse van constraints, de transitie constraints. Deze laten we in dit artikel verder buiten beschouwing.De ANSI SQL standaard levert ons declaratieve check constraints, primary en unique key constraints, en foreign key constraints. Deze zijn ook allemaal beschikbaar in de SQL implementatie van de gangbare RDBMS-en, waaronder die van Oracle. Deze SQL constraints stellen ons in staat om een groot deel van de data integriteit constraints declaratief te implementeren. Doorgaans doe je dit ten tijde van het aanmaken van de tabelstructuren in je database design. We zullen nu één en ander toelichten met een welbekende EMP-DEPT database design.Hier is de definitie van een EMP tabel. Embedded zijn de definities van diverse constraints, waaronder enkele die we hierboven bij de classificatie als voorbeeld hebben genoemd. (1) En de definitie van een DEPT tabel met enkele constraints. (2) Middels een check constraint kunnen we alle attribuut en tuple constraints declaratief implementeren. De primary key en foreign key zijn taal constructies om respectievelijk een vaak voorkomende tabel, en een vaak voorkomende database constraint declaratief te implementeren. Wat in de ANSI SQL standaard ook beschreven wordt, zijn declaratieve assertion constraints. Echter geen enkele DBMS leverancier heeft deze (zinvol) geïmplementeerd. Hieronder is het taal constructie diagram voor assertion constraints. (3) De <condition> component representeert een willekeurige boolean expressie waarin ook subqueries voor mogen komen. Een assertion is een losstaand object, i.e. niet direct gekoppeld aan één of meerdere tabel structuren. De ANSI SQL standaard beschrijft dat het de taak van het DBMS is om alle gedefi nieerde assertions te controleren tijdens transacties: alle <condition> expressies van opgevoerde assertions dienen ten alle tijde tot TRUE te evalueren. Stelt u zich eens voor dat assertion constraints beschikbaar zouden zijn. Dan zijn we in staat om alle constraints op een declaratieve manier in het DBMS te specificeren en hoeven we zelf verder geen enkele regel code te schrijven om deze constraints af te dwingen. Constraints zijn dan zeer goed te onderhouden: we hoeven slechts op één plek, in het DBMS, de assertion aan te passen als de constraint gewijzigd moet worden. We kijken even naar een voorbeeld. Stel dat in het nevenstaande EMP-DEPT database design de volgende business rule geïmplementeerd moet worden: Er mag maximaal één manager (i.e. een employee met JOB=’MANAGER”) per afdeling zijn. Deze busines rule kan als volgt met een assertion constraint gespecificeerd worden. (4) Hier is nog een voorbeeld. De som van de salarissen van de employees in een afdeling moet onder het afdelingsbudget (SALBUDGET) liggen. (5) Het is bijzonder jammer dat declaratieve assertions niet beschikbaar zijn. Ik ben er volledig van overtuigd dat U ze zou gebruiken, net zoals U nu ook check, key en foreign key constraints gebruikt. Ze lossen immers het beheersprobleem rondom constraints voor eens en altijd op. Maar dat niet alleen. Assertion support zou ook aanzienlijke besparingen opleveren bij het bouwen van informatiesystemen, en ze geven U gegarandeerde data integriteit. Met name dit laatste aspect is bijzonder moeilijk bereikbaar als je zelf complexe procedurele code moet gaan schrijven om constraints af te dwingen. Laten we eens onderzoeken hoe we zelf middels tabel triggers constraints zouden kunnen afdwingen. We willen een efficiënte implementatie. Dat wil zeggen we willen tijdens een transactie een constraint alleen controleren als deze transactie ook dusdanig is dat de constraint potentieel geschonden zou kunnen worden. Bijvoorbeeld in het geval van de “maximaal één manager per afdeling” is het alleen zinvol om te controleren wanneer:
In het geval van de “som van salaris per afdeling moet onder het afdelingsbudget liggen” constraint is het alleen zinvol om te controleren wanneer:
Laten we het eerste voorbeeld gebruiken om dit toe te lichten. Het was alleen zinvol om de “maximaal één manager per afdeling” constraint te controleren als er een nieuwe manager ge-insert wordt. Dit kunnen we specifi ceren door een query op inserted_rows te schrijven die nagaat of dat het geval is. (8) We gaan nu alleen de validatie query uitvoeren als bovenstaande query een resultaat oplevert. Door de betreffende deptno waarde te selecteren, zijn we in staat om deze als bind-value door te geven aan de validatie query. Op soortgelijke wijze schrijven we een query op updated_rows die aangeeft wanneer we de constraints in geval van een update-statement moeten controleren: (9) Bovenstaande query detecteert de update statements die ofwel iemand tot manager promoveren, ofwel een manager naar een andere afdeling verhuizen. In beide gevallen willen we de constraint voor de new_deptno afdeling gaan controleren. Natuurlijk moeten we nog de nodige PL/SQL eromheen coderen om te zorgen dat de queries afgaan, de bind-value wordt doorgegeven, en indien nodig de raise_application_error wordt uitgevoerd. Het is natuurlijk nog mooier als we deze code helemaal laten genereren middels het RuleGen framework (zie www.rulegen.com). The neverending story
De afgelopen decennia hebben we
overal code geïmplementeerd
om data
integriteit constraints te
controleren.
Data integriteits constraints zullen altijd een integraal onderdeel van de informatiesystemen vormen die we nu en in de toekomst ontwikkelen. Pas als DBMS leveranciers ons een efficiënte implementatie van assertion constraints gaan bieden, zal dat waarschijnlijk het laatste hoofdstuk van de neverending story rondom constraints gaan worden. Dan zal de belofte van Codd’s relationele data model eindelijk ingevuld zijn. Toon Koppelaars is managing partner van RuleGen BV.
| ||
| Lees meer over RuleGen | ||
| Ga terug naar We Love IT uitgave #2 - 2008 | ||
|





De afgelopen decennia hebben we
overal code geïmplementeerd
om data
integriteit constraints te
controleren.