Naar hoofdinhoud gaan

Definitie van een modelgestuurde tabel

Schema-id: model-driven-entity@1 Machineleesbaar schema: model-driven-entity.schema.json

De canonieke weergave in platte tekst van een tabel van modelgestuurde apps. Dit is de bron van waarheid waartegen een tabel wordt gevalideerd — dezelfde definitie die de ontwerper produceert, die een API-aanroep indient, die een AI-assistent genereert en die een oplossingsimport meeneemt. De validatie is voor elke herkomst identiek, dus een zelfgeschreven of gegenereerd bestand dat aan dit schema voldoet, is veilig om te importeren.

Structuur​

Een definitie is een JSON-object met deze leden:

VeldTypeVerplichtOpmerkingen
logicalNametekenreeksjaMet uitgeversvoorvoegsel, in kleine letters snake_case (bijv. par_invoice).
displayNametekenreeksjaLabel in het enkelvoud (bijv. Invoice).
displayCollectionNametekenreeksjaLabel in het meervoud (bijv. Invoices).
icontekenreeksneePictogramsleutel uit de samengestelde pictogramset van het platform, getoond naast de tabel in de navigatie van een app (§4.4). Laat weg voor het standaardsymbool.
publisherPrefixtekenreeksjaKort voorvoegsel in kleine letters (bijv. par).
primaryFieldtekenreeksjaLogische naam van het primaire veld (naamveld); moet in fields voorkomen.
primaryImagetekenreeksneeLogische naam van de recordafbeelding (§6.16) — de afbeelding die naast een record in rasters en zoekvelden wordt getoond. Moet een veld van het type Image in fields noemen. Laat weg voor een tabel zonder afbeelding.
secondaryFieldtekenreeks | nullneeLogische naam van het veld dat wordt getoond als secundaire tekst van de record — de kleinere tweede regel onder de naam, overal waar records zonder raster worden opgesomd, zoals in een zoekveldpaneel (§6.13.5). Moet een veld in fields noemen dat niet het primaire veld is en geen File/Image-kolom.
hierarchyParentFieldtekenreeks | nullneeLogische naam van het zoekveld dat van deze tabel een hiërarchie maakt — het veld dat de bovenliggende record van elke record bevat en terugwijst naar deze zelfde tabel (de bovenliggende categorie van een categorie, de bovenliggende eenheid van een eenheid). Moet een veld in fields noemen van het type Lookup waarvan targetEntity deze tabel is. Het kent niets toe en dwingt niets af: de tabel wordt nog steeds als raster gerenderd totdat een weergave de records nest. Waar het voor dient, is dat een hiërarchie zijn een eigenschap van de gegevens is en niet van één weergave — het hoogste niveau van een boomweergave gebruikt het standaard als koppeling naar de onderliggende records.
personFieldtekenreeksnullnee
constraintsarrayneeRegels die de database afdwingt, niet de applicatie (zie hieronder) — een unieke kolom, of een periode die niet mag overlappen met een andere in hetzelfde bereik.
fieldsarrayjaEen of meer velddefinities (zie hieronder).
relationshipsarrayneeEen-op-veel-relaties die worden ondersteund door zoekvelden.
isAuditEnabledbooleaansneeSchakelt het auditen van wijzigingen voor de tabel in (sectie 6.5). Standaard false.
statesarrayneeDe statussen waarin een record van deze tabel kan verkeren (§6.14) — de levenscyclus ervan. Zie hieronder. Afwezig in een document dat is geschreven voordat statussen bestonden; zo onderscheidt een importeur dat van een tabel zonder statussen.
reasonsarrayneeDe redenen, die elk bij precies één status horen. Zie hieronder.
statusValueBasegeheel getalneeDe ondergrens van het bereik waaruit de toegevoegde status- en redenopties van deze tabel worden genummerd — de optiewaardebasis van de eigenaar-uitgever (§6.14). De geseede Actief/Inactief staan daarbuiten op 0 en 1: elke tabel heeft ze en ze betekenen overal hetzelfde, dus ze hebben geen naamruimte nodig.
nextStatusValuegeheel getalneeDe hoogwatermarkering voor statussen van de tabel — de volgende waarde die ze uitdeelt. Opgeslagen in plaats van afgeleid uit de opties, om dezelfde reden als bij een keuzeset: het nummer van een verwijderde optie wordt buiten gebruik gesteld, en opnieuw afleiden zou het aan de volgende nieuwe optie geven terwijl records het misschien nog bevatten.

Veld​

VeldTypeVerplichtOpmerkingen
logicalNametekenreeksjaKleine letters snake_case.
displayNametekenreeksja
dataTypetekenreeksjaEen van Text, MultilineText, Integer, Decimal, Boolean, DateTime, Lookup, PolymorphicLookup, File, Image, OptionSet, State, Reason.
isRequiredbooleaansnee
isPrimarybooleaansneeTrue voor het enige primaire veld.
maxLengthgeheel getalneeVoor Text (1–4000).
precision, scalegeheel getalneeVoor Decimal (scale ≤ precision ≤ 38).
targetEntitytekenreeksvoorwaardelijkVerplicht wanneer dataType Lookup is; de logische naam van de tabel waarnaar wordt verwezen.
targetEntitiestekenreeks[]voorwaardelijkVerplicht wanneer dataType PolymorphicLookup is; de tabellen waarnaar een waarde mag wijzen, in de volgorde van de kiezer. Minstens twee, geen herhalingen.
isAuditExcludedbooleaansneeSluit het veld uit van het auditen van wijzigingen wanneer de tabel wordt geaudit (sectie 6.5). Standaard false.

