Я использую Symfony уже около 2 лет, до сих пор каждый проект, который я создаю, развертывается специально для каждого клиента (например, один клиент, одна база кода, один db).
Допустим, у меня есть приложение для управления проектами, которое я хочу развернуть для многих клиентов. Предполагая, что клиенты будут работать с любыми функциями, которые я встраиваю в систему, если я разворачиваю разную базу кода (следовательно, другую db) для каждого клиента, вот о каких проблемах я предвижу:
-
Нажатие исправлений ошибок и обновлений будет болезненным. Мне нужно нажать его в каждый репозиторий, который я развернул. Он не будет хорошо масштабироваться, если у меня будет 50 клиентов, использующих это приложение.
-
Менеджмент болезнен. Как я могу создать систему администратора для себя, где я могу вытащить ВСЕ проекты в одну таблицу HTML? В конце концов, у каждого клиента есть своя база данных, верно? Для меня что-то значимое со всеми записями всех моих клиентов, мне нужен способ просмотреть все свои базы данных за один раз, что... Я не думаю, что Symfony разрешает. (Я не уверен)
-
Проблемы с учетной записью пользователя. Если пользователь работает для нескольких компаний, все они используют мое приложение для управления проектами, этот пользователь должен зарегистрироваться несколько раз. (Я знаю, что это можно обойти, если я использую oauth, но я стараюсь не туда, если могу)
Вот решения, которые я придумал и попытался в определенной степени.
Решение 1
Одна база данных и одна кодовая база для ВСЕХ моих клиентов. Проекты будут проходить под одной таблицей, счета-фактуры идут под одной таблицей, все они отмечены их собственным client_id. Пользователи могут быть назначены для проектов, поэтому нет необходимости подписываться несколько раз.
Это не так сложно создать. Но что произойдет, если разные клиенты нуждаются в разных столбцах для своих счетов-фактур? Таблица My Invoice будет продолжать расширяться (с разными полями, которые нужны разным клиентам), и каждая строка может содержать много нулевых полей. Не говоря уже о том, что мой объект счета будет расти в размере файла, и мне придется обновлять схему базы данных каждый раз, когда появляется новая настройка.
Решение 2
Одна база данных, где каждый клиент имеет собственный префикс таблицы. Поэтому для клиента A я мог бы использовать clientA_projects, clientA_invoices, clientA_configuration и т.д.
Это идеально, если каждый клиент хочет настроить свои поля. Но означает ли это, что мне нужно создать новые классы сущностей и форм для каждого нового клиента, входящего в систему? Похоже, что с этим решением мне нужно обновить схему базы данных каждым новым клиентом, который я получаю.
В настоящее время я экспериментирую с базами данных без схем (монго и кушеткой), надеясь, что без необходимости заранее указывать схему таблицы, я могу без проблем реализовать решение 1. Но я все еще экспериментирую, и есть способы пойти, прежде чем осмелиться развернуть готовое к производству приложение, не знакомое с проблемами монго и кушетки с Symfony.
Итак, вот где я застрял. Будучи самообразованным программистом, я чувствую, что у меня много явных знаний, требующих заполнения (в отличие от кого-то из CS-фона). В Интернете не так много мест, рассказывающих о Symfony 2 и многопользовательской аренде (возможно, я искал неправильную вещь). Если кто-то может указать мне на более ясное направление, может быть, лучшие практики, примеры проектов, я буду очень благодарен!
Btw, я планирую выполнить это в последней версии Symfony (2.3.2 в данный момент).
Спасибо заранее, ребята.