Il tuo modello di dominio contiene un set di oggetti. Sono qui per presentare un progetto collaterale, ma ho un progetto di lavoro molto più complicato che sta cadendo in ginocchio perché non ho fatto una buona separazione del database e del dominio.
In questo caso, l'oggetto è chiamato CyclingRecord.
Seguendo Onion Architecture , gli oggetti dominio non sanno nulla della loro persistenza. Tuttavia, ognuno di questi oggetti corrisponde a una voce in un datastore (potenzialmente un database, potenzialmente un file). L'ID riga non fa assolutamente parte dell'oggetto dominio e quindi non ha alcuna attività da memorizzare nell'oggetto dominio.
data CyclingRecord = CyclingRecord { date :: Day,
distance :: Float,
time :: Integer,
description :: Maybe String }
In un linguaggio che impone una strong immutabilità (come Haskell e Clojure), identità e valore sono sinonimi. Inoltre, non c'è motivo per cui non si possa registrare più di una corsa in un giorno. Quindi, l'intero disco descrive completamente una corsa.
Quindi, se modifico un record nel dominio, quando passo gli oggetti modificati di nuovo all'infrastruttura del database, come faccio a comunicare al database che è necessario aggiornare un particolare record invece di cancellare un record esistente?
(la stessa idea dovrebbe essere estensibile in modo che io possa avere un'applicazione che manipola potenzialmente molti record in una volta sola e poi li rimanda tutti al database. Operazioni offline o sincronizzazione o semplicemente evitando attività eccessive del disco)
A meno che la risposta corretta sia effettivamente fare qualcosa come un identificatore unico per ogni corsa. Forse un UUID. Forse aggiungi un "contatore del giorno" al record. Rendilo intrinsecamente parte di un giro in bicicletta e poi fai in modo che il database dipenda da esso invece di un ID riga separato.