Несколько схем против огромных таблиц

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

заранее спасибо

1 ответ

Решение

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

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

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

"Ничего общего", "отдельная база данных" или одна база данных на каждого арендатора

  • Самый дорогой на одного клиента. (Большое количество клиентов подразумевает большое количество серверов.)
  • Высочайшая степень изоляции данных.
  • Аварийное восстановление для одного арендатора просто и понятно.
  • Техническое обслуживание теоретически сложнее, потому что изменения должны выполняться в каждой базе данных. Но ваши базы данных могут легко поддерживать запуск хранимых процедур в каждой базе данных. (SQL Server имеет недокументированную системную хранимую процедуру, например sp_msforeachdb. Вы, вероятно, можете написать свою собственную.) "Простое совместное использование" также проще всего настраивать, но это также вызывает больше проблем с обслуживанием.
  • Наименьшее количество строк в таблице. Скорость запросов близка к оптимальной.

"Shared everything", или "общая схема", или "одна база данных на планету"

  • Наименее дорогой на одного арендатора.
  • Самая низкая степень изоляции данных. В каждой таблице есть столбец, в котором указывается, к какому арендатору относится строка. Поскольку строки арендаторов смешаны в каждой таблице, случайное раскрытие данных других арендаторов относительно просто.
  • Аварийное восстановление для одного арендатора является относительно сложным; Вы должны восстановить отдельные строки во многих таблицах. С другой стороны, катастрофа для одного арендатора является относительно необычной. Большинство бедствий, вероятно, затронет всех жильцов.
  • Структурное обслуживание проще, учитывая, что все арендаторы разделяют таблицы. Это увеличивает коммуникационную нагрузку, потому что вы должны общаться и координировать каждое изменение с каждым арендатором. Это не легко настроить.
  • Наибольшее количество строк в таблице. Быстрые запросы сложнее, но это зависит от того, сколько арендаторов и сколько строк. Вы можете легко опрокинуться на территорию VLDB.

Между "общим ничем" и "общим всем" находится "общая схема".

"Общая схема"

  • Арендаторы совместно используют базу данных, но у каждого арендатора есть своя именованная схема. Стоимость падает между "делится ничем" и "делится всем"; для больших систем обычно требуется меньше серверов, чем для "общего доступа", больше серверов, чем для "общего доступа".
  • Гораздо лучшая изоляция, чем "поделился всем" Не так много изоляции, как "ничего не поделился". (Вы можете предоставлять и отзывать разрешения для схем.)
  • Аварийное восстановление для одного арендатора требует восстановления одной из многих схем. Это либо относительно легко, либо довольно сложно, в зависимости от вашей базы данных.
  • Обслуживание проще, чем "ничего не поделился"; не так просто, как "поделился всем". Относительно просто написать хранимую процедуру, которая будет выполняться в каждой схеме в базе данных. Распределить общие таблицы между арендаторами проще, чем с "ничего не поделился".
  • Обычно более активных арендаторов на сервер, чем "ничего не поделился", что означает, что они совместно используют (ухудшают) больше ресурсов. Но не так плохо, как "поделился всем".

У Microsoft есть хорошая статья о мультитенантной архитектуре с большим количеством деталей. (Ссылка на одну страницу многостраничного документа.)

Другие вопросы по тегам