Aller au contenu principal

Via JSON

Actito vous donne la possibilité de définir vous-même la structure de votre table. La création de votre table personnalisée passe par la mise en place d'un fichier de définition.

Le fichier de définition pour créer une "Table personnalisée" est un fichier de type JSON ("exemple.json"), ce qui correspond à un fichier texte qui contient un JSON.

A savoir

Un JSON est un format de données qui permet de représenter de l'information structurée (à l’instar du XML).

Toute création ou modification d'une table du modèle de données devra obligatoirement passer par ce format.

Si vous êtes peu familier avec ce format, il vous est possible de valider votre code avec l'aide du site suivant : https://jsonlint.com/

Pour créer votre propre table, votre fichier JSON peut être créé en amont ou crée/modifié depuis l'interface via l'éditeur de JSON intégré.

Cliquez sur "Créer une table", puis choisissez l'option "À partir d'un JSON", disponible dans chaque onglet, à côté des templates.

À partir d'un JSON

L'onglet depuis lequel vous importez le JSON n'a pas d'importance : le type de la table devra être déterminé dans la structure du fichier.

Vous devrez d'abord renseigner l'entité de la table.

Choix de l'entité

attention

Le choix de cet entité est important car il n'est pas modifiable par la suite. Il est conseillé dans la majorité des cas d'avoir toutes les tables d'un même modèle de données liées à la même entité.

