В чем преимущества использования единой базы данных для клиента EACH?

В ориентированном на базу данных приложении, предназначенном для нескольких клиентов, я всегда думал, что "лучше" использовать единую базу данных для ВСЕХ клиентов - связывание записей с надлежащими индексами и ключами. При прослушивании подкаста Stack Overflow, я слышал, что Джоэл упоминает, что FogBugz использует одну базу данных для каждого клиента (поэтому, если бы было 1000 клиентов, было бы 1000 баз данных). В чем преимущества использования этой архитектуры?

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

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

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

Приветствуется любой вход!

Ответ 1

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

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

Вы также получаете преимущества отделимости - тривиально вытаскивать данные, связанные с данным клиентом, и перемещать их на другой сервер. Или восстановите резервную копию этого клиента, когда вызов до имени "Мы удалили некоторые ключевые данные!", Используя встроенные механизмы базы данных.

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

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

Я думаю, еще несколько десятков. Но в целом ключевая концепция - "простота". Продукт управляет одним клиентом и, следовательно, одной базой данных. Никогда не бывает сложности с проблемой "Но база данных также содержит других клиентов". Это соответствует ментальной модели пользователя, где они существуют в одиночку. Преимущества, такие как возможность простого создания отчетов для всех клиентов одновременно, минимальны - как часто вы хотите получать отчет по всему миру, а не только из одного клиента?

Ответ 2

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

Ответ 3

Вот один из подходов, который я видел раньше:

  • Каждый клиент имеет уникальную строку подключения, хранящуюся в базе данных основных клиентов.
  • База данных разработана таким образом, что все сегментируется CustomerID, даже если в базе данных есть один клиент.
  • Сценарии создаются для переноса всех данных клиента в новую базу данных, если это необходимо, и только тогда необходимо обновить только эту строку подключения клиента, чтобы указать на новое местоположение.

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

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

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

Ответ 4

Что касается боли при обновлении 1000 серверов баз данных сразу, некоторые довольно простые средства автоматизации должны позаботиться об этом. Пока каждая база данных поддерживает идентичную схему, это не будет проблемой. Мы также используем базу данных для каждого клиентского подхода, и она хорошо работает для нас.

Вот статья по этой точной теме (да, это MSDN, но это независимая от технологии статья): http://msdn.microsoft.com/en-us/library/aa479086.aspx.

Другое обсуждение многопользовательской аренды по отношению к вашей модели данных здесь: http://www.ayende.com/Blog/archive/2008/08/07/Multi-Tenancy--The-Physical-Data-Model.aspx

Ответ 5

Хорошо, что, если один из ваших клиентов попросит вас восстановить более раннюю версию своих данных из-за некоторых неудачных импортных заданий или подобных? Представьте, как ваши клиенты почувствовали бы, если бы вы сказали им: "Вы не можете этого сделать, поскольку ваши данные разделяются между всеми нашими клиентами" или "Извините, но ваши изменения были потеряны, потому что клиент X потребовал восстановления базы данных".

Ответ 6

Масштабируемость. Безопасность. Наша компания также использует 1 DB на клиентский подход. Это также делает код немного проще в обслуживании.

Ответ 7

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

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

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

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

Ответ 8

Я просто добавляю этот ответ, чтобы включить здесь слово multi-tenant. Я искал это, используя "multitenant" в качестве запроса, и этот не появился.

Ответ 9

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

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

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

Мне было бы интересно услышать от вас немного больше контекста, потому что кластеризация - не простая тема и дорогостоящая реализация в мире РСУБД. Существует много разговоров/бравады о кластеризации в нереляционном мире Google Bigtable и т.д., Но они решают другой набор проблем и теряют некоторые полезные функции из РСУБД.

Ответ 10

Есть несколько значений "базы данных"

  • аппаратный блок
  • работающее программное обеспечение (например, "оракул" )
  • конкретный набор файлов данных
  • конкретный логин или схема

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

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