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


4 Answers

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

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

Question

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

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

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

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

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




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




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

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

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




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

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

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

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




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

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

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






Related