Zwykle dane dzielą się na fragmenty w sposób, który pozwala w ogóle uniknąć JOINS między serwerami. Ponieważ ta operacja jest trudna i kosztowna. Jeśli twój przykład jest hipotetyczny, polecam podzielić wszystkie dane według pola user_id lub user_group_id.
Na przykład shard A będzie zawierał wszystkie tabele z informacjami od użytkowników, które user_id % 3 =0, shard B - który user_id % 3 =1, shard C - który user_id % 3 =2. Tak więc większość potrzebnych JOINS będzie w jednym shard. W przypadku niektórych złożonych zapytań międzyserwerowych możesz mieć wspólny magazyn NO-SQL, taki jak memcached lub Redis, który będzie zawierał kopie potrzebnych danych ze wszystkich fragmentów (oczywiście nie jest to pełna kopia wszystkich tabel). Takie magazyny można łatwo replikować na tyle serwerów, ile potrzebujesz. Tak działają projekty z dużym obciążeniem.