Cliquez sur "Charger depuis mon ordinateur" pour ouvrir une fenêtre modale. Vous serez invité à charger le fichier de définition au format JSON que vous aurez préalablement préparé. Il est également possible de modifier directement depuis l'interface le JSON inséré, voire de le créer de zéro depuis l'éditeur de JSON (ou, l'y copier).

JSON Editor

L'éditeur vous indiquera si votre JSON ne respecte pas la nomenclature d'un JSON.

Cliquez sur "Créer" pour lancer la création de la table. Les éventuelles erreurs rencontrées au moment de la création de la table seront affichées, cela vous permettra de corriger ce qui ne va pas dans le JSON.

Erreur dans le JSON

Composition du "Fichier de Définition"

Pour créer votre "Table personnalisée", vous devrez fournir un "fichier de définition" en JSON qui devra contenir une série d’informations :

  • Le type de table : Interaction, Données liées ou Référentiel ; le type de table définit le comportement de votre Table. Pour plus d'informations à ce sujet, nous vous invitons à parcourir la page "Comprendre les différents types de tables".
  • Le lien entre cette Table et sa table mère (Profil ou autre Table personnalisée)
  • Les différents champs de cette Table, leur type et leurs paramètres spécifiques (comme pour la création des attributs d’une table de profils)

Certaines de ces informations seront obligatoires, d’autres seront optionnelles. De plus, elles auront potentiellement certaines contraintes à respecter.

Pour plus d'informations à propos des typages et des contraintes propres à chacun des champs, nous vous invitons à consulter la page "Structurer votre fichier de définition JSON".

Description des informations constituant votre fichier de définition

Pour créer votre table personnalisée du modèle de données, il sera nécessaire de définir sa structure par le biais d'un fichier JSON.

Ce fichier JSON doit contenir une série d’informations. Certaines de ces informations sont obligatoires, d’autres sont optionnelles. De plus, elles peuvent avoir certaines contraintes à respecter, soit au niveau de leur typage, soit au niveau des valeurs possibles.

astuce

La structure du fichier JSON est la même que le payload des appels API effectués pour créer une table.

Vous pouvez trouver un guide détaillé sur le portail des développeurs.

Illustration d'un fichier JSON complet

Le fichier suivant fournit une illustration du format que prend un fichier contenant tous les paramètres possibles, avec des valeurs d'exemple.

Illustration visuelle d'un fichier de définition JSON

{
"name": "OnlineOrders",
"entityName": "entity",
"type": "INTERACTIONS",
"primaryKeyAttribute": "orderId",
"creationTimeAttribute": "orderMoment",
"compositeKey": null,
"bigTable": false,
"attributes": [
{
"name": "orderId",
"valueType": "STRING",
"mandatory": true,
"indexed": true,
"unique": true,
"valueRestriction": {
"minLength": 20,
"maxLength": 20
}
},
{
"name": "storeId",
"valueType": "LONG",
"mandatory": true,
"indexed": true,
"unique": false,
"valueRestriction": null
},
{
"name": "customerId",
"valueType": "LONG",
"mandatory": true,
"indexed": true,
"unique": false,
"valueRestriction": null
},
{
"name": "orderMoment",
"valueType": "TIMESTAMP",
"mandatory": true,
"indexed": true,
"unique": false,
"valueRestriction": null
},
{
"name": "amount",
"valueType": "NUMBER",
"mandatory": true,
"indexed": false,
"unique": false,
"valueRestriction": null
},
{
"name": "status",
"valueType": "STRING",
"mandatory": true,
"indexed": true,
"unique": false,
"valueRestriction": {
"acceptedValues": [
"NEW",
"SHIPPING",
"SHIPPED",
"CANCELED"
]
}
}
],
"valueAttribute": "amount",
"foreignKeys": [
{
"name": "link-to-customer",
"attribute": "customerId",
"reference": {
"tableType": "PROFILE_TABLE",
"tableId": "97",
"attribute": "customerId"
},
"onDelete": "CASCADE"
},
{
"name": "link-to-store",
"attribute": "storeId",
"reference": {
"tableType": "CUSTOM_TABLE",
"tableId": "d4d85214-66d4-4072-b98b-a86c9253b980",
"attribute": "storeId"
},
"onDelete": "CASCADE"
}
],
"eventsToTrigger": [
{
"name": "shipped-online-order",
"triggerRules": [
{
"onOperation": "UPDATE",
"onAnyAttribute": [
"status"
],
"onMatchingState": {
"stateBeforeOperation": {
"logicalOperator": "AND",
"predicates": [
{
"attribute": "status",
"operator": "!=",
"value": "SHIPPED"
}
]
},
"stateAfterOperation": {
"logicalOperator": "AND",
"predicates": [
{
"attribute": "status",
"operator": "=",
"value": "SHIPPED"
}
]
}
}
}
]
}
],
"cleaningRules": {
"oldestRecordsRule": {
"numberOfRecordsToKeep": 200000
}
},
"displayOptions": {
"displayName": "Online Orders",
"description": "The table that hosts the orders from an online store. Those orders are linked to the Customers profile table.",
"forAttributes": [
{
"name": "orderId",
"description": "The unique id of the order",
"displayName": "Online Orders ID"
},
{
"name": "storeId",
"description": "The unique id of the online store on which the order has been created.",
"displayName": "Store ID"
},
{
"name": "customerId",
"description": "The unique id of customer who has created the order.",
"displayName": "Customer ID"
},
{
"name": "orderMoment",
"description": "The moment when the order has been created",
"displayName": "Order Moment"
},
{
"name": "amount",
"description": "The amount of the order",
"displayName": "Amount"
},
{
"name": "status",
"description": "The status of the order",
"displayName": "Status"
}
],
"forEvents": [
{
"name": "shipped-online-order",
"displayName": "Shipped Online Order"
}
],
"layout": {
"defaultAttributes": [
"orderId",
"customerId",
"amount",
"status"
],
"sections": [
{
"displayName": "Identifiers",
"attributes": [
"orderId",
"customerId",
"storeId"
]
},
{
"displayName": "Other attributes",
"attributes": [
"amount",
"status",
"orderMoment"
]
}
]
}
}
}

Typage des champs

Selon leur typage, les champs devront respecter certaines contraintes :

  • STRING : séquence de caractères [a-z, A-Z, 0-9]

    • le nombre maximum de caractères pour le typage STRING est de 255. Cela peut être modifié avec un paramètre "typeValidator" (voir le tableau ci-dessus)
  • LONG :

    • un entier de 64bits

    • valeur maximale : 9223372036854775808

    • valeur minimale: -9223372036854775808

    • pas d’espace, ni de point, ni de virgule

  • BOOLEAN : respecter les valeurs suivantes “true” ou “false”

  • DATE : chaine de caractères répondant à un des formats suivants :

    • YYYYMMDD

    • YYYY-MM-DD

    • dd/MM/yyyy

  • TIMESTAMP : chaine de caractères répondant à un des formats suivants :

    • YYYYMMDD *

    • YYYY-MM-DD *

    • dd/MM/yyyy *

    • YYYYMMDDhhmmss

    • YYYY-MM-DD hh:mm:ss

    • dd/MM/yyyy HH:mm:ss

    • MM/dd/yyyy hh:mm:ss AM|PM

* si pas de valeur pour hhmmss, seront ajoutées les valeurs 00:00:00

  • NUMERIC :

    • le séparateur doit être un .

    • pas de limite de nombre de caractère

A savoir

En plus du typage général, il existe un typage avancé pour certains champs, afin de s'assurer que leur format corresponde au format attendu par Actito.

Il s'agit des types "EMAIL_ADDRESS","SEX","COUNTRY","LANGUAGE","PHONE_NUMBER","CIVIL_STATE". La syntaxe imposée pour ces types est détaillée dans la page "Utiliser les attributs prédéfinis".

Pour imposer qu'un champ de votre table corresponde à un de ces types, il sera nécessaire de le spécifier dans le paramètre "objectType".

Index de la table

A la création d’un champ, un index peut être utilisé pour aider Actito à trouver et trier les données plus rapidement.

Qu’est-ce que l'index ?

Un index stocke l’emplacement des enregistrements sur la base des champs qui ont été indexés. Une fois qu’Actito a obtenu l’emplacement à partir de l’index, il peut extraire les données en accédant directement à l’emplacement approprié. Ainsi, pour trouver des données, le fait d’avoir utilisé un index permet d’être sensiblement plus rapide.

Il est donc utile d’indexer des champs sur lesquels des recherches, des tris ou des ciblages sont fréquemment effectuées, ou à tout champ qui est associé à d’autres tables (clé de rapprochement avec l’autre table)

Par exemple, il est pertinent d’indexer les champs suivant d’une table : business key + foreign key + date de création.

Attention

Si les champs indexés peuvent accélérer les recherches et ciblages, ils peuvent aussi ralentir les performances lorsque des données sont créés ou mises à jour.

En effet, dans ces cas-là, Actito va devoir mettre à jour tous les index de la table. Il faut donc limiter le nombre de champs indexés dans une table.

Une table personnalisée ne peut pas dépasser 15 champs indexés.

Veuillez noter qu'un champ "unique" sera automatiquement indexé et que les champs "id", "creationMoment" et "updateMoment" sont créés automatiquement et indexés par défaut.