Hey,

One thing we have talked about from the beginning is the ability to 
magically migrate objects from one schema to another on a per-object 
basis. This allows giant databases to be lazily migrated, thus 
minimizing downtime. It might also make it easier to restore backups 
with old data in old versions into a new system.

The basic need for this to work, AFAICT, is that EntityType needs to 
have a schema version. I have now implemented an algorithm that for each 
EntityType creates a hash for it, which includes the name, all 
properties and all associations. Properties may point to values, which 
in turn may have values, so they are calculated recursively. In the end 
you get a SHA hash for all of it which is then BASE64-encoded. Here's an 
example:
Bn6JdWca04SD4xF7Ckut0JvCxQI=

If you change the name, any property, or any value of a property, and so 
on, the hash will change, and so this can be detected simply by 
comparing these strings.

This means that if for each object we store not only the state and type, 
but also this version string, it should be possible for us to later 
detect that the state is out of date, and then perform migration of it 
by applying rules to transform it to a new version. This migration might 
be done as the entity is loaded, or through batchprocessing of an entire 
database. Both would have pro's and con's.

If you wanna take a look at this, you can run 
EntityTypeSerializerTest.testEntityTypeSerializer() and look at the 
generated version. Try changing the TestEntity or any of its values and 
see what happens!

One question is where to hook in migration services. This should 
probably not be done in the EntityStore, but rather be something that 
the UoW layer does. But how? Any ideas are welcome.

I'm really excited by this! Being able to easily perform schema 
migrations as the system evolves is one of the truly enabling features 
of an "Agile framework", I think, and this is an important milestone 
towards that.

/Rickard

_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to