Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

  • Имейте одну базу данных для каждого арендатора
  • Есть одна схема для каждого арендатора
  • У всех арендаторов есть одна и та же таблица.

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

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

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

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

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

Ответ 8

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

Ответ 9

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

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

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

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

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

Ответ 10

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

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

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