[Database-design] Должен ли я использовать одну или несколько настроек базы данных для многоклиентского приложения?


Answers

Слушайте подкаст Stackoverflow, где Джоэл и Джефф рассказывают об одном и том же вопросе. Джоэл говорит об их опыте, предлагающем размещенную версию своего программного обеспечения. Он указывает, что добавление идентификаторов клиентов по всей вашей БД усложняет дизайн и код (вы уверены, что не случайно не забыли добавить его в какое-либо предложение WHERE?) И усложняет функцию хостинга, такую ​​как резервные копии для конкретного клиента.

Это было в эпизоде ​​№ 20 или № 21 (подробнее см. Стенограммы).

Question

Я работаю над PHP-приложением, которое намеревается упростить рабочий процесс компании и управление проектами, скажем, что-то вроде Basecamp и GoPlan .

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

Возможные минусы Я могу подумать об использовании одной базы данных:

  • Отсутствие расширяемости
  • Проблемы безопасности (хотя ошибок не должно быть в первую очередь )

Что вы думаете об этом? Есть ли у вас какие-либо идеи о том, какое решение выбрали вышеперечисленные компании?




Вы можете начать с единой базы данных и разбить ее по мере роста приложения. Если вы это сделаете, я бы посоветовал несколько вещей:

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

2) Когда у вас есть только одна база данных, убедитесь, что она копируется на другой физический сервер. В случае отказоустойчивости вы можете вернуть трафик на этот другой сервер и по-прежнему иметь ваши данные в целости.




Наличие базы данных на клиента обычно недостаточно масштабируется. MySQL (и, возможно, другие базы данных) содержит ресурсы, открытые для каждой таблицы, это не позволяет хорошо подходить к 10k + таблицам на одном экземпляре, что может произойти в ситуации крупномасштабной многопользовательской ситуации.

Конечно, если у вас есть еще одна проблема, которая вызывает другие проблемы до того, как вы доберетесь до этого уровня, это может быть не актуально.

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

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

Я не могу этого гарантировать.




  • РАЗРАБОТКА Для быстрой разработки используйте базу данных для каждого клиента. Подумайте, как легко будет выполнять резервное копирование, восстановление или удаление данных клиента. Или для измерения / мониторинга / использования счета. Вам не нужно будет писать код, чтобы сделать это самостоятельно, просто используйте примитивы базы данных.

  • ПРОИЗВОДИТЕЛЬНОСТЬ Для производительности используйте базу данных для всех. Подумайте о пуле соединений, общей памяти, кешировании и т. Д.

  • БИЗНЕС Если в вашем бизнес-плане должно быть много мелких клиентов (думаю, hotmail), вы, вероятно, должны работать над одной БД. И все административные задачи, такие как регистрация, удаление, миграция данных и т. Д., Полностью автоматизированы и доступны в дружественном интерфейсе. Если вы планируете иметь десятки или до нескольких сотен крупных клиентов, вы можете работать в одной БД на каждого клиента и иметь сценарии администрирования системы, которые могут обслуживаться вашим персоналом службы поддержки.




Для многопользовательской работы производительность обычно увеличивает количество ресурсов, которыми вы располагаете друг для друга, см.

http://en.wikipedia.org/wiki/Multitenancy

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

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