データ移行はソフトウェア開発における大きな課題のひとつです。
UIの表示を変更することはあってもデータ構造を変更することはほとんどありません。
特にひとつのテーブルに大量のカラムが存在しているような場合、データ構造を変更したときの影響範囲が広すぎてしまう可能性があります。
そのため変更しづらいデータ構造はそのままにされてしまいます。
ただし、それをずっと無視できる訳ではありません。
様々な理由(サポートの終了、ユーザビリティの向上等)から、データを新しいアプリケーションに移行させなければいけない時が必ずやってきます。
つまり、私たちは安全なデータ移行ができるように常に注意しなければいけません。
ここで安心してほしいのが、前述されている手法を用いていればデータ移行はシンプルで安全に行うことができます。
fun migration(){
val oldData = oldRepository.resolveAll()
val newData = this.convertToNewData(oldData)
newRepository.add(newData)
}
fun convertToNewData(oldData:OldData):NewData{
// 変換処理を行う
}
古いデータ構造と新しいデータ構造が同じであれば変換処理すら不要です。
変換が必要な場合でもテストコードが書きやすいのでよりミスしづらくなっています。
データ移行の対象は小さければ小さいほど安全です。
fun migration(){
val oldData = oldDaoFacade.selectAll()
val newData = this.convertToNewData(oldData)
newDaoFacade.insert(newData)
}
fun migration(){
val oldData = oldDao.selectAll()
val newData = this.convertToNewData(oldData)
newDao.insert(newData)
}
上記の方法では一旦同じデータベースに変換後のデータ構造を生成し、そこからデータをexport、importし新しいデータベースに移行します。
このように、データの変換とデータの移動は別で行ったほうがより安全です。
ここまで説明していたデータ移行手法は実質的に実行不可能です。
何故なら、古いデータ構造は悪い構造になっていることが多いからです。
長年運用されたデータベースにはinteger型にnullが入っていることもあります。(integer型はデフォルトで0になることが多いので、nullは異常値)