Modellazione di entità di database relazionali in un linguaggio funzionale

1

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? )

    
posta Matt 12.06.2017 - 15:51
fonte

1 risposta

2

FWIW, la maggior parte degli ORM ha una capacità di

  • Costruisce pigramente un albero di oggetti complessi, definendo proprietà computabili che corrispondono a query correlate;
  • Costruisci (ragionevolmente) alberi di oggetti complessi con ardore, per salvare round-trip quando è noto che i dati relativi sono necessari.

AFAICT puoi usare i futures come interfaccia in entrambi i casi; è il caso impaziente che un futuro si risolva istantaneamente in un oggetto correlato prefetched. Potresti finire per avere bisogno di metodi di ricerca / produzione separati per oggetti pigri e oggetti imprevedibilmente prefissati.

Non tutto può essere precaricato in un round-trip, anche se la maggior parte dei join semplici ed esterni possono esserlo. La logica di decompressione sarà diversa: le righe della tabella piacevole nel caso lazy rispetto ai set di risultati combinati che devono essere ordinati negli oggetti nel caso desideroso.

    
risposta data 12.06.2017 - 17:30
fonte

Leggi altre domande sui tag