# dare / avere
TIPI (id_tipo, testo_tipo)

# acquisto / vendita / prestito / altro
CAUSALI (id_causale, testo_causale)

# cancellato / riscosso / in essere
STATI (id_stato, testo_stato)

# chi è (anagrafica contatti)
UTENTI (id_utente, nome, cognome ... dati_anagrafici ...)

# quando, quanto, tipo movimento, causale movimento, stato movimento, utente
MOVIMENTI (id_movimento, data_movimento, importo_movimento, id_tipo, id_causale, id_stato, id_utente)



in questo modo hai una gestione ottimizzata per fare reports statistici, avendo una tabella senza campi varchars per i movimenti (rapidissima)
Hai inoltre la possibilità di cambiare "tutto senza modificare niente", tutto riferito alle diciture (o dati cliente o altro), niente riferito allo storico dei movimenti


non so è la soluzione migliore ma probabilmente è quella che avrei adottato io soprattutto per il discorso estendibilità o riutilizzo (anagrafica o altro)


[edit]
io aggiungerei anche una tabella STORICO, per avere lo stato dei tempi tra una modifica dello stato di un movimento ed un'altra (quando è stato fatto il prestito, quando è stato riscosso)