Ответы пользователя по тегу MySQL
  • SaaS: одна БД на клиента, или общая база данных?

    abarmot
    @abarmot
    Решал аналогичную задачу и столкнулся с теми же вопросами, что и вы.

    С одной стороны по базе на клиента — недопустимое расточительство. Как правило саасы подразумевают тысячи компаний-клиентов, а тем кто просто зайдет посмотреть не будет числа.

    Если же база одна — в скором времени какая-нибудь быстро растущая таблица станет «неуправляемой» и серьезно просадит производительность. Конечно можно разносить такие таблицы на партиции, но в нашей ситуации есть более интересное решение.

    Надо держать несколько БД и в каждой несколько сотен компаний. При этом новые базы можно добавлять по мере развития.
    Какое-то время вам вообще будет достаточно одной базы.

    Несколько рекомендаций:

    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)

    Такой подход дает во-первых максимальную изолированность данных компании.
    Во-вторых — возможность переселиения компания из одной БД в другую без конфликта первычных ключей.

    Если будут вопросы — пишите в местную почту ;)
    Удачи.
    Ответ написан
    3 комментария