チョモランマに登るには。

Androidアプリ開発の初心者が立派な開発者になるまで

アプリを作るときに気をつけたかったDB設計のこと

こんにちは。
最近秋晴れの日が続いて気持ちがいいですね。
紅葉が待ち遠しいです。

mine改修の進捗状況


さて僕の一つ目のアプリ、mineの改修作業を初めて何週間経ちましたでしょうか。
割と早く終わるかなと思いきや、結局ずるずると時間がかかっています。

結局何に時間がかかるのかというと、データの移行とか、前のバージョンとの兼ね合いを考慮しないといけない点なんですね。
前から使っている人が今回の大規模なアップデートによって使えなくなったり、データがおかしくなったりしないように気をつけなくてはいけません。

この点では先にチャットノベルで結構やらかしてしまったので、余計にびびっています。

でも普通のアップデートなら別にそんな気にすることはないと思うんです。
じゃあなぜ僕はこんなに気を使っているかというと、作るときにデータ構造の設計を間違えてしまったんです。

つまりデータをどう扱うかっていうところですね。
一番根本的なところでミスを犯しているので、それをなんとか立て直そうとしてるんです。

だからアップデートというよりもはやリフォームですね。全く酷い建設会社です。

ということで今回は少しそのへんの、アプリ作るときに知りたかったデータまわりのことについて書きます。
データベースを使ったアプリを作りたい方向けですね。
初歩的なことなので経験者の方が見ても為になりません。


何よりもまずデータ設計から決める


最初にデータがある。プログラムはその次にできる。

引用元:

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ


僕だけかもしれませんが、正直データベースってなめてました。
Android本でちょろっと出てくるだけだし、どうせデータを入れたり出したりするだけでしょ?って。

でも会社に入ってからデータベースの本を3冊買って勉強しました。 完全に思い違いでした。

データを扱うシステムにおいては、そのデータこそがシステムの命になります。
データをどう保存し、どう管理するのか。データ設計を決めた上で、その設計に従ったプログラムを組んでいきます。

そのため、データ設計で間違うと僕のアプリのように根本的なとこから作り直しをするハメになってしまいます。

じゃあそうならないようにするにはどうすればいいか。
あまり高度なことはまだ書けませんが、基本的な以下の2点について書きたいと思います。

・テーブルを分割する
・必ず「キー」で管理する

テーブルを分割する


テーブルを必要単位に分けるということですね。
僕のアプリ、チャットノベルで言えば、作品は作品テーブルに、プロットはプロットテーブルに、チャットはチャットテーブルにそれぞれ分けます。

じゃあその分けたテーブル間の連携はどうするかというと、そこで「キー」を使用します。

必ず「キー」で管理する


ご存じのように、AndroidではDBをcreateするときに_idというカラムをつけるお作法があります。
このお作法のおかげで、キーの概念はスッと理解できていたように思います。
ただ何となく理解していただけだったので、アプリによってできてたりできてなかったりという、振り返ってみると基礎知識の大事さを痛感する次第です。

重複を許さないキーはそのレコードを示す鍵になるので、その値をもとにデータの取得や変更・削除を行うようにします。
_idを使ってもいいですし、こちらで決めた任意のIDやコード(A0001みたいな)を持たせて管理してもいいです。

先ほどの例だと、作品テーブルのデータにはそれぞれ個別の「作品ID」を持たし、プロットには「プロットID」、チャットには「チャットID」を持たせるということです。

すなわち、チャットテーブルはこういう構成になります。
「チャットID」、「チャットコメント」、「作品ID」、「プロットID

要は何が言いたいかというと、チャットテーブルに「作品名」や「プロット名」といった名称では入れないということです。

もし名称で入れてしまうと、作品名を変更したときに、その作品に紐づくチャットデータを全て変更する必要が出てきます。
でもIDで持っていれば作品テーブルのそのデータだけ変更すればいいことになります。

コード上でもデータを操作するときは常にこのIDで行います。
このIDのものを取り出す、このIDに紐づくデータを探す、このIDのデータを変更/削除する、という感じで。

その他


何か伝えたかったことを書けたのかどうかわからなくなってきました・・・。

とりあえず上記以外で個人的な学びを最後にまとめます。

データを消すと困るようなら、消したことにする。

これは論理削除と呼ばれるもので、例えば表面上では削除したけど、実際のデータは削除したくないときに使います。
例えばdeleteとかいったカラムを加えて、そこに値が入っていれば削除とみなす。みたいにやります。

カラムもできるだけ分割する

テーブルと同じようにカラムもできるだけ分割しておくと後々困らないらしいです。
例えば名前カラムに「山田太郎」って入れてると、後で姓と名を分けたくなったときに困りますよね。
だから姓と名で別々のカラムで管理するとかいった感じです。

SQLiteの関数を知る

SQLにも便利な関数があります。合計値を取ったり、文字列を変換したり。
わざわざJavaで処理を書かずとも、SQLだけで出来ちゃうこともあったりします。
SQLite関数の使い方 - SQLite入門


おわり


今日は僕と同じように未経験からアプリを作るような方に向けて、DBのことについて書きました。
メモ帳のようにデータを扱うアプリは、公開してから「ちょっと一回消して作りなおそ!」というわけにはいかなくなるので注意が必要です。

でも逆にそれ以外のロジックやコードの汚さなんていうのは後からなんとでもなると思います。
なのでめちゃくちゃなコード書いてるなと思っても気にせず作り上げて、また色々知識や経験がついてきてから徐々に直していくといいと思います。


おわりです。
おやすみなさい。