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
-~----------~----~----~----~------~----~------~--~---

Reply via email to