Одна вещь, которую я постоянно смущал при использовании объектной базы данных, такой как db4o , это то, как вы должны обрабатывать сложные миграции, которые обычно выполняются SQL / PL-SQL.
Например, представьте, что у вас есть таблица в реляционной базе данных с именем my_users. Первоначально у вас был столбец с именем «полное_имя», теперь, когда ваше программное обеспечение находится в V2, вы хотите удалить этот столбец, разделить полные имена на пустое пространство и поместить первую часть в столбец с именем «first_name», а вторую - в столбец. по имени фамилия. В SQL я просто заполнил бы столбцы «first_name» и «second_name», а затем удалил исходный столбец с именем «full_name».
Как бы я сделал это в чем-то вроде db4o? Должен ли я написать программу на Java, которая создает сценарии для поиска всех объектов User.class, устанавливая для full_name значение null при установке first_name и last_name? Когда я сделаю свой следующий SVN-коммит, не будет никакого свойства field / bean-компонента, соответствующего full_name, это будет проблемой? Кажется, как будто для использования в производственном приложении, где моя «схема» меняется, я хотел бы написать скрипт для переноса данных из версии x в версию x + 1, а затем в версии x + 2 фактически удалить свойства, которые я пытаюсь избавиться от версии x + 1, поскольку я не могу написать скрипт Java для изменения свойств, которые больше не являются частью моего типа.
Кажется, что отчасти проблема в том, что СУБД разрешает объект, на который вы ссылаетесь, на основе простого нечувствительного к регистру имени, основанного на строках, в языке, подобном типизации Java, сложнее, чем это, вы не можете ссылаться на свойство если getter / setter / field не является членом класса, загруженного во время выполнения, поэтому вам, по сути, нужно иметь 2 версии вашего кода в одном и том же скрипте (хм, пользовательские загрузчики классов звучат как боль), иметь новую версию вашего класса хранятся принадлежащие другому пакету (звучит грязно), или используйте стратегию версии x + 1 x + 2, о которой я упоминал (требует гораздо большего планирования). Возможно, есть какое-то очевидное решение, которое я никогда не нашел в документах db4o.
Есть идеи? Надеюсь, в этом есть какой-то смысл.