Esempio Online Anteprima (solo lettura)
Sorgente PHP: examples/gridds/parent_child.php
Sorgente XML: examples/gridds/parent_child.xml
Sorgente dati: examples/resource/giornate.sql

Un aspetto molto interessante dei ds è la possibilità di effettuare delle relazioni tra di essi, per relazioni si intende l'unione logica tra due o più datasource al fine di instaurare tra loro un legame di dipendenza.
Per spiegare questo concetto nulla risulta essere più efficace di un rapido esempio, supponiamo di avere due tabelle:
giornate: contenente l'elenco di tutte le date in cui si è svolto il campionato italiano di serie A 2008/2009
partite: contenente il dettaglio dei singoli incontri.
Tra le due tabelle esiste una relazione logica uno a molti, ovvero per ogni riga della tabella giornate corrisponderanno n righe della tabella partite. Questa relazione è stata esplicitata inserendo nella tabella partite il campo idgiornata che contiene il corrispettivo valore del campo id della tabella giornate.
In JAMP questa struttura logica si realizza utilizzando due ds, nel caso specifico avremmo dsgiornare e dspartite configurati come segue:

<dsgiornate typeobj="ds" conn="conn6" dsdefault="jamp" dstable="giornate" dskey="id" dsrefresh="dspartite" dslimit="10" />
<dspartite typeobj="ds" conn="conn6" dsdefault="jamp" dstable="partite" dskey="id" dsreferences="dsgiornate" referenceskey="id" foreignkey="idgiornata" />

dsreferences: il nome del ds legato alla tabella padre
referenceskey: il nome del campo di chiave della tabella padre
foreignkey: il nome del campo contenuto nella tabella figlia e da relazionare con il campo chiave della tabella padre(definito nell'attributo referenceskey)

L'inserimento di questi tre soli attributi è sufficiente a stabilire la relazione tra i due ds, bisogna però aggiungere un quarto attributo dsrefresh nel ds padre(dsgiornate) affinchè spostandosi da un record ad un'altro venga effettuato un refresh(inteso come aggiornamento) dei dati della tabella figlia.
deleteoncascate(opzionale): Questo attributo, non inserito nell'esempio, se impostato a true implementata la cancellazione a cascata ovvero cancellando un record dalla tabella padre verranno rimossi anche tutti i record relazionati nella tabella figlia
- Non ci sono limiti nel numero di relazioni implementabili, lo stesso padre può avere n figli, la configurazione sarebbe del tipo:

<ds1 typeobj="ds" .... dskey="id" dsrefresh="ds2,ds3,....dsn" />
<ds2 typeobj="ds" .... dskey="id" dsreferences="ds1" referenceskey="id" foreignkey="idparent" />
<ds3 typeobj="ds" .... dskey="id" dsreferences="ds1" referenceskey="id" foreignkey="idparent" />
<ds4 typeobj="ds" .... dskey="id" dsreferences="ds1" referenceskey="id" foreignkey="idparent" />
............
<dsn typeobj="ds" .... dskey="id" dsreferences="ds1" referenceskey="id" foreignkey="idparent" />

- Si possono implementare anche relazioni a cascata

<ds1 typeobj="ds" .... dskey="id" dsrefresh="ds2" />
<ds2 typeobj="ds" .... dskey="id" dsreferences="ds1" referenceskey="id" foreignkey="idparent" dsrefresh="ds3" />
<ds3 typeobj="ds" .... dskey="id" dsreferences="ds2" referenceskey="id" foreignkey="idparent" dsrefresh="ds4" />
<ds4 typeobj="ds" .... dskey="id" dsreferences="ds3" referenceskey="id" foreignkey="idparent" />