Optimise both read and write performance

If there is a single schema for both readers and writers there tends to be a need to compromise performance.

Typically good write performance requires:

These are all related of course - normalisation is all about avoiding redundant information and redundant information embodies a constraint. A secondary index represents redundant information.

By contrast good read performance tends to require the precise opposite.

Physical independence is supposed to give the best of both worlds. Unfortunately it's wishful thinking to expect compilers to automatically achieve great read and write performance at the same time.

The write schema allows for very simple, inexpensive updates, there's no need for any secondary indexes. The write schema avoids redundancy (clearly because that would involve constraints).

The read schema is optimised for the readers. It might not be normalised (for example joins are cached). May also cache projections, or selections. It may have data duplication - it doesn't matter because it is automatically recalculated by the system.