Come eseguire la modellazione dei dati quando il modello è parzialmente inizializzato dal DB?

3

Considera la modellazione dei dati in Scala (l'altra lingua è la stessa), spesso vogliamo comporre un modello all'interno di un altro, ad esempio un Post può contenere un campo autore il cui tipo è un User .

Quando recuperiamo i dati da db, potremmo voler recuperare alcune informazioni di base a causa della considerazione prestazionale e completare le altre parti mancanti quando è necessario. L'unico modo che posso fare è rendere quei campi come alcuni Option s nel modello.

Ma questo rende il modello sporco nella semantica e non è comodo da usare poiché questi campi sono effettivamente obbligatori nel modello. Nel caso precedente, ogni post ha un autore, ma non ho altra scelta che implementarlo come opzione.

Qualche consiglio su questo?

    
posta wang zhihao 03.11.2015 - 15:45
fonte

1 risposta

2

Potresti ottenere ciò usando la pigrizia.

scala> def fetchPost(id: Int): (Int, String) = { println("fetching content") ; val userId = 42; (userId, "content of post") }
fetchPost: (id: Int)(Int, String)

scala> def fetchUser(userId: Int): (String, String) = { println("fetching user"); ("firstname", "lastname") }
fetchUser: (userId: Int)(String, String)

scala> class Post(id: Int) {
    | lazy val (userId, content) = fetchPost(id)
    | lazy val user = fetchUser(userId)
    | }
defined class Post

scala> val post1 = new Post(1)
post1: Post = Post@2362f559

scala> post1.user
fetching content
fetching user
res0: (String, String) = (firstname,lastname)

scala> val post2 = new Post(2)
post2: Post = Post@17d919b6

scala> post2.content
fetching content
res1: String = content of post

scala> post2.user
fetching user
res2: (String, String) = (firstname,lastname)

Il recupero viene eseguito su richiesta quando necessario. D'altra parte, non dovresti fare questo tipo di ottimizzazioni finché non hai dati sul rendimento che ti dicono esplicitamente di avere un problema. Soprattutto se riesci a ottenere il tuo database per recuperare tutti i dati da tabelle diverse in una volta sola, potresti essere microtimizzante solo per ottenere prestazioni peggiori alla fine.

    
risposta data 06.11.2015 - 08:25
fonte

Leggi altre domande sui tag