最初から、完全な開示: 私は ODB に取り組んでいます。そして、あなたの 3 番目の質問に答えるために、いいえ、何もありません ;-)。
しかし、真面目な話、スキーマの進化は難しい問題であり、TODO リストの 3 つの大きな項目の 1 つです (他の 2 つはマルチデータベースのサポートと SQL-to-C++ コンパイラーです)。幸いなことに、マルチデータベースのサポートはほぼ完了しており、次はスキーマの進化です。
一般に、スキーマ (および必要に応じてデータ) を最新バージョンにすることが最善の方法のようです。アプリケーションが複数の異なるバージョンを読み取れるようにするという代替手段は、現実の世界ではスケーリングできないようです。
例として、データ メンバーをクラスに追加したとします。これは、データベース スキーマ レベルでは、対応するテーブルに列を追加することになります。これを処理する方法は、この新しい列を NULL 可能にすることです (たとえば、odb::nullable または boost::optional を使用)。ここでの考え方は、この列の値を持たない古いデータは NULL になる (アプリケーションが検出して処理できる) ということです。
次に、データベースのスキーマをアップグレードする必要があります。この場合、新しい列を追加する ALTER TABLE ADD COLUMN ステートメントを実行する必要があります。ODB がスキーマの進化をサポートすると、これらの移行ステートメントが自動的に生成されます。現時点では、それらを自分で作成する必要があります (お尻の痛み、私は知っています)。テーブル内のすべての既存の行には、この列の NULL 値が自動的に割り当てられます。
したがって、通常、アプリケーションには、スキーマをあるバージョンから次のバージョンにアップグレードするステートメントのセットが含まれます。たとえば、1 から 2、2 から 3 などです。データベースはスキーマ バージョンを保存し、アプリケーションはその最新のスキーマ バージョンを認識します。データベースを開いた直後に、アプリケーションはデータベースのバージョンをチェックし、それがアプリケーション スキーマのバージョンより低い場合は、これらの移行セットの実行を開始して、スキーマを最新バージョンにアップグレードします。