Мульти-аренда - Создавайте таблицы заранее или по мере необходимости? - PullRequest
1 голос
/ 10 августа 2010

В настоящее время я работаю над приложением типа 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 Ответ

0 голосов
/ 10 августа 2010

Использование вставки для проверки существования таблицы может быть не лучшим выбором, особенно с учетом размера строки и задержки сервера базы данных. Лучшим решением может быть использование «покажите таблицы», т.е.

SHOW TABLES LIKE 'TABLENAME';

Результат будет примерно таким:

Tables_in_DATABASENAME (TABLENAME)
----------------------------------
be_groups

Если количество строк равно нулю, очевидно, что таблица не существует.

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

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