最近社内向けの書籍管理システムを空いた時間を見つけて開発したりしています。書籍の管理と言えばブクログさんとかが思い浮かぶと思います。おおよそ同じような機能が欲しくてちょっと再発明的な感じではありますが、そこに貸出機能が欲しかったり電子書籍端末等を扱いたいという社内の要望に細かく対応できることと、Ruby2.0 とRails4 に慣れるのを含めて開発しています。これから開発の流れを何回かに渡って軽い感じで書いていきたいと思います。
何をしたいか
いわゆる要件定義というものですね。目的がはっきりしていないと途中で何を作ってるのか分からなくなったり、出来上がったものが使いものにならないことなんてよくあることです。
今回のシステムには最低限で
- 社内にある書籍を登録・管理し、検索できること
- 書籍の貸出機能
- 電子書籍も管理できること
が求められていました。
もちろんこの他にも色々追加機能要望が出てきましたが、最初はこれらの機能を実装する方向で動きました。最低限でもまずは動くものを作る、です。
どうやって実現するか
要件がまとまったら続いて設計ですね。上記の機能を実装するにあたって、まず大まかに必要なDB のテーブルを洗い出しました。
- ユーザ
- 書籍(電子書籍を含む)
- 貸出明細
- 電子書籍アカウント
- 電子書籍端末
テーブルの解説
それぞれのテーブルと関係について軽く説明します。
ユーザ
ユーザはこのシステムの利用者です。本を追加したり、貸出申請をしたりするのに必要になります。権限レベルによって操作できる範囲を制限したりすることを想定していますが、それは次回以降にまとめたいと思います。
書籍
電子書籍を含む、本の情報を保持します。電子書籍かどうかはフラグを持たせて判断します。
貸出明細
貸出明細は1 回貸し出されるごとに生成されるものです。誰が何の本をいつ借りたかが分かるような情報を持ちます。
電子書籍アカウント
Kindle でのAmazon のアカウントをイメージしています。電子書籍であればいずれかの電子書籍アカウントに紐付いている必要があります。
電子書籍端末
電子書籍端末と電子書籍アカウントを分けたのはKindle を参考にして作成したためです。Kindle では1 つのアカウントで複数の端末を利用することが可能です。ただし全ての端末で同じ本がダウンロードされているというわけではありません。なので端末ごとに今ある電子書籍の情報を持つようにしました。サービスによってはここは仕組みが違うみたいなので、仕様を変更した方が良い場面も出てくるかもしれません。
図にまとめてみた
図にまとめるとどうやって作れば良いか、今作っているものは間違っていないか等よりわかりやすくなったりします。
今回のシステムは大体以下の図ような関係で構築することにしました。中間テーブルは必要に応じて作ります。
上では述べませんでしたが、本を追加した際に誰が追加したかも一応保存するようにしました。何に使うかは考えていません。
少し設計で悩んだのは、電子書籍アカウントと電子書籍端末とで関連性を持たせなかった点です。これは電子書籍端末とアカウントの管理よりもまずは本の管理を重視した結果です。もちろん今後変更することはあり得ますので、あくまで最初に考えたものです。
その1 のまとめ
とりあえずデータの持ち方を大まかに決めたところまででひとまずその1 を締めたいと思います。上記設計を元にmigration やmodel を作ると、今度はcontroller の実装にとりかかることになります。実装についてはその2 で書きたいと思いますが、しかし実装では特に特別なことをしていないし、何を書けば良いのでしょうかね…悩みます(苦笑)
使ったgem とかまとめていけば良いのかな…何かコメント等頂いたらそれにお応えしたいと思います。