2010-03-26 3 views
0

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

EDIT: Немного о том, что побудило меня изменить этот вопрос. Моя система получает файлы raport из других систем и сохраняет извлеченные данные в таблице «отчеты». Отчет содержит несколько «параметров», которые теперь жестко закодированы: дата, количество, unit_price. Эти параметры сохраняются в соответствующих столбцах в таблице «отчеты». Нам нужно представить возможность динамического (через веб-интерфейс) добавления новых параметров, которые могут быть прочитаны из файла отчета и вставлены в db.

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

ответ

2

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

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

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

+0

+1 хороший момент (хотя я бы попытался изолировать любой шаг обновления от самого кода приложения, который, вероятно, раскалывает волосы, я знаю!) – davek

1

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

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

1

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

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

Смежные вопросы