openEHR full-stack platform
Is an openEHR CDR without integrated forms a developer’s nightmare? Anyone who has worked with openEHR knows the power of its two-level data model. But they also know the friction: forcing developers to abandon their familiar daily tools, reinvent the wheel for UIs, and grapple with complex data storage.
How can we bridge the gap between openEHR’s complexity and standard rapid application development?
What if we could use:
- the tools most developers are already familiar with and use daily
- existing development approaches
- existing tools and frameworks for UI
What if we didn't have to reinvent the wheel for openEHR projects?
openEHR uses a two-level data model. Does a two-level openEHR data model require a two-level storage model? Can we save openEHR data using a standard relational model?
I remember Thomas' remark that we would need 10000+ tables. I agreed. But what if tables are generated and migration is handled using tools like Liquibase?
- Standard SQL tools and frameworks could be used.
- Use SQL for stored data.
- Having a 100% relational schema.
However a pure SQL approach lacks constructs like inheritance, logic in triggers, and events (it has them, but they are not powerful enough). In short, it lacks the object-oriented constructs that make complex development manageable. Forcing SQL to do too much wasn't productive.
Instead of treating archetypes as SQL, I tried treating archetypes as code.
My first pick was Jmix.io. It is a rapid application development platform with everything included. It includes Jmix Studio to customize the UI.
I also tried:
- https://www.odoo.com/
- https://orm.drizzle.team/
- https://typeorm.io/
- https://formkit.com/
- https://frappe.io/framework
So far, Jmix is the best suited full-stack platform for the complexity we are dealing with in openEHR.
I'm currently researching graph databases for storing openEHR data. I'm making great progress with ArcadeDB.
A few screenshots of the code (all the code is generated, not handwritten):
Jmix


Drizzle


ArcadeDB

This can be queried using the following SQL:

