Sto lavorando su un progetto Scala che usa DynamoDB per la persistenza, e lo fa modellando i record come case classes.
Questo sta diventando sempre più relazionale, il che significa che abbiamo classi come questa:
UserRecord(
id="1",
name="Matt",
friendIds=Seq("2", "3")
)
che vengono poi convertiti in un oggetto business effettuando alcune chiamate di database aggiuntive, per produrre qualcosa che assomigli a questo:
User(
id="1",
name="Matt",
friends=Seq(
User(id="2", ...),
User(id="3", ...)
)
)
Il resto del codice tratta quindi con User
e non con UserRecord
.
Questo è problematico per alcuni motivi:
- Non tutti i percorsi di codice richiedono effettivamente gli oggetti Utente nell'elenco
friends
, quindi è una perdita di tempo e la capacità del database di eseguire le letture ogni volta - Non funziona con le strutture ricorsive (se due utenti fossero amici, allora continuerebbe a fare richieste per sempre)
Un'idea che ho avuto è stata quella di rendere i rapporti futures pigri, in modo che le chiamate al database extra vengano fatte solo quando vi si accede, ma non sono sicuro che questo sia idiomatico in quanto sembra introdurre molta complessità alle nostre semplici case classes che sono attualmente molto facile da usare.
Esiste un approccio generale per risolvere questo tipo di problema nei linguaggi funzionali, o anche in Scala in particolare?
(domanda correlata, che ha un'interessante serie di risposte ma in realtà non ha risolto questo problema: Perché non avrei bisogno di un ORM in un linguaggio funzionale come Scala? )