I think that you made the mistake in the first step: you cannot *change* a clojure's map. Thus, you cannot change one particular "snapshot" of person's data. No problem up to this point. You can only create a new map with some data reused. There lies the problem - how to "update the references" to the new map at all the places that link to it. My hunch tells me to use refs for that :) As for any examples, I cannot point you to that. It seems to me that this problem, in my opinion one of the central problems in "real- world" programming, is suspiciously underinvestigated in the world of FP... I am currently developing a DSL for dealing with the same problem, but as it is in the rather early stage of development, no code is released to the public yet.
On Sep 14, 11:34 pm, Brenton <bashw...@gmail.com> wrote: > I am starting to write a large web application using Clojure and > Compojure and am running into some design trouble while designing my > data model. To illustrate my problem I am going to make up some fake > data. Suppose you are writing an Insurance application which has the > tables Policy, Person and Vehicle. A policy has a person that is the > policy holder. A policy also has many vehicles. Each vehicle has a > person that is the primary driver. Most of the time the primary driver > is the same as the policy holder. If I were using one of the usual > object-relational mapping frameworks, (Hibernate, ActiveRecord) when I > load a policy I would get an object graph. If the person who is the > policy holder is the same as the person who is the primary driver of > the vehicle then the loaded Person object would be the same object. If > I change the address of the policy holder the primary driver's address > will also be changed. > > How do people deal with this sort of thing in a Clojure application > (or any other functional language)? At first I thought that it would > be easy and I would just use nested maps. But this causes all kinds of > problems. If I load the data into nested maps I now have two distinct > maps for the same person. If I change one of them, the other is not > updated. If I try to save this map back to the database, which person > map has the correct data? It is also awkward to update the person in > the first place. In Java you would just go policy.getPolicyHolder > ().setAddress("..."). In Clojure you would have to do something like > (assoc policy :holder (assoc (:holder policy) :address "...")). > > I have a feeling that there is a more "functional" way to do this sort > of thing. My question is, how to other people deal with this? The only > thing that I can think of is that I would avoid using nested maps to > model the database associations. I would load the policy into a map. > Then if I need the person, I would load that into a separate map. That > may be the correct functional approach. I was just asking in case > there is some really cool thing that people do that I don't know > about. > > I had a look at clj-record to see how associations where handled. It > looks like nested maps are avoided here. Instead functions are created > to retrieve the associated data. Is the correct way of this this? > > Thank you, > Brenton --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---