問題
Eventual Consistentな分散レプリケーションのインスタンスが複数存在するケースを考える。
データはSQLiteに保存している。
すべてのインスタンスがフィールドaとbを持つデータ構造を持っている。
ある日、フィールドcを追加するアップデートがリリースされ、そのリリースが特定の1インスタンスのみにに適用されたとする。
フィールドcを持つデータがそのインスタンスに追加されると、それらはレプリケーションのために他のインスタンスに送信される。
他のインスタンスはまだそのリリースを受け取っておらずフィールドcに対応するカラムがSQLiteに存在しないため、フィールドcが保存できない。
解決策
- 案1: NoSQLを使用する
- インスタンスでNoSQLが使えるならいいが、モバイルアプリとなるとサポートが不足しているかも。
- 案2: SQLiteをNoSQL的に使う
受信したデータをJSON文字列として保存する。新しいバージョンにアップグレードする際に、新しいフィールドの仮想カラムを作成するデータベースのマイグレーションを適用する。JSON文字列として保存するので、データが未知のフィールドを含んでいても、単純にデータを保存できる。 - 案3: レプリケーションされる前に受信側は送信側のバージョンを受け取り、それが自分自身のバージョンより大きい場合、新しいバージョンにアップグレードするようにする。
所感
仮想カラム使えばバージョンによらず最新のデータ構造を保存しつつ、古いバージョンを使い続けることができる。 ただ、仮想カラムの保存と計算のオーバーヘッドが懸念として残る。