Мультитенантный PHP SaaS - Отдельные БД для каждого клиента или их группировка?

Вам придется смириться со мной за то, что я, возможно, немного ошибочен в терминологии, поскольку я даже не знал, что это относится ко всей категории «мультитенантное» «программное обеспечение как услуга», но здесь это так.

Я разработал систему членства (на PHP) для клиента. Сейчас мы рассматриваем предложение как полностью размещенное решение для других наших клиентов, предоставляя субдомен (или даже их собственный домен).

Похоже, у меня есть варианты, которые касаются хранения данных:

Опция 1 - Храните все в одной большой базе данных, и в нужных таблицах есть поле client_id (будет около 30 таблиц, к которым оно будет применяться), а в таблице клиентов хранятся их основные настройки, детали и т. Д. и домен для сопоставления с ними. Затем он просто устанавливает глобально доступную переменную, содержащую их индивидуальный идентификатор клиента - мне, очевидно, придется изменить каждый запрос, чтобы проверить столбец client_id.

Вариант 2 - Иметь основную таблицу с таблицами «общих ссылок» и «клиентами». Затем есть «блоки» других баз данных, каждая из которых содержит, скажем, 10 клиентов. Клиент получит свои собственные таблицы базы данных с префиксом своего идентификатора клиента. Это добавляет немного безопасности для защиты от просмотра других данных клиента, если что-то пошло не так.

Вариант 3 - Точно так же, как вариант 2, за исключением того, что у вас есть 1 база данных для каждого клиента, полностью изолирующая их от других клиентов и теоретически обеспечивающая немного большую защиту, так что если таблицы 1 клиента будут взломаны или иным образом повреждены, это ни на кого не повлияет остальное. Самым большим недостатком является то, что при развертывании нового клиента необходимо настроить всю базу данных, пользователя и пароль и т. Д. Может ли это также привести к значительным затратам или это будет примерно так же, как если бы у вас было все в одном база данных?

Также есть несколько моментов - у некоторых из этих клиентов будет более 5000 «клиентов» вместе со всеми подробностями для этих клиентов - вот почему вариант 1 может стать проблемой - если у меня есть 100 клиентов, это может равняться более полумиллиона строк в 1 таблице.

Правильно ли я считаю, что вариант 3 будет наилучшим путем в ситуации, когда безопасность данных клиента (и информации о платеже) является ключевой. Из рекомендаций, которые я получил, несколько человек сказали, что нужно выбрать вариант 1, потому что «это проще», однако я действительно не вижу этого в этом. Я рассматриваю это как потенциальное узкое место в будущем, так как, конечно, я могу гораздо легче перемещать клиентов, если у них есть собственная база данных.

(К сведению, система основана на PHP с MySQL)

Ответы на вопрос(3)

Ваш ответ на вопрос