Решал аналогичную задачу и столкнулся с теми же вопросами, что и вы.
С одной стороны по базе на клиента — недопустимое расточительство. Как правило саасы подразумевают тысячи компаний-клиентов, а тем кто просто зайдет посмотреть не будет числа.
Если же база одна — в скором времени какая-нибудь быстро растущая таблица станет «неуправляемой» и серьезно просадит производительность. Конечно можно разносить такие таблицы на партиции, но в нашей ситуации есть более интересное решение.
Надо держать несколько БД и в каждой несколько сотен компаний. При этом новые базы можно добавлять по мере развития.
Какое-то время вам вообще будет достаточно одной базы.
Несколько рекомендаций:
1. одну из БД (очевидно первую) назначаем мастер- или «системной» базой. только в ней будет хранится данные общие для всей системы. Например новости вашей системы, глобальные настройки и конечно главное — список компаний клиентов.
2. во все таблицы с клиентскими данными внести поле COMPANY_ID. Более того внести его в состав всех первичных и внешних ключей. Т… е. первичный ключ таблички ORDER будет (COMPANY_ID, ID)
3. ID инкрементировать в рамках компании, а не всей таблицы. Т.е. у каждой компании будет заказ с ID = 1,
2 и т.д.
Пример:
COMPANY (id, name) — «системная» таблица с компаниями-клиентами
ORDER( company_id, id, customer ) — «клиентская» таблица заказов
PRODUCT( company_id, id, name ) — каталог товаров компании
ORDER_ITEM( company_id, order_id, product_id) — продукты в заказе
первичные ключи:
в ORDER и PRODUCT — (company_id, id)
в ORDER_ITEM — (company_id, order_id, product_id)
внешние ключи в ORDER_ITEM:
(company_id, order_id) → ORDER( company_id, id)
(company_id, product_id) → PRODUCT( company_id, id)
Такой подход дает во-первых максимальную изолированность данных компании.
Во-вторых — возможность переселиения компания из одной БД в другую без конфликта первычных ключей.
Если будут вопросы — пишите в местную почту ;)
Удачи.