【初心者にやさしい】CS(コンピューターサイエンス)基礎の基礎の学習：データベース

# CS(コンピューターサイエンス)基礎の基礎
現在、CS基礎の基礎を一から学んでいるので、その学習成果のアウトプットに、、、

## 今回は「データベース」

### 1. データベースとは
　データベースとは、「 __データの基地__ 」です。
　必要なデータを保存したり、取り出したりすることができる場所です。

### 2. とても便利な「リレーショナルデータベース」

　現在の主流と言えば、「 __リレーショナルデータベース__ 」。
　リレーショナルデータベースとは、 __各データを種類ごとに分け、相互の関係性を参照しながらデータを扱っていく方法を取ったデータベース__ のことです。
![カード型とリレーショナルデータベース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/95b0cf1b-452f-0796-2ffc-f6875893d681.png)
　従来は「 __カード型データベース__ 」という形式が使用されていましたが、このように一つのカードに全てのデータを詰め込む形式だと、例えばもしA社という名前が変更になった場合、A社に所属する人のカードを全て修正しなければなりません。
　一方、データを種類ごとに分けて管理するリレーショナルデータベースの場合なら、A社の名前を一回変更すれば良いことになります。
　このようなデータ連携方式の管理手法は大規模なデータベースになればなるほど役に立っていきます。

### 3. テーブル
　先ほど、リレーショナルデータベースは、「 __データを種類ごとに分ける__ 」と言いましたが、この分けられたものを「 __テーブル__ 」と呼びます。
　テーブルは、表形式でデータを管理するものであり、テーブル同士が相互に連携してリレーショナルデータベースを形作っています。
![○対○.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/071e0532-2c4e-630a-dc29-355d7c273db5.png)
　上の図を見ると、「会社名」一つに対し、多くの「名前」が紐づいていることが分かります。このようにテーブル同士には、「 __1対多__ 」などの関係性が生じます。データベース設計においては、この関係性を明確に示しておくことが必要になります。

### 4. DBMS(Data Base Management System)
　実際にデータベースを設計していく際には、一から手動で設計するよりも、 __ソフトウェアとして提供されているDBMSを利用__ した方が、安全で効率的です。広く知られているDBMSには、OracleDB、MySQL、PostgreDB、DB2などがあります。私はいつもMySQLを使用しております。
　このDBMSを使用することにより、自分の手で一からデータベースを設計していじるよりも、より安全に矛盾なくデータベースを保つことができるようになります。
![DBMSの役割.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/c156ecbd-c24f-94a5-d221-c5ac8fcdd4fa.png)

### 5. 基本的なデータベースの設計手順
　ここからは、基本的なデータベースの設計手順を示していきます。
　私が作成した「haiker575」という俳句投稿アプリケーションを例に、データベース設計の手順を解説していきたいと思います。

#### 5-1. 必要なデータの洗い出し(何が知りたいのか)
　まずは、システム開発にあたり、「 __何が知りたいのか__ 」ということを明確にし、データを洗い出していきます。
　私の「 __俳句投稿アプリケーション__ 」の場合は、大きく分けると、

　●ユーザーに関するデータ
　●投稿する俳句に関するデータ

の2つが知りたいというようになります。さらに、それぞれに関して具体的に何が知りたいのかを洗い出すと、

　●ユーザーに関するデータ
　　・名前
　　・プロフィール
　　・メールアドレス
　　・ログインパスワード

　●投稿する俳句に関するデータ
　　・俳句
　　・説明文
　　・画像

というように洗い出すことができました。

:::note warn
必要なデータの洗い出しの段階で、本当に必要なデータをもれなく洗い出すことができているかどうかや、余計なデータはないかどうかということを全てチェックするのは難しいことです。実際に後の段階でデータベースを再設計しなければならなくなることもあります。
:::

