Gestione collegamenti links--relation-between-tables
Un collegamento descrive l’associazione tra una tabella e un’altra.
I tipi di associazioni, noti anche come cardinalità, sono elencati di seguito.
- Cardinalità 1-1: una occorrenza della tabella sorgente può avere al massimo una occorrenza corrispondente della tabella di destinazione.
- Cardinalità 1-N: una occorrenza della tabella sorgente può avere diverse occorrenze corrispondenti della tabella di destinazione, ma una occorrenza della tabella di destinazione può avere al massimo una occorrenza corrispondente della tabella sorgente.
- Cardinalità N-N: una occorrenza della tabella sorgente può avere diverse occorrenze corrispondenti della tabella di destinazione e viceversa.
Nell’interfaccia utente, le cardinalità sono rappresentate da un’icona specifica.
Per le relazioni di join con una tabella o un database di Campaign:
- : Cardinalità 1-1. Ad esempio, tra un destinatario e un ordine corrente. Un destinatario può essere correlato a una sola occorrenza della tabella dell'ordine corrente alla volta.
- : Cardinalità 1-1, join esterno. Ad esempio, tra un destinatario e il suo paese. Un destinatario può essere correlato a una sola occorrenza del paese della tabella. Il contenuto della country table non verrà salvato.
- : Cardinalità 1-N. Ad esempio, tra un destinatario e la tabella delle sottoscrizioni. Un destinatario può essere correlato a diverse occorrenze nella tabella delle sottoscrizioni.
Per le relazioni di join che utilizzano Federated Database Access (FDA):
- : Cardinalità 1-1
- : Cardinalità 1-N
Per ulteriori informazioni sulle tabelle FDA, vedere Accesso a un database esterno.
È necessario dichiarare un collegamento nello schema contenente la chiave esterna della tabella collegata tramite l’elemento principale:
<element name="name_of_link" type="link" target="key_of_destination_schema">
<join xpath-dst="xpath_of_field1_destination_table" xpath-src="xpath_of_field1_source_table"/>
<join xpath-dst="xpath_of_field2_destination_table" xpath-src="xpath_of_field2_source_table"/>
...
</element>
I collegamenti rispettano le seguenti regole:
-
La definizione di un collegamento viene immessa in un
<element>
di tipo link con i seguenti attributi:-
nome: nome del collegamento dalla tabella di origine
-
target: nome dello schema di destinazione
-
etichetta: etichetta del collegamento
-
revLink (facoltativo): nome del collegamento inverso dallo schema di destinazione (dedotto automaticamente per impostazione predefinita)
-
integrità (facoltativo): integrità referenziale dell'occorrenza della tabella di origine rispetto all'occorrenza della tabella di destinazione.
I valori possibili sono:- define: è possibile eliminare l'occorrenza di origine se un'occorrenza di destinazione non vi fa più riferimento
- normal: l'eliminazione dell'occorrenza di origine inizializza le chiavi del collegamento all'occorrenza di destinazione (modalità predefinita). Questo tipo di integrità inizializza tutte le chiavi esterne
- own: l'eliminazione dell'occorrenza di origine determina l'eliminazione dell'occorrenza di destinazione
- owncopy: uguale a own (in caso di eliminazione) o duplica le occorrenze (in caso di duplicazione)
- neutro: nessun comportamento specifico
-
revIntegrity (facoltativo): integrità nello schema di destinazione (facoltativo, "normal" per impostazione predefinita)
-
revCardinality (facoltativo): con il valore "single" compila la cardinalità con il tipo 1-1 (1-N per impostazione predefinita)
-
externalJoin (facoltativo): forza l'outer join
-
revExternalJoin (facoltativo): forza il join esterno sul collegamento inverso
-
-
Un collegamento fa riferimento a uno o più campi dalla tabella di origine alla tabella di destinazione. Non è necessario compilare i campi che compongono il join (elemento
<join>
) perché vengono dedotti automaticamente per impostazione predefinita utilizzando la chiave interna dello schema di destinazione. -
Un indice viene aggiunto automaticamente alla chiave esterna del collegamento nello schema esteso.
-
Un collegamento è costituito da due collegamenti intermedi, in cui il primo viene dichiarato dallo schema di origine e il secondo viene creato automaticamente nello schema esteso dello schema di destinazione.
-
Un join può essere un outer join se viene aggiunto l'attributo externalJoin con il valore "true" (supportato in PostgreSQL).
Esempio: collegamento inverso example-1
Nell’esempio seguente, dichiariamo una relazione 1-N alla tabella dello schema "cus:company":
<srcSchema name="recipient" namespace="cus">
<element name="recipient">
...
<element label="Company" name="company" revIntegrity="define" revLabel="Contact" target="cus:company" type="link"/>
</element>
</srcSchema>
Lo schema generato:
<schema mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:schema">
<element name="recipient" sqltable="CusRecipient">
<dbindex name="companyId">
<keyfield xpath="@company-id"/>
</dbindex>
...
<element label="Company" name="company" revLink="recipient" target="cus:company" type="link">
<join xpath-dst="@id" xpath-src="@company-id"/>
</element>
<attribute advanced="true" label="Foreign key of 'Company' link (field 'id')" name="company-id" sqlname="iCompanyId" type="long"/>
</element>
</schema>
La definizione del collegamento è completata dai campi che compongono il join, ovvero la chiave primaria con il relativo XPath ("@id") nello schema di destinazione e la chiave esterna con il relativo XPath ("@company-id") nello schema.
La chiave esterna viene aggiunta automaticamente in un elemento che utilizza le stesse caratteristiche del campo associato nella tabella di destinazione, con la seguente convenzione di denominazione: nome dello schema di destinazione seguito dal nome del campo associato ("company-id" nel nostro esempio).
Schema esteso del target ("cus:company"):
<schema mappingType="sql" name="company" namespace="cus" xtkschema="xtk:schema">
<element name="company" sqltable="CusCompany" autopk="true">
<dbindex name="id" unique="true">
<keyfield xpath="@id"/>
</dbindex>
<key internal="true" name="id">
<keyfield xpath="@id"/>
</key>
...
<attribute desc="Internal primary key" label="Primary key" name="id" sqlname="iCompanyId" type="long"/>
...
<element belongsTo="cus:recipient" integrity="define" label="Contact" name="recipient" revLink="company" target="nms:recipient" type="link" unbound="true">
<join xpath-dst="@company-id" xpath-src="@id"/>
</element>
</element>
</schema>
È stato aggiunto un collegamento inverso alla tabella "cus:recipient" con i seguenti parametri:
- nome: dedotto automaticamente dal nome dello schema di origine (può essere forzato con l'attributo "revLink" nella definizione del collegamento nello schema di origine)
- revLink: nome del collegamento inverso
- target: chiave dello schema collegato (schema "cus:recipient")
- unbound: il collegamento è dichiarato come elemento di raccolta per una cardinalità 1-N (per impostazione predefinita)
- integrità: "define" per impostazione predefinita (può essere forzato con l'attributo "revIntegrity" nella definizione del collegamento nello schema di origine).
Esempio: collegamento semplice example-2
In questo esempio viene dichiarato un collegamento alla tabella dello schema "nms:address". Il join è un outer join e viene compilato esplicitamente con l'indirizzo e-mail del destinatario e il campo "@address" della tabella collegata ("nms:address").
<srcSchema name="recipient" namespace="cus">
<element name="recipient">
...
<element integrity="neutral" label="Info about email" name="emailInfo" revIntegrity="neutral" revLink="recipient" target="nms:address" type="link" externalJoin="true">
<join xpath-dst="@address" xpath-src="@email"/>
</element>
</element>
</srcSchema>
Esempio: cardinalità univoca example-3
In questo esempio, creiamo una relazione 1-1 alla tabella dello schema "cus:extension":
<element integrity="own" label="Extension" name="extension" revCardinality="single" revLink="recipient" target="cus:extension" type="link"/>
Esempio: collegamento a una cartella example-4
In questo esempio viene dichiarato un collegamento a una cartella (schema "xtk:folder"):
<element default="DefaultFolder('nmsFolder')" label="Folder" name="folder" revDesc="Recipients in the folder" revIntegrity="own" revLabel="Recipients" target="xtk:folder" type="link"/>
Il valore predefinito restituisce l'identificatore del primo file del tipo di parametro idoneo immesso nella funzione "DefaultFolder('nmsFolder')".
Esempio: creare una chiave su un collegamento example-5
In questo esempio, creiamo una chiave su un collegamento (schema "company" to "cus:company") con l'attributo xlink e un campo della tabella ("email"):
<srcSchema name="recipient" namespace="cus">
<element name="recipient">
<key name="companyEmail">
<keyfield xpath="@email"/>
<keyfield xlink="company"/>
</key>
<attribute name="email" type="string" length="80" label="Email" desc="Recipient email"/>
<element label="Company" name="company" revIntegrity="define" revLabel="Contact" target="cus:company" type="link"/>
</element>
</srcSchema>
Lo schema generato:
<schema mappingType="sql" name="recipient" namespace="cus" xtkschema="xtk:schema">
<element name="recipient" sqltable="CusRecipient">
<dbindex name="companyId">
<keyfield xpath="@company-id"/>
</dbindex>
<dbindex name="companyEmail" unique="true">
<keyfield xpath="@email"/>
<keyfield xpath="@company-id"/>
</dbindex>
<key name="companyEmail">
<keyfield xpath="@email"/>
<keyfield xpath="@company-id"/>
</key>
<attribute desc="Email address of recipient" label="Email" length="80" name="email" sqlname="sEmail" type="string"/>
<element label="Company" name="company" revLink="recipient" target="sfa:company" type="link">
<join xpath-dst="@id" xpath-src="@company-id"/>
</element>
<attribute advanced="true" label="Foreign key of link 'Company' (field 'id')" name="company-id" sqlname="iCompanyId" type="long"/>
</element>
</schema>
La definizione della chiave del nome "companyEmail" è stata estesa con la chiave esterna del collegamento "company". Questa chiave genera un indice univoco su entrambi i campi.