Mi chiedo se l'idea sottostante abbia senso per la nostra applicazione web. Mostriamo vari elenchi di entità, che in genere si riferiscono ad altre entità e così via. Nella vista tabella, ci sono colonne che mostrano alcune proprietà dell'entità stessa (come e.name
) e anche delle entità collegate (come e.owner.email
).
Il modo classico è creare DTO contenenti tutte queste colonne e inviarle. Ciò significa che per ogni colonna aggiunta, è necessario apportare una modifica (banale) sul server. C'è anche un sacco di ridondanze, dato che molte entità collegate sono uguali. Ad esempio, e.owner
è quasi sempre lo stesso, in quanto (con alcune eccezioni) tutti possono vedere solo le proprie entità.
Quindi la mia idea era di inviare entità JSONized, in cui i riferimenti vengono sostituiti dai loro ID e inoltre inviare un elenco delle entità referenziate. Tutto questo in modo ricorsivo, quindi per il grafico dell'oggetto
[
{
id: 101,
name: "something1",
company: {
id: 201,
name: "someCompany"
owner: {
id: 301,
firstName: "Bart",
lastName: "Simpson"
email: "[email protected]",
}
}
},
{
id: 102,
name: "something1",
company: {
id: 201,
name: "someCompany"
owner: {
id: 301,
firstName: "Bart",
lastName: "Simpson"
email: "[email protected]",
}
}
},
]
invece di
[
{
id: 101,
name: "something1",
company_name: "someCompany",
company_owner_firstName: "Bart",
company_owner_lastName: "Simpson",
company_owner_email: "[email protected]",
},
{
id: 102,
name: "something2",
company_name: "someCompany",
company_owner_firstName: "Bart",
company_owner_lastName: "Simpson",
company_owner_email: "[email protected]",
},
]
I'd send
{
entities: [
{
id: 101,
name: "something1",
company: 201,
},
{
id: 102,
name: "something2",
company: 201,
}
],
companies: [
{
id: 201,
name: "someCompany"
owner: 301,
}
],
owners: [
{
id: 301,
firstName: "Bart",
lastName: "Simpson"
email: "[email protected]",
}
],
}
e consente al cliente di ri-combinare le cose durante la visualizzazione del risultato. Ciò potrebbe portare a un buon risparmio della larghezza di banda (non visibile in questo piccolo esempio), ma probabilmente è ciò che Content-Encoding: gzip
raggiunge comunque.
Il prossimo passo potrebbe essere la memorizzazione nella cache del client, in modo che vengano inviate solo le entità modificate e / o nuove. Questo potrebbe risparmiare molto di più. Il sovraccarico di implementazione è sicuramente non banale, ma sono sicuro che può essere fatto in un giorno o due.
Le mie domande:
- C'è già qualcuno che sta facendo questo?
- È una buona idea?