2013-07-27 2 views
10

Я использую Symfony уже около 2 лет, до сих пор каждый проект, который я создаю, развертывается специально для каждого клиента (то есть одного клиента, одной базы кода, одной базы данных).SAAS и многоквартирный дом в Symfony2?

Допустим, у меня есть приложение для управления проектами, которое я хочу развернуть для многих клиентов. Если предположить, что клиенты будут идти с тем, что функции я встраивать в систему, если я развернуть другую кодовую (следовательно, разные БД) для каждого клиента, вот проблемы я предвижу:

  1. Толчок исправляет ошибку и обновлений будет болезненным. Мне нужно нажать его в каждый репозиторий, который я развернул. Он не будет хорошо масштабироваться, если у меня будет 50 клиентов, использующих это приложение.

  2. Управление является болезненным. Как я могу создать систему администратора для себя, где я могу вытащить ВСЕ проекты в одну таблицу HTML? В конце концов, у каждого клиента есть своя база данных, верно? Для меня что-то значимое со всеми записями всех моих клиентов, мне нужен способ просмотреть все свои базы данных за один раз, что ... Я не думаю, что Symfony разрешает. (Я не уверен)

  3. Проблемы с учетной записью пользователя. Если пользователь работает для нескольких компаний, все они используют мое приложение для управления проектами, этот пользователь должен зарегистрироваться несколько раз. (Я знаю, что это можно обойти, если я использую OAuth, но я стараюсь не ходить туда, если я могу)

Вот решения я придумал и пытался в определенной степени.


Решение 1

Одна база данных и одна кодовая для ВСЕХ моих клиентов. Проекты будут проходить под одной таблицей, счета-фактуры идут под одной таблицей, все они отмечены их собственным client_id. Пользователи могут быть назначены для проектов, поэтому нет необходимости подписываться несколько раз.

Это не так сложно создать. Но что произойдет, если разные клиенты нуждаются в разных столбцах для своих счетов-фактур? Таблица My Invoice будет продолжать расширяться (с разными полями, которые нужны разным клиентам), и каждая строка может содержать много нулевых полей. Не говоря уже, моя сущность счета будет расти в размере файла, и мне придется обновить схему базы данных каждый раз, когда новая настройка приходит в.


Решение 2

одна базы данных, где каждый клиент имеет собственный префикс таблицы. Таким образом, для клиента A я мог бы использовать clientA_projects, clientA_invoices, clientA_configuration и т. Д.

Это идеальное решение, если каждый клиент хочет настроить свои поля. Но означает ли это, что мне нужно создать новые классы сущностей и форм для каждого нового клиента, входящего в систему? Похоже, что с этим решением мне нужно обновить схему базы данных каждым новым клиентом.


В настоящее время я экспериментировал с схемы меньше баз данных (Монго и диван), в надежде, что без необходимости указать схему таблицы заранее, можно реализовать решение 1 без хлопот. Но я все еще экспериментирую, и есть способы пойти, прежде чем осмелиться развернуть готовое приложение, не знакомое с проблемами монго и кушетки с Symfony.


Итак, здесь я застрял. Будучи самообразованным программистом, я чувствую, что у меня много явных знаний, требующих заполнения (в отличие от кого-то из CS-фона). В Интернете не так много мест, рассказывающих о Symfony 2 и многопользовательской аренде (возможно, я искал неправильную вещь). Если кто-то может указать мне на более ясное направление, может быть, лучшие практики, примеры проектов, я буду очень благодарен!

Btw, я планирую выполнить это в последней версии Symfony (2.3.2 на данный момент).

Спасибо заранее, ребята.

+0

@ Lu0-dezhang есть любая возможность поделиться своими результатами? Я запускаю новое приложение SaaS с помощью Symfony3, но не имею идеи вообще относительно баз данных и организации проекта Symfony3, а также ... жестких? – ReynierPM

ответ

6

Я также использую Symfony2 для аналогичного количества времени (с одной из BETAs), и я советую вам пойти с решением №1. Если вы собираетесь SaaS, вы не можете выдавать код клиентам по причинам, которые вы написали (проблемы с обновлениями/обновлениями в основном). Вся проблема будет в управлении пользователями - у какого пользователя есть доступ к каким данным, принадлежит к какой группе, компании и т. Д. Все остальное, если все сделано правильно, будет закодировано таким же образом, как и агностик. Что вы должны делать с различными требованиями для разных компаний? Сделайте такие функции configurable. Вы можете реализовать это на различных уровнях:

  • простого объект атрибуты: есть attributes поля в каждой таблице и сохранить все, как JSON, YAML или другим динамическим structurable содержания,
  • общей конфигурации: есть одно место, где объект базовая конфигурация сохраняется (в средствах, которые я написал выше) и позволяет пользователям управлять новыми функциями оттуда, все изменения распространяются на простые объекты,
  • реализовать что-то, что я называю Entity Parameters Pattern - создавать таблицы базы данных, которые будут содержать типы параметров, параметр значения и отношение к другим объектам на разных уровнях, а затем создать общий настраиваемый параметр типы, которые могут быть применены в любом месте с предопределенным значением. Например, «preferred_season» является параметром типа «choice_string», содержащим конфигурацию «весна, лето, осень, зима», и при присоединении к данному объекту всегда будет отображать поле <select> с выбором и сохранять выбранное значение по отношению к сущности и типу параметра ,

Также решение № 1 имеет одно непревзойденное преимущество - оно может обрабатывать больше одной компании, даже если вы хотите выдать код в конце. Вам просто нужно замаскировать способность добавлять больше. :)

Этот вопрос помечен Symfony2, но это действительно не должно. Неважно, какие рамки вы используете, вы должны абстрагировать свой дизайн приложения от кода, а затем использовать фреймворки как простой инструмент для выполнения работы плавно. Я бы хотел сказать, что даже принимая во внимание предыдущее предложение, я абсолютно влюблен в Symfony2. :)

1

Я знаю, что это старый вопрос, но может быть полезен для других.

Я согласен с @Tomasz и решением №1 с one database - все арендаторы в одной базе данных. Самой большой проблемой здесь является правильная разработка базы данных для решения дальнейших проблем безопасности: доступ к ресурсам должен контролироваться приложением для предотвращения несанкционированного доступа между арендаторами. С другой стороны, у нас есть облегченная реализация, поскольку мы реализуем одно приложение только с одной базой данных.

Хорошая статья о Symfony2 и переход к SaaS модели: http://www.browserlondon.com/blog/2015/01/moving-to-a-saas-model-with-symfony2/

Также "должен прочитать" статью о создании базы данных в SaaS платформы - модели, которые независимы от платформы: http://labs.octivi.com/database-design-in-saas-platforms/

 Смежные вопросы

  • Нет связанных вопросов^_^