Приложение, которое изменяет свою базовую схему базы данных

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

РЕДАКТИРОВАТЬ: Немного пояснить, что побудило меня задать этот вопрос. Моя система получает файлы отчетов из других систем и сохраняет полученные данные в таблице «отчеты». Отчет включает в себя несколько «параметров», которые теперь жестко запрограммированы: дата, сумма, цена за единицу. Эти параметры сохраняются в соответствующих столбцах в таблице «отчеты». Необходимо ввести возможность динамического (через веб-интерфейс) добавления новых параметров, которые можно считать из файла отчета и вставить в БД.

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


person mgamer    schedule 26.03.2010    source источник


Ответы (3)


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

show columns from test like 'new_column';
if ( ! new_column )
  alter table add column new_column after some_column

Что касается других сообщений, если вы используете систему с инкрементным управлением версиями в одних и тех же схемах базы данных (но в разных экземплярах этих схем), единственный способ управлять этим изменением — это программно обновить базу данных, иначе у вас будут несоответствия между версии приложения (т. е. 1.0 и 1.1) и схемы — в этом случае невозможно применить изменения ко всем базам данных одновременно.

person Andy    schedule 26.03.2010
comment
+1 хороший момент (хотя я бы попытался изолировать любой шаг обновления от самого кода приложения, что, я знаю, вероятно, расщепляет волосы!) - person davek; 26.03.2010

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

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

person Andy Shellam    schedule 26.03.2010

Я бы не стал - никогда. Я знаю, что можно внести изменения в POJO и разрешить Hibernate, например, распространять любые изменения, необходимые для базы данных, но это ИМХО плохая идея, поскольку она лишает возможности осуществлять правильное управление конфигурацией вашей схемы.

EDIT: возможное исключение: см. ответ Энди (хотя я все же попытался бы отделить шаг обновления от самого приложения).

person davek    schedule 26.03.2010