2011-09-02 11 views
8

Considerare questo scenario:molti a molti rapporti in JSON

si desidera inviare alcuni dati al client in formato JSON, e non si vuole andare indietro al server. I dati sono composti da 15 insegnanti con 100 studenti. La relazione tra queste entità è molte a molte (ogni studente impara molti insegnanti e ogni insegnante insegna a molti studenti).

Nel client, l'utente viene presentato con l'elenco degli studenti. Al clic di qualsiasi studente, l'elenco dei suoi insegnanti verrebbe presentato all'utente, e al clic di un insegnante verrà presentato l'elenco di tutti gli studenti di quell'insegnante. Ciò si traduce in una navigazione infinita in stile click-through dagli studenti agli insegnanti e vice verca.

Ora, come lei sa, JSON rappresenta solo uno-a-molti in questa forma:

{ "s1" : [ "t1", "t2"], "s2" : [ "t2", "t4" ], "s3" : [ "t1", "t3", "t4"], ...} 

Avete qualche idea su come fare questo?

+0

grande questione, grazie !! – MeV

risposta

11

Dato che JSON non ha un concetto di riferimento, non dovresti aver bisogno di preoccuparti di loro. Ciò che definisce ciò che conta come una relazione tra insegnanti e studenti si trova al di fuori dei dati, cioè è semplicemente una questione di interpretazione durante il runtime, attraverso gli identificatori delle entità.

var faculty = { 
"teachers": { 
    "t1": ["s1","s2","s5"], 
    "t2": ["s2","s7","s9"] 
    }, 
"students": { 
    "s1": ["t1","t2"], 
    "s2": ["t2","t7"] 
    } 
} 

Ad esempio:

alert("Teacher t1's students are: " + faculty.teachers.t1.toString()); 
alert("Student s2's teachers are: " + faculty.students.s2.toString()); 
alert("Student s2's first teacher's students are: " + faculty.teachers[faculty.students.s2[0]].toString()); 
+1

Ma questo implica che ci saranno molti dati ridondanti. Se gli insegnanti erano oggetti in piena regola e il numero di telefono cambia, è possibile che vengano modificati in più punti. Non dovremmo imitare RDMBS in cui tale caso è risolto con una tabella 'join' separata? –

+1

Martore, niente affatto. {.. [snip] ... "t1": {"studenti": ["s1", "s2"], "telefono": "+43 1 58801"}} –

2

È possibile creare una matrice di coppie che descrivono le relazioni come un grafico diretto?

[// from , to 
    ["s1", "t1"], 
    ["s1", "t2"], 
    ["s2", "t2"], 
    ["s2", "t4"], 
    ["t1", "s1"], 
    ["t1", "s2"], 
    ["t1", "s3"], 
    ["t1", "s4"] 
] 

Non sarebbe conciso. Ma descriverà il tuo set di dati.

+0

Questo è un hack. Ma è stato un buon suggerimento @Exianian. Grazie e +1. –