Мульти-аренда - Создавайте таблицы заранее или по мере необходимости?
В настоящее время я работаю над приложением типа SaaS, и для мультитенантности я остановился на одной базе данных на пользователя, где каждая база данных содержит все таблицы, необходимые для функциональности, на которую пользователь имеет право (заплатил). Приложение предназначено для сбора данных (например, веб-аналитики) и представления их пользователю. Дизайн должен быть в состоянии масштабироваться до десятков тысяч пользователей (в конце концов).
Будет ли жизнеспособным решением создать таблицы "динамически", когда приложение обнаружит, что они необходимы? Или я должен создать все необходимые таблицы в определенных пользовательских базах данных, как только узнаю, что они могут понадобиться (обновление пользователя, новые функции и т. Д.)?
Моя текущая архитектура позволила бы мне сделать что-то вроде этого:
function insertData($table, $data) {
mysql_query("INSERT INTO ".$table." VALUES ('".implode("', '", $data)."')");
if ( mysql_errno() ) {
if (mysql_errno() == 1146) { // table does not exist
if ( $this->createTable($table) ) {
$this->insertData($table, $data)
}
} else {
// other errors
}
}
}
Мне бы хотелось, чтобы гибкость позволяла добавлять функциональные возможности без необходимости циклически перебирать все пользовательские базы данных для добавления таблиц, поэтому настройка, подобная приведенной выше, поможет мне добиться этого. Но я не уверен, что пропустил что-то, что заставило бы меня сожалеть об этом решении позже?
1 ответ
Использование вставки для проверки существования таблицы может оказаться не лучшим выбором, особенно с учетом размера строки и задержки сервера базы данных. Лучшим решением может быть использование "покажите таблицы", то есть:
SHOW TABLES LIKE 'TABLENAME';
Результат будет примерно таким:
Tables_in_DATABASENAME (TABLENAME)
----------------------------------
be_groups
Если количество строк равно нулю, очевидно, что таблица не существует.
Что касается вашего процесса - думаю, я бы использовал гибридный подход. Когда клиент обновляется и как часть вашего рабочего процесса подготовки, создайте все таблицы, необходимые для предоставления новых услуг клиенту. Таким образом, клиент не потребляет больше ресурсов (в основном дисков, в данном случае), чем он платит, и вы не причиняете себе боль динамической инициализации.