Мы занимаемся этим уже некоторое время (хотя не с symfony и доктриной, но проблемы остаются теми же) - мы начали с одной огромной базы данных и внедрили «идентификатор среды» для каждой строки в каждой из таблиц.Таким образом, миграция схемы была простой: весь код был унифицирован, поэтому изменение схемы было одним изменением кода и схемы.
Это, однако, приводило к проблемам со скоростью (большие таблицы), гибкостью (перемещение / резервное копирование и т. Д. Большими).наборы данных намного интенсивнее, чем множество небольших), и, конечно, более легко разрушаемые среды, поскольку один сбой приведет к сбою каждого набора данных в системе ...
Затем мы переключились на несколько баз данных;каждая среда имеет свою схему.Используя миграции, предоставляемые с Doctrine (в нашем случае 1), мы можем быстро обновить все приложение или только одну среду.Кроме того, возможность перемещать определенные изменения между арендаторами позволяет повысить точность в скорости и оптимизации.
Мой совет: создайте одно ядро, которое будет распространяться на разных арендаторов, и сохраняйте локальную настраиваемую конфигурацию базы данных для каждого арендатора.(в структуре, похожей на app.ini)
то есть
/
apps/
tentant1/
models/ <--- specific to the tenant
libraries/ <--- specific to the tenant
config/
app.ini <--- specific configuration
tentant2/
/**/ etc
core/
models/ <--- system wide models
libraries/ <--- system wide libraries (i.e. doctrine)
core.ini <--- system wide configuration
Это может держать все организованно.Мы даже дошли до того, что на палатку у нас есть готовая структура ядра.Таким образом, возможность переопределить все аспекты «ядра», специфичные для арендатора.