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

StackOverflow https://stackoverflow.com/questions/255616

Вопрос

Я работаю над PHP-приложением, которое призвано упростить рабочий процесс компании и управление проектами, скажем, что-то вроде Базовый Лагерь и ГоПлан.

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

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

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

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

Это было полезно?

Решение

Обычно я добавляю ClientID ко всем таблицам и использую одну базу данных.Но поскольку базу данных обычно трудно масштабировать, я также сделаю возможным запуск на разных экземплярах базы данных для некоторых или всех клиентов.

Таким образом, у вас может быть куча небольших клиентов в одной базе данных, а большие - на отдельных серверах.

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

Другие советы

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

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

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

Подумайте о резервном копировании базы данных.Клиент А говорит: "Пожалуйста, пришлите мне копию моих данных".Гораздо, намного проще настроить отдельную базу данных, чем при использовании общей базы данных.Подумайте об удалении клиента;опять же, гораздо проще с отдельными базами данных.

(Часть "инфраструктура" является размытой, потому что между различными СУБД существуют серьезные различия в том, что представляет собой, например, "база данных" по сравнению с "экземпляром сервера". Добавить:Вопрос помечен как "mysql", так что, возможно, эти мысли не совсем уместны.)

Добавить:Еще одна проблема - при использовании нескольких клиентов в одной базе данных каждый SQL-запрос должен гарантировать, что выбраны данные для правильного клиента.Это означает, что SQL будет сложнее писать и читать, и СУБД придется больше работать над обработкой данных, и индексы будут больше, и ...Я действительно предпочел бы использовать отдельную базу данных для каждого клиента для многих целей.

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

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

  • Производительность Для повышения производительности используйте базу данных для всех.Подумайте о пуле подключений, общей памяти, кэшировании и т.д.

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

Следующее скринкаст объясняет, как это делается на salesforce.com .Они используют одну базу данных со специальным столбцом OrgID, который идентифицирует данные каждого арендатора.Это еще не все, так что вам следует разобраться в этом.Я бы согласился с их подходом.

Есть еще один замечательный Статья об этом в MSDN.В нем подробно объясняется, когда вам следует использовать общий или изолированный подход.Помните, что наличие общей базы данных для всех ваших клиентов имеет некоторые важные последствия для безопасности, и если все они используют одни и те же объекты БД, вы можете захотеть использовать [безопасность на уровне строк] - в зависимости от используемой вами СУБД (я уверен, что это возможно в MS SQL Server и Oracle, возможно, также в IBM DB2).Вы можете использовать такие приемы, как безопасность на уровне строк в MySQL для достижения аналогичных результатов (просмотры + триггеры).

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

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

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

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

Когда вы разрабатываете многопользовательскую базу данных, у вас обычно есть три варианта:

  1. Иметь одну базу данных на каждого арендатора
  2. Иметь одну схему на каждого арендатора
  3. Пусть все арендаторы используют один и тот же стол (ы)

Выбранный вами вариант влияет на масштабируемость, расширяемость и изоляцию.Эти последствия широко обсуждались в различных Вопросы о StackOverflow и статьи базы данных.

На практике каждый из трех вариантов дизайна - при достаточных усилиях - может решить вопросы, связанные с масштабированием, данными, которые различаются у разных арендаторов, и изоляцией.Решение зависит от основного измерения, для которого вы строите.Краткое содержание:

  • Если вы строите для масштабирования:Пусть все арендаторы используют один и тот же стол (ы)
  • Если вы строите для изоляции:Создайте одну базу данных для каждого клиента

Например, Google а Salesforce следует первому шаблону и предоставляет своим клиентам одни и те же таблицы.Stackoverflow, с другой стороны, следует второму шаблону и хранит одну базу данных на каждого клиента.Второй подход также более распространен в регулируемых отраслях, таких как здравоохранение.

Решение сводится к основному измерению, для которого вы оптимизируете дизайн своей базы данных. Эта статья о проектировании вашей базы данных SaaS для масштабирования рассказывает о компромиссах и предоставляет краткое изложение в контексте PostgreSQL.

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top