Doctrine Extension to support horizontal sharding in the Doctrine ORM.
Implement sharding inside Doctrine at a level that is as unobtrusive to the developer as possible.
Problems to tackle:
Version 1: DBAL 2.3 (Multi-Tenant Apps)
1. ID Generation support (in DBAL + ORM done)
2. Multi-Tenant Support: Either pick a global metadata database or exactly one shard.
3. Fan-out queries over all shards (or a subset) by result appending
Version 2: ORM related (complex):
4. ID resolving (Pick shard for a new ID)
5. Query resolving (Pick shards a query should send to)
6. Shard resolving (Pick shards an ID could be on)
7. Transactions
8. Read Only objects
Sharded tables require the sharding-distribution key as one of their columns. This will affect your code compared to a normalized db-schema. If you have a Blog <-> BlogPost <-> PostComments entity setup sharded by blog_id
then even the PostComment table needs this column, even if an "unsharded", normalized DB-Schema does not need this information.
Assumptions:
SQL Azure is a special case, points 1, 2, 3, 4, 7 and 8 are partly handled on the database level. This makes it a perfect test-implementation for just the subset of features in points 5-6. However there need to be a way to configure SchemaTool to generate the correct Schema on SQL Azure.
More features are necessary to implement sharding on the PHP level, independent from database support:
These are easier to support as you have some value to determine the shard id for the whole request very early on. Here also queries can always be limited to a single shard.
This strategy requires access to multiple shards in a single request based on the data accessed.