HottyDB（検索エンジン＋レコメンドエンジン＋RDBMS）を個人開発するために読んだ書籍紹介！

# この記事の概要
筆者は、HottyDBという検索エンジンとレコメンドエンジンの機能を搭載したRDBMS（リレーショナルデータベース）を個人開発しています。
この記事では、HottyDBを開発するにあたって勉強した書籍を紹介したいと思います！

ちなみに、HottyDBについて詳しく解説した記事もアップしていますので、こちらもあわせてご覧ください！

https://qiita.com/toru1055/items/0fe400989373823e9c78

# 読んだ本を紹介

## ざっくり分類すると、
読んだ本をざっくりと分類するとこんな感じになります。

| 分類 | 説明 |
| --- | --- |
| データベースの基礎 | データベースの実装方法の大枠を掴む |
| データベースの実装 | データベースの実装方法の詳細 |
| コンパイラ系 | データベースはSQLで操作するので、SQLを解釈するためにコンパイラの知識も必要 |
| Java | Javaによるマルチスレッドプログラミングやネットワークプログラミングの方法を勉強|
| アルゴリズムとデータ構造 | データベースはインデックスで木構造を持っていたり、マージソートを自前実装する必要があるので、復習も兼ねて勉強 |
| 検索エンジン | 検索エンジン機能を実装するため |
| 情報推薦 | レコメンデーション機能を実装するため |

## データベースの基礎
データベースシステムの基礎を学習するために読んだ本を紹介していきます！

https://www.shoeisha.co.jp/book/detail/9784798157696

https://www.shoeisha.co.jp/book/detail/9784798158723

まずはこの２冊です。「絵で見てわかる」シリーズで、大枠の構成を捉えるのに最適な２冊だと思います。
難しさもOracle < SQL Serverなので、この順番で読むことをお勧めします。

続いて、

https://www.ohmsha.co.jp/book/9784274225161/

こちらの本です。この本は教科書的にデータベースシステムの全体像を把握するのにいいと思います。

## データベースの実装 
続いてデータベースシステムの詳細な実装方法を学ぶために読んだ本を紹介します。

https://www.oreilly.co.jp/books/9784873119540/

こちらの本は正直めちゃめちゃ難しかったです。。。あんまり理解できてません。
特に後半は分散トランザクションに関することでサッパリよく分かりませんでした。
前半部分で通常のデータベース実装に関する解説があるので、そちらはとても参考にしました。

https://link.springer.com/book/10.1007/978-3-030-33836-7

続いてはこちらの英語の本です。普通のデータベース作るだけならこの本で十分です。英語なので一番最後に読んだんですが、この本だけで良かったんじゃないかと思えてしまうほど必要十分な解説をしてくれます。

## コンパイラ系
続いてコンパイラ系の本です。SQL文を解釈し、目的のアクションを取るためにはコンパイラ的な言語処理系が必要になります。
この辺、サッパリどうやればいいのか分からなかったので、何冊か読んで勉強しました。

ただ、SQLを解釈するための言語処理は比較的単純だったため、プログラミング言語のコンパイラを勉強する必要はなかったかもしれません。先ほどの英語の本でSQLの構文解析周りの解説もあるので。

しかし！コンパイラを勉強したことは私の血となり肉となることは間違いないでしょう！！

https://www.ohmsha.co.jp/book/9784274133084/

https://www.ohmsha.co.jp/book/9784274221163/

https://www.sbcr.jp/product/4797337958/

この辺を読みました。字句解析や構文解析の方法は１,2冊目の本はサンプルコードも載ってるので、分かりやすいと思います。
３冊目の本はJavaCCというツールを使って、文法を記述すれば自動的にParserプログラムを作ってくれるものを使います。本格的にプログラミング言語作ろうとすると、こういうの使わないとちょっとしんどいんだろうなという印象です。

SQLレベルであれば、先ほども言いましたが、英語のデータベース本の解説で十分だと思います。

## Java
### マルチスレッドプログラミング
データベースは1つのサーバーに複数クライアントが同時接続するので、マルチスレッドの並行プログラミングが必須となります。
データベースシステム内のトランザクション管理機構もそうですし、検索エンジンやレコメンドエンジン機能を提供する際もマルチスレッドを意識した実装をする必要があるため、基本を押さえておく必要があります。

