Data se obvykle rozdělují na úlomky způsobem, který vůbec umožňuje vyhnout se cross-server JOINS. Protože tato operace je náročná a drahá. Pokud je váš příklad hypotetický, doporučil bych rozdělit všechna data podle pole user_id nebo user_group_id.
Například shard A bude obsahovat všechny tabulky s informacemi od uživatelů, které user_id % 3 =0, shard B - které user_id % 3 =1, shard C - které user_id % 3 =2. Takže většina potřebných JOINů bude uvnitř jednoho shardu. Pro některé složité dotazy mezi servery můžete mít společné úložiště NO-SQL jako memcached nebo Redis, které bude mít kopie potřebných dat ze všech shardů (samozřejmě to není úplná kopie všech tabulek). Taková úložiště lze snadno replikovat na tolik serverů, kolik potřebujete. Takto fungují projekty s vysokým zatížením.