4

ORM (Objection Relational Mapper) を使用して、C++ オブジェクトを SQLite データベースに永続化できるようにすることを検討しています。現在、CodeSynthesis による ODB を検討しています。

参照: http://www.codesynthesis.com/products/odb/

ODB のドキュメントを見ても、私が持っているしつこい質問に対する答えが見つかりません。それは次のとおりです。

クラスを作成し、それを DB に永続化した後、製品の新しいバージョンでクラスを変更するとどうなりますか。ユーザーが新しいバージョンのソフトウェアを入手したとき、古いデータはどのようにしてクラスの新しいバージョンに適切にロードされるのでしょうか?

以前に boost::serialize を見たことがありますが、この種の「アップグレード」を処理するメカニズムがありますが、疑問に思っています:

  1. ORM ツールでは、これは一般的にどのように処理されますか?
  2. 特にODBでこれを行う方法
  3. この問題を処理する ODB より優れた ORM ツールはありますか?
4

2 に答える 2

7

最初から、完全な開示: 私は 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 などです。データベースはスキーマ バージョンを保存し、アプリケーションはその最新のスキーマ バージョンを認識します。データベースを開いた直後に、アプリケーションはデータベースのバージョンをチェックし、それがアプリケーション スキーマのバージョンより低い場合は、これらの移行セットの実行を開始して、スキーマを最新バージョンにアップグレードします。

于 2012-11-30T15:50:09.187 に答える