https://honto.jp/netstore/pd-book_02733167.html

この本はマルチスレッドプログラミングの基本的な気をつけるべき項目をかなり詳細に説明してくれています。マルチスレッドのダメな書き方をいくつも紹介してくれるんですが、「これもダメなの？」と思うような例も結構あり、勉強になります。ただ、翻訳本ということもあり少々読みづらいです・・・。


続いての本はこちらです。

https://honto.jp/ebook/pd-series_B-MBJ-20071-120551319-001-001.html

こちらの本はとても分かりやすく読みやすかったです！まずこっちを先に読んだ方が良かったかもしれません。
マルチスレッドプログラミングの基本を最初に紹介し、その後デザインパターンをいくつも紹介していきます。
ただ、この本700ページ以上ある大型本で、鈍器のような重さです・・・。電子版の方がいいかもしれません。

### ネットワークプログラミング
データベースはネットワークを通じて接続できるクライアント・サーバー型のソフトウェアなので、ネットワークプログラミング（ソケットプログラミング）についても簡単に勉強しました。

https://www.ohmsha.co.jp/book/9784274065200/

ただし、実際の実装にはRMIを使ったので、HottyDBの実装には生のソケット実装は利用していません。
今後Java以外のクライアントから接続しやすいように生のソケット実装も必要になるかもしれないので、知識としては持っておいて良かったと思います。

## アルゴリズムとデータ構造
データベースを実装するには多少なりともアルゴリズムやデータ構造の知識はあった方がいいと思います。
データベースのインデックスは木構造のインデックスを実装することが多いですし、マージソートなどを自前で実装する必要があります。

https://www.kspub.co.jp/book/detail/5128442.html

こちらの本は一般的なアルゴリズムとデータ構造の本ですが、とても読みやすく分かりやすかったです。
B木の解説などはありませんが、二分探索木の解説などはあるので参考になります。
何より頭の体操になるのがいいですね。

## 検索エンジン
次に、検索エンジン機能を実装するために読んだ本を紹介します。

https://honto.jp/netstore/pd-book_25968118.html

まずこちらの本は、利用者目線で検索エンジンに必要そうな機能を知るために読みました。
なので、最新は第3版が出てるんですが、中古で第2版を買いました（安かったので）。
今後の機能拡張の参考にしようと思っています。

https://honto.jp/ebook/pd-series_B-900251-0000-000166.html

続いての本はこちらです。まさにドンピシャという感じです。
検索エンジンの実装には転置インデックスと呼ばれるデータ構造を構築する必要があります。
効率的な文書検索の方法を実装を交えて解説してくれていて、とても参考になりました。

https://www.kspub.co.jp/book/detail/1529038.html

HottyDBの検索エンジン機能は、検索結果の並び順を最適化するために機械学習ランキングを実装しています。
その機械学習ロジックは、オンライン機械学習を利用しているためこの本を参考にしました。
現状HottyDBはシンプルなSGDというアルゴリズムで学習していますが、この本にはより高度なアルゴリズムも紹介されていますので、今後の改善にも活かせると考えています。

https://honto.jp/netstore/pd-book_29515500.html

最後にちょっと毛色が違いますが、自然言語処理の教科書的な勉強もしました。
情報検索は自然言語処理の応用の１つということで読みましたが、大枠捉えられて良かったです。
今後、HottyDBは形態素解析なども取り入れていきたいので、今後の参考にもなると考えています。


## 情報推薦
最後に、レコメンデーション機能を実装するにあたり、情報推薦の本も読みました。

https://www.kyoritsu-pub.co.jp/book/b10008169.html

この本は、協調フィルタベースの推薦から、コンテンツベースの推薦、それらのハイブリッドなど幅広く解説しており勉強になります。


# 最後に
以上の書籍を拝読し、HottyDBというソフトウェアを個人開発することができました。
全ての本を読む必要はなかったと思いますが、最初の半年はインプットに専念しようと決めていたのでこれくらいの寄り道は良かったんじゃないかと思っています。


最後に、繰り返しになりますが、HottyDBについて詳しく解説した記事もアップしていますので、こちらもあわせてご覧ください！

https://qiita.com/toru1055/items/0fe400989373823e9c78

# おまけ
せっかくなので記念写真です（全部ではないですが）。
![books.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30697/2332c05e-746e-2299-ac21-3a6d4d633052.png)