Velden van het type PolymorphicLookup worden aangelegd als twee kolommen: de eigen uuid-kolom van het veld met de id van de record, en een zusterkolom <column>_type van het type text met de logische naam van de doeltabel. Geen van beide heeft een foreign key — één kolom kan niet naar meerdere tabellen verwijzen — dus de integriteit ligt bij het schrijfpad: dat controleert of het doel bestaat, en een doel dat daarna wordt verwijderd, wordt gelezen als een onopgeloste verwijzing.

Over de lijn reizen de twee helften als één scalar, <table>:<id>, zodat de values van een record een platte map blijven van logische veldnaam naar scalar en de discriminatorkolom nooit als veld naar boven komt. Dat is de bestaande conventie van het platform voor een zelfbeschrijvende verwijzing (recordfile:<id>, webresource:par_/app.js).

De logische naam van de tabel wordt opgeslagen in plaats van een getal, omdat een numerieke discriminator een index in targetEntities zou zijn — dan zou het herschikken van de doelen in de ontwerper elke opgeslagen rij ongemerkt naar een andere tabel laten wijzen. De eigenaar-kolommen van een record gebruiken wel een numerieke enum, en dat is consequent en niet tegenstrijdig: hun vijf waarden zijn platformconcepten die in code vastliggen, geen lijst die een maker bewerkt.

Elke waarde in targetEntities krijgt een eigen onderliggende relatie, en daardoor biedt het formulier van de tabel waarnaar wordt verwezen een tabblad Gerelateerd voor deze records.

Velden van het type File / Image worden aangelegd als tekstkolom met een verwijzing met schemavoorvoegsel — recordfile:<id> voor een bestand dat in het eigen schema van de omgeving staat, of objectstore:<key> voor een bestand dat groot genoeg is om naar Object Storage te zijn uitgeweken. De bytes worden geüpload naar het eigen bestandseindpunt van het veld in plaats van via de record-API te worden geschreven, en worden geserveerd onder de eigen autorisatie van de record. Welke van de twee opslagplaatsen een bestand bevat, wordt bepaald door de grootte ervan en door niets wat een maker instelt.

Relatie​

VeldTypeVerplichtOpmerkingen
logicalNametekenreeksjaKleine letters snake_case.
typetekenreeksjaOneToMany.
referencedEntitytekenreeksjaDe "een"-kant.
referencingEntitytekenreeksjaDe "veel"-kant (heeft het zoekveld).
lookupFieldtekenreeksjaHet zoekveld op de verwijzende tabel dat de relatie ondersteunt.

Status en reden​

Een status geeft aan waar een record zich in zijn levenscyclus bevindt; een reden zegt in welke variant van die status hij verkeert. Ze reizen met de tabel mee, omdat ze deel uitmaken van wat de maker heeft ontworpen.

🔴 Het is geen keuzeset. Active op een factuur en Active op een contactpersoon zijn niet dezelfde keuze, en ze modelleren als één gedeelde lijst zou betekenen dat het ene hernoemen ook het andere hernoemt.

Status:

VeldTypeVerplichtOpmerkingen
valuegeheel getaljaDe opgeslagen waarde, behouden bij een import: de records van de bronomgeving bevatten haar al, dus Dev en Test moeten het eens zijn over wat ze betekent.
displayNametekenreeksjaHet label.
colortekenreeksneeDe kleur waarin de badge wordt getekend.
icontekenreeksneeHet symbool op de badge.
defaultReasongeheel getalneeWelke van de redenen van deze status een record krijgt die erin terechtkomt. Afwezig betekent de eerste, en daardoor is de instelling optioneel.

Reden:

VeldTypeVerplichtOpmerkingen
stategeheel getaljaDe value van de status waartoe deze reden behoort. Op waarde gekoppeld in plaats van op rij-id, omdat een waarde is wat een record opslaat en wat een export overleeft.
valuegeheel getaljaDe opgeslagen waarde.
displayNametekenreeksjaHet label.
color · icontekenreeksneeZoals bij een status.

Die insluiting is precies de bedoeling: Won en Lost zijn allebei redenen waarom een deal Inactief is, en ze aanbieden terwijl hij Actief is, zou onzin zijn.

Voorbeeld​

{
"logicalName": "par_invoice",
"displayName": "Invoice",
"displayCollectionName": "Invoices",
"publisherPrefix": "par",
"primaryField": "par_name",
"fields": [
{ "logicalName": "par_name", "displayName": "Name", "dataType": "Text", "isPrimary": true, "isRequired": true, "maxLength": 200 },
{ "logicalName": "par_total", "displayName": "Total", "dataType": "Decimal", "precision": 18, "scale": 2 },
{ "logicalName": "par_account", "displayName": "Account", "dataType": "Lookup", "targetEntity": "par_account" }
],
"relationships": [
{ "logicalName": "par_account_invoices", "type": "OneToMany", "referencedEntity": "par_account", "referencingEntity": "par_invoice", "lookupField": "par_account" }
]
}

Versiebeheer​

Oudere schemaversies blijven naast de nieuwe bestaan, zodat al uitgerolde oplossingen blijven valideren nadat het schema is gewijzigd. Is er een brekende wijziging nodig, dan wordt er een nieuwe versie (model-driven-entity@2) gepubliceerd in plaats van deze te bewerken.