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:
| Veld | Type | Verplicht | Opmerkingen |
|---|---|---|---|
logicalName | tekenreeks | ja | Met uitgeversvoorvoegsel, in kleine letters snake_case (bijv. par_invoice). |
displayName | tekenreeks | ja | Label in het enkelvoud (bijv. Invoice). |
displayCollectionName | tekenreeks | ja | Label in het meervoud (bijv. Invoices). |
icon | tekenreeks | nee | Pictogramsleutel uit de samengestelde pictogramset van het platform, getoond naast de tabel in de navigatie van een app (§4.4). Laat weg voor het standaardsymbool. |
publisherPrefix | tekenreeks | ja | Kort voorvoegsel in kleine letters (bijv. par). |
primaryField | tekenreeks | ja | Logische naam van het primaire veld (naamveld); moet in fields voorkomen. |
primaryImage | tekenreeks | nee | Logische 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. |
secondaryField | tekenreeks | null | nee | Logische 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. |
hierarchyParentField | tekenreeks | null | nee | Logische 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. |
personField | tekenreeks | null | nee |
constraints | array | nee | Regels 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. |
fields | array | ja | Een of meer velddefinities (zie hieronder). |
relationships | array | nee | Een-op-veel-relaties die worden ondersteund door zoekvelden. |
isAuditEnabled | booleaans | nee | Schakelt het auditen van wijzigingen voor de tabel in (sectie 6.5). Standaard false. |
states | array | nee | De 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. |
reasons | array | nee | De redenen, die elk bij precies één status horen. Zie hieronder. |
statusValueBase | geheel getal | nee | De 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. |
nextStatusValue | geheel getal | nee | De 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
| Veld | Type | Verplicht | Opmerkingen |
|---|---|---|---|
logicalName | tekenreeks | ja | Kleine letters snake_case. |
displayName | tekenreeks | ja | |
dataType | tekenreeks | ja | Een van Text, MultilineText, Integer, Decimal, Boolean, DateTime, Lookup, PolymorphicLookup, File, Image, OptionSet, State, Reason. |
isRequired | booleaans | nee | |
isPrimary | booleaans | nee | True voor het enige primaire veld. |
maxLength | geheel getal | nee | Voor Text (1–4000). |
precision, scale | geheel getal | nee | Voor Decimal (scale ≤ precision ≤ 38). |
targetEntity | tekenreeks | voorwaardelijk | Verplicht wanneer dataType Lookup is; de logische naam van de tabel waarnaar wordt verwezen. |
targetEntities | tekenreeks[] | voorwaardelijk | Verplicht wanneer dataType PolymorphicLookup is; de tabellen waarnaar een waarde mag wijzen, in de volgorde van de kiezer. Minstens twee, geen herhalingen. |
isAuditExcluded | booleaans | nee | Sluit het veld uit van het auditen van wijzigingen wanneer de tabel wordt geaudit (sectie 6.5). Standaard false. |
Velden van het type
PolymorphicLookupworden aangelegd als twee kolommen: de eigenuuid-kolom van het veld met de id van de record, en een zusterkolom<column>_typevan het typetextmet 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 devaluesvan 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
targetEntitieszou 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
targetEntitieskrijgt 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/Imageworden aangelegd als tekstkolom met een verwijzing met schemavoorvoegsel —recordfile:<id>voor een bestand dat in het eigen schema van de omgeving staat, ofobjectstore:<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
| Veld | Type | Verplicht | Opmerkingen |
|---|---|---|---|
logicalName | tekenreeks | ja | Kleine letters snake_case. |
type | tekenreeks | ja | OneToMany. |
referencedEntity | tekenreeks | ja | De "een"-kant. |
referencingEntity | tekenreeks | ja | De "veel"-kant (heeft het zoekveld). |
lookupField | tekenreeks | ja | Het 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:
| Veld | Type | Verplicht | Opmerkingen |
|---|---|---|---|
value | geheel getal | ja | De 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. |
displayName | tekenreeks | ja | Het label. |
color | tekenreeks | nee | De kleur waarin de badge wordt getekend. |
icon | tekenreeks | nee | Het symbool op de badge. |
defaultReason | geheel getal | nee | Welke van de redenen van deze status een record krijgt die erin terechtkomt. Afwezig betekent de eerste, en daardoor is de instelling optioneel. |
Reden:
| Veld | Type | Verplicht | Opmerkingen |
|---|---|---|---|
state | geheel getal | ja | De 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. |
value | geheel getal | ja | De opgeslagen waarde. |
displayName | tekenreeks | ja | Het label. |
color · icon | tekenreeks | nee | Zoals 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.