Hey Luc,

Our use case is quite a bit different. We treat our database schema as part 
of our applications data model. 
In contrast, it seems that your problem is one of data integration. That's 
a much more difficult
problem to solve.

If I understand correctly, you have a code that generates a database 
specific view (e.g. oracle, sql server)
that maps a vendors schema to your own schema based on a manually specified 
mapping? Seems like
a reasonable solution. 

Unrelated to this demo, I've actually been involved in a research project 
creating a 
similar technique where we describe schemas and their mappings in formal 
logic, then have a compiler that 
can create high performance plans based on logic proofs. Thus you can write 
queries against your common
logical schema and automatically generate plans over a different physical 
schema. Sadly, the project is not
at a state that we can release quite yet. Hopefully one day though.


On Wednesday, January 8, 2014 4:07:01 AM UTC-5, Luc wrote:
>
> Hi, 
>
> After struggling with Hibernate, SQL dsl, then bare SQL for a couple of 
> years we 
> took a radical path away from these approaches. 
>
> We do not in our world own the database models we are dealing with, 
> keeping our heads above water (or mud you might say) has become a 
> survival issue. 
>
> So we took the problem the other way around. How can we make the 
> relational models compliant with our business model ? 
>
> We are in the health industry, a patient is a patient, why do we have to 
> struggle with the fine prints of each vendor's relational model ? 
>
> We implemented and EDN subset library in several SQL db dialects (Oracle, 
> mysql, SqlServer support will come out before spring). 
> Implementing an EDN library is between 250 to 300 lines of SQL code per 
> database type so far. It's purely functional and returns a single column 
> (entity) and a string EDN representation. We just edn/read-string in the 
> code 
> and we get our business entity. What remains are semantic issues with 
> the data itself but this already addressed by a component above this in 
> our product stack. 
>
> To avoid writing the views by hand, we created a viewer generator that 
> creates 
> according to the db dialect a view returning an EDN representation of the 
> business entity as we manipulate it in 
> the code, not as it is defined in the database. 
>
> One view == one business entity. 
>
> The generator is db aware through some protocol magic and can handle 
> different db brands. 
>
> The mapping between the db model and our business model is defined 
> as data. It contains the fields to extract, their types if not strings, 
> the joins, the selection criterias, the db dialect, .... 
> This defines our business model vs the relational model. 
>
> The generator is less than 300 lines of code, entity definitions can be 
> between 50 to 200 lines. 
>
> Add to this the yesql library to wrap queries now in a single file. 
>
> It shrank our sql queries to a ridiculous number per vendor 
> while pushing away the complexity of the mapping of the relational model 
> away from the code as configurable data. 
>
> As for inserts, updates, ... views are of no help here but the generator 
> can bridge the gap by creating sql statements and small field name 
> translation wrappers from the same definition as the views. 
>
> The parameter names we use remain coherent with the business model the 
> code uses. 
> The sql statements to insert, ... are again wrapped by yesql. 
>
> Performançe so far is not an issue, we run our product on small boxes 
> less powerful than our customer's database servers. Shifting the load 
> on the side of the database server made sense in this regard. 
>
> And away from this relational modeling crap. Give the same business domain 
> entities to ten different DBAs and you will get ten relational models each 
> with 
> it's own nit picking subtleties. 
>
> Luc P. 
>
>
> > Hey everyone, 
> > 
> > We've been exploring ways to make working with database code more 
> efficient 
> > and less error prone. 
> > For complex queries, we prefer working directly with SQL. However, like 
> for 
> > many others, a lot of our 
> > queries are very simple and repetitive. For example, retrieving or 
> updating 
> > single rows, or a set of rows 
> > based on a foreign key. 
> > 
> > As an experiment, we wrote a prototype that uses the information_schema 
> > standard to automatically 
> > extract the schema from a database and represent it as clojure code at 
> > compile time. With this, we 
> > were able to synthesize some simple SQL queries. The interesting part of 
> > this is that the code generator 
> > automatically picks up primary key constraints and also performs 
> validation 
> > on table and column names. 
> > All of this is done at compile time. Errors are caught early and the 
> > compiled code uses clojure.java.jdbc 
> > prepared statements. You can find the code and demo here: 
> > 
> > https://github.com/diligenceengine/edl 
> > 
> > I'm personally not a big fan of huge ORM systems, so I don't know where 
> to 
> > go with this, if anywhere. 
> > Though it seems useful for building small macros for common patterns we 
> > have. 
> > 
> > Would love to hear if anyone has thoughts on the technique. 
> > 
> > Alex 
> > 
> > 
> > 
> > -- 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Clojure" group. 
> > To post to this group, send email to clo...@googlegroups.com<javascript:> 
> > Note that posts from new members are moderated - please be patient with 
> your first post. 
> > To unsubscribe from this group, send email to 
> > clojure+u...@googlegroups.com <javascript:> 
> > For more options, visit this group at 
> > http://groups.google.com/group/clojure?hl=en 
> > --- 
> > You received this message because you are subscribed to the Google 
> Groups "Clojure" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an email to clojure+u...@googlegroups.com <javascript:>. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
> > 
> -- 
> Softaddicts<lprefo...@softaddicts.ca <javascript:>> sent by ibisMail from 
> my ipad! 
>

-- 
-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to