#### 5-2. データの属性を決める
　必要なデータが洗い出せたところで、次に「 __データの属性__ 」を決定します。「 __属性__ 」とは、「そのデータがどのような型のデータとして扱われるのかや、保存する際の条件はどうするのか」などを定めたものになります。
![テーブル設計（非正規化).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/1262d15b-77c6-8b38-ab0b-1e1f55033aa5.png)
　ひとまず、データ名とデータ型、保存可能な長さなどを指定し、テーブル名を「haiku」として作成します。
![テーブル設計②(正規化前).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/e313bdff-b183-5165-e9bf-8d75ff3380b1.png)
　しかし、今のテーブルの状態でデータを保存してみると、例えば上の表のような保存の仕方になってしまいます。
　このようなテーブル構造では、「 __重複したデータ__ 」が数多く見受けられます。もし、名前を変更したいとなった場合、全ての箇所の同一の名前を変更しなければならなくなります。
　データの重複があるテーブル構造では、非常に安全性の低いデータベース構造に陥ることになるのです。
　そのような状態を避けるためにも、「 __正規化__ 」というものを行う必要があります。

#### 5-3. 正規化(重複を避けたテーブル設計)
　__「正規化」__　とは、テーブルを分割することでテーブル同士をリレーションシップで繋ぎ、データベースを整理することを指します。
　こうすることで、「カード型データベース」のような煩わしさを取り除くことができます。
　正規化の際のポイントは「 __重複したデータに着目してテーブルを分割すること__ 」です。
![テーブル設計③(重複確認).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/95461b74-d914-cb6d-73a4-4a5a92a492ad.png)
　先ほどのテーブルを確認すると、ユーザーに関するデータのところで重複が見受けられます。ということで、これらのデータを別のテーブルに移した方がいいでしょう。
![テーブル設計④(正規化完了).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/2d26485f-3a9d-6a8b-6eb7-ec75d2f83d87.png)
　この場合は、ユーザーに関するデータを分離し、新たに「 __userテーブル__ 」というものを作成しました。
　この時、ただテーブルを分けるだけでは、肝心の「リレーションシップ」を組むことができません。それを成し遂げるために必要なのが、「 __主キー__ 」と「 __外部キー__ 」です。

　__主キー__ とは、「 __それが分かればどのレコードなのかが特定できる値__　」を指します。「 __レコード__ 」とは、保存されたデータ一列分のことを指します。上の図で言えば、「id = 1」という主キーで、俳句太郎さんに関するユーザーデータが保存された一列を特定できるということです。
　__外部キー__ とは、「 __リレーションシップを形成するために参照する値__ 」のことを指します。
　![リレーションシップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/330e3b50-cbcb-120e-8ce0-928c7b39c55b.png)
　外部キーを設定する際は、「リレーションシップ」において、「 __多数側__」になるテーブルに設定するのが基本です。今回で言えば、haikuテーブルに外部キーを設定することになります。こうすることで、ユーザーに関するデータを操作する時に、それに紐づいたhaikuテーブルのデータを簡単な操作で扱うことができるようになります。

#### 5-4. ユーザーインターフェースを作成し、データベース操作を可能にする(SQL文)
　ここまでできたら、実際にユーザーがデータを入力するためのビューを設計していきます。
　この時、データベースに対する操作として、「保存」や「更新」、「削除」、「取得」などの基本的な操作を決定します。
　普段ユーザーとして何気なくデータを入力し、「保存」などのボタンを押せばデータが保存されるわけですが、その裏では、「 __SQL文__ 」という言語が働いて、実際にデータベースを操作しているのです。
　SQLはほぼ全てのDBMSで対応しているものであります。以下はSQL文の基本的な構文です。
![データベースSQL文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/27aa4575-4727-e93e-a8dc-3f32fb223815.png)
　実際にプログラミングをしてアプリケーションを作成する際は、自分で一からSQL文を書かなくてもよい場合があります。
　私はRubyを使用してアプリケーションの実装を経験していますが、その際はフレームワークであるRuby on Railsを使用しました。Ruby on Railsでは、データベースとのやりとりを担当する「 __モデル__ 」という機能がついており、これのおかげにより、Ruby言語で書いたコードをSQL文に変換してデータベースを操作してくれるようにできます。

:::note warn
あくまで上の図は例を示したものです。
:::

### 6. 学び
　Ruby on Railsを用いたアプリケーション実装において、データベースに関しては一通り学んでいましたが、今回再度じっくりと学び直すことができました。自分で一からSQL文を書いて操作することは少なくなっていくかもしれませんが、こういう仕組みになっているんだということをしっかりと理解しておきたいと思います。
　また設計の段階での「正規化」などはしっかりと使いこなせるようにしていきたいと思います。