Exemples
Extension d'une table
Pour étendre la table des destinataires de schéma nms:recipient, la procédure est la suivante :
-
Créez le schéma d'extension (cus:extension) avec les données suivantes :
<srcSchema mappingType="sql" name="extension" namespace="cus" xtkschema="xtk:srcSchema" extendedSchema="nms:recipient"> <enumeration basetype="string" default="area1" name="area"> <value label="Zone 1" name="area1"/> <value label="Zone 2" name="area2"/> </enumeration> <element name="extension"> <dbindex name="area"> <keyfield xpath="location/@area"/> </dbindex> <attribute label="Code fidélité" name="fidelity" type="long"/> <element name="location"> <attribute name="area" label="Zone d'achat" type="string" length="50" enum="area"/> </element> </element> </srcSchema>
Dans cet exemple, on ajoute un champ indexé (fidelity) et on complète l'élément location (déjà existant dans le schéma nms:recipient) avec un champ énuméré (area).
N'oubliez pas d'ajouter l'attribut extendedSchema pour référencer le schéma d'extension.
-
Vérifiez que le schéma étendu est bien le schéma nms:recipient et que les données ajoutées sont bien présentes :
<schema dependingSchemas="cus:extension" mappingType="sql" name="recipient" namespace="nms" xtkschema="xtk:schema"> ... <enumeration basetype="string" default="area1" name="area"> <value label="Zone 1" name="area1"/> <value label="Zone 2" name="area2"/> </enumeration> ... <element autopk="true" name="recipient" sqltable="NmsRecipient"> <dbindex name="area"> <keyfield xpath="location/@area"/> </dbindex> ... <attribute belongsTo="cus:extension" label="Code fidélité" name="fidelity" sqlname="iFidelity" type="long"/> <element name="location"> ... <attribute enum="area" label="Zone d'achat" length="50" name="area" sqlname="sArea" type="string"/> </element> ... </element> </schema>
Le script SQL généré à partir de l'assistant de mise à jour de la base est le suivant :
ALTER TABLE NmsRecipient ADD iFidelity INTEGER; UPDATE NmsRecipient SET iFidelity = 0; ALTER TABLE NmsRecipient ALTER COLUMN iFidelity SET NOT NULL;ALTER TABLE NmsRecipient ALTER COLUMN iFidelity SET Default 0; ALTER TABLE NmsRecipient ADD sArea VARCHAR(50); CREATE INDEX NmsRecipient_area ON NmsRecipient(sArea);
Table liée de collection
Cette section présente le mode de création d'une table des commandes liée à la table des destinataires avec une cardinalité 1-N.
Schéma source de la table des commandes :
<srcSchema label="Commande" name="order" namespace="cus" xtkschema="xtk:srcSchema"> <element autopk="true" name="order"> <compute-string expr="@number" + '(' + ToString(@date) + ')'/> <attribute label="Numéro" length="128" name="number" type="string"/> <attribute desc="Date de commande" label="Date" name="date" type="datetime" default="GetDate()"/> <attribute desc="total de la commande" label="Total" name="total" type="double"/> <element label="Destinataire" name="recipient" revDesc="Commandes associées à ce destinataire" revIntegrity="own" revLabel="Commandes" target="nms:recipient" type="link"/> </element> </srcSchema>
La table est de type autopk afin de créer automatiquement une clé primaire auto-générée qui sera utilisée par défaut par la jointure du lien sur la table des destinataires.
Schéma généré :
<schema label="Commande" mappingType="sql" name="order" namespace="cus" xtkschema="xtk:schema"> <element autopk="true" label="Commande" name="order" sqltable="CusOrder"> <compute-string expr="ToString(@date) + ' - ' + @number"/> <dbindex name="id" unique="true"> <keyfield xpath="@id"/> </dbindex> <key internal="true" name="id"> <keyfield xpath="@id"/> </key> <dbindex name="recipientId"> <keyfield xpath="@recipient-id"/> </dbindex> <attribute desc="Clé primaire interne" label="Clé primaire" name="id" sqlname="iOrderId" type="long"/> <attribute label="Numéro" length="128" name="number" sqlname="sNumber" type="string"/> <attribute desc="Date de commande" label="Date" name="date" sqlname="tsDate" type="datetime"/> <attribute desc="total de la commande" label="Total" name="total" sqlname="Total" type="double"/> <element label="Destinataire" name="recipient" revLink="order" target="nms:recipient" type="link"> <join xpath-dst="@id" xpath-src="@recipient-id"/> </element> <attribute advanced="true" label="Clé étrangère du lien 'Destinataire' (champ 'id')" name="recipient-id" sqlname="iRecipientId" type="long"/> </element> </schema>
Le script SQL de création de la table est le suivant :
CREATE TABLE CusOrder(dTotal DOUBLE PRECISION NOT NULL Default 0, iOrderId INTEGER NOT NULL Default 0, iRecipientId INTEGER NOT NULL Default 0, sNumber VARCHAR(128), tsDate TIMESTAMP Default NULL); CREATE UNIQUE INDEX CusOrder_id ON CusOrder(iOrderId); CREATE INDEX CusOrder_recipientId ON CusOrder(iRecipientId); INSERT INTO CusOrder (iOrderId) VALUES (0);
L'ordre SQL INSERT INTO en fin de script permet d'insérer un enregistrement d'identifiant à 0 afin de simuler les jointures externes.
Table d'extension
Une table d'extension permet d'étendre le contenu d'une table existante dans une table liée de cardinalité 1-1.
Le principe de la table d'extension est d'éviter les limitations du nombre de champs supportés dans une table ou encore d'optimiser la place occupée par les données car celles-ci sont consommées à la demande.
Créer le schéma de la table d'extension (cus:feature) :
<srcSchema mappingType="sql" name="feature" namespace="cus" xtkschema="xtk:srcSchema"> <element autopk="true" name="feature"> <attribute label="Enfants" name="children" type="byte"/> <attribute label="Célibataire" name="single" type="boolean"/> <attribute label="Prénom du conjoint" length="100" name="spouseFirstName" type="string"/> </element> </srcSchema>
Créer un schéma d'extension sur la table des destinataires pour ajouter le lien de cardinalité 1-1 :
<srcSchema extendedSchema="nms:recipient" label="Destinataire" mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:srcSchema"> <element name="recipient"> <element desc="Features" integrity="own" label="Propriétés" name="feature" revCardinality="single" revLink="recipient" target="cus:feature" type="link"/> </element> </srcSchema>
La définition du lien entre la table des destinataires et la table d'extension doit être renseignée à partir du schéma qui possède la clé étrangère.
Le script SQL de création de la table d'extension est le suivant :
CREATE TABLE CusFeature( iChildren NUMERIC(3) NOT NULL Default 0, iFeatureId INTEGER NOT NULL Default 0, iSingle NUMERIC(3) NOT NULL Default 0, sSpouseFirstName VARCHAR(100)); CREATE UNIQUE INDEX CusFeature_id ON CusFeature(iFeatureId); INSERT INTO CusFeature (iFeatureId) VALUES (0);
Le script SQL de mise à jour de la table des destinataires est le suivant :
ALTER TABLE NmsRecipient ADD iFeatureId INTEGER; UPDATE NmsRecipient SET iFeatureId = 0; ALTER TABLE NmsRecipient ALTER COLUMN iFeatureId SET NOT NULL; ALTER TABLE NmsRecipient ALTER COLUMN iFeatureId SET Default 0; CREATE INDEX NmsRecipient_featureId ON NmsRecipient(iFeatureId);
Table d'Overflow
Une table d'Overflow est une table d'extension (cardinalité 1-1), mais la déclaration du lien vers la table à étendre est renseignée dans le schéma de la table d'Overflow.
C'est la table d'Overflow qui possède la clé étrangère vers la table à étendre : on ne modifie donc pas la table à étendre. La relation entre les deux tables est la valeur de la clé primaire de la table à étendre.
Créer le schéma de la table d'Overflow (cus:overflow) :
<srcSchema label="Overflow" name="overflow" namespace="cus" xtkschema="xtk:srcSchema"> <element name="overflow"> <key internal="true" name="id"> <keyfield xlink="recipient"/> </key> <attribute label="Enfants" name="children" type="byte"/> <attribute label="Célibataire" name="single" type="boolean"/> <attribute label="Prénom du conjoint" length="100" name="spouseFirstName" type="string"/> <element label="Client" name="recipient" revCardinality="single" revIntegrity="own" revExternalJoin="true" target="nms:recipient" type="link"/> </element> </srcSchema>
La clé primaire de la table d'Overflow est le lien vers la table à étendre (schéma "nms:recipient" dans notre exemple).
Le script SQL de création de la table est le suivant :
CREATE TABLE CusOverflow(iChildren NUMERIC(3) NOT NULL Default 0, iRecipientId INTEGER NOT NULL Default 0, iSingle NUMERIC(3) NOT NULL Default 0, sSpouseFirstName VARCHAR(100)); CREATE UNIQUE INDEX CusOverflow2_id ON CusOverflow2(iRecipientId);
Table de relation
Une table de relation permet de lier deux tables avec une cardinalité N-N. Cette table ne contient que les clés étrangères des tables à lier.
Exemple d'une table de relation entre les groupes (nms:group) et les destinataires (nms:recipient).
Schéma source de la table de relation :
<srcSchema name="rcpGrpRel" namespace="cus"> <element name="rcpGrpRel"> <key internal="true" name="id"> <keyfield xlink="rcpGroup"/> <keyfield xlink="recipient"/> </key> <element integrity="neutral" label="Destinataire" name="recipient" revDesc="Groupes dont fait partie ce destinataire" revIntegrity="own" revLabel="Groupes" target="nms:recipient" type="link"/> <element integrity="neutral" label="Groupe" name="rcpGroup" revDesc="Destinataires du groupe" revIntegrity="own" revLabel="Destinataires" revLink="rcpGrpRel" target="nms:group" type="link"/> </element> </srcSchema>
Le schéma généré est le suivant :
<schema mappingType="sql" name="rcpGrpRel" namespace="cus" xtkschema="xtk:schema"> <element name="rcpGrpRel" sqltable="CusRcpGrpRel"> <compute-string expr="ToString([@rcpGroup-id]) + ',' + ToString([@recipient-id])"/> <dbindex name="id" unique="true"> <keyfield xpath="@rcpGroup-id"/> <keyfield xpath="@recipient-id"/> </dbindex> <key internal="true" name="id"> <keyfield xpath="@rcpGroup-id"/> <keyfield xpath="@recipient-id"/> </key> <dbindex name="rcpGroupId"> <keyfield xpath="@rcpGroup-id"/> </dbindex> <dbindex name="recipientId"> <keyfield xpath="@recipient-id"/> </dbindex> <element integrity="neutral" label="Destinataire" name="recipient" revLink="rcpGrpRel" target="nms:recipient" type="link"> <join xpath-dst="@id" xpath-src="@recipient-id"/> </element> <attribute advanced="true" label="Clé étrangère du lien 'Destinataire' (champ 'id')" name="recipient-id" sqlname="iRecipientId" type="long"/> <element integrity="neutral" label="Groupe" name="rcpGroup" revLink="rcpGrpRel" target="nms:group" type="link"> <join xpath-dst="@id" xpath-src="@rcpGroup-id"/> </element> <attribute advanced="true" label="Clé étrangère du lien 'Groupe' (champ 'id')" name="rcpGroup-id" sqlname="iRcpGroupId" type="long"/> </element> </schema>
Le script SQL de création de la table est le suivant :
CREATE TABLE CusRcpGrpRel( iRcpGroupId INTEGER NOT NULL Default 0, iRecipientId INTEGER NOT NULL Default 0); CREATE UNIQUE INDEX CusRcpGrpRel_id ON CusRcpGrpRel(iRcpGroupId, iRecipientId); CREATE INDEX CusRcpGrpRel_recipientId ON CusRcpGrpRel(iRecipientId);