データベース設計、意外と楽ができるぞって話

## データベース設計に挑戦してみた
｢番組情報を管理するデータベース」をテーマに、テーブル設計からデータ入力、インデックス設定までを実際にやってみました。
phpmyadminを導入するだけでSQL文をほとんど書かずにデータベースが出来たので、そこも含めてシェア。｢データベース作るのって難しそう･･･｣って思ってる初学者の助けになれば幸いです。

## phpMyAdminとは？
phpMyAdminは、MySQLやMariaDBをブラウザから管理できる便利なツールです。初心者にとっては特に頼もしい存在で、SQLを直接入力せずに、クリック操作でデータベースの作成やテーブルの設定、データの挿入・削除・更新ができるので、データベース操作がスムーズに進みます。

## phpMyAdminの導入方法
データベース操作を効率化してくれるphpMyAdminですが、最初にインストールする必要があります。今回は、Linux（Ubuntu）にphpMyAdminを導入する方法を紹介します。なお、MacやWindowsでは、MAMPやXAMPPを使うとphpMyAdminがすでにインストールされているので、すぐに使い始められます。

### インストール手順
1. **phpMyAdminのインストール**  
   ターミナルで以下のコマンドを実行して、phpMyAdminをインストールします。
   
   ```bash
   sudo apt update
   sudo apt install phpmyadmin
   ```
インストール中にWebサーバー（ApacheやNginx）を選択し、データベースの設定も行います。パスワードなどは忘れないようにメモしておきましょう。

2.**phpMyAdminのアクセス設定**
Apacheを使っている場合、次のコマンドでphpMyAdminへのアクセスを有効にできます。

```bash
sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
```
3.**phpMyAdminにログイン**
ブラウザで http://localhost/phpmyadmin にアクセスし、インストール時に設定したユーザー名とパスワードでログインします。ログイン後、データベースの管理画面が表示され、データベース操作が始められます！

※起動するまでにエラー吐いたり上手くいかない場合はChatGPTにエラー文まるまる投げれば解決してくれるんで楽しましょう

## 1. 準備完了、テーブルを考える
まずはデータベースで管理したい項目を洗い出しましょう。
今回なら「チャンネル」「番組」「エピソード」「ジャンル」など。


## 2.カラムを考える+正規化
ここがおそらく一番時間のかかる部分です。
洗い出しが終わったら、各テーブルにどんなカラムが必要かを考える。
その際にデータベースの正規化を済ませましょう。
基本的に第三正規化まで必ず行っていればデータに重複が生まれるといった不都合は起きなくなります。

正規化とはそもそも何ぞ？って方はyoutubeとかChatGPTででも調べてみてください。
いろんな分かりやすい回答が転がっています。


phpMyAdminを使えばER図(テーブル同士の関係を示す図)の作成も勝手にやってくれるんで、視覚的に自分の正規化が間違っている場合は明らかにおかしい図になります。
この｢見える｣っていうのが初学者にとっては何よりありがたい。

## 3. 設計通りに作る
正規化が無事できたら、考えた設計に基づいて各テーブルを作成します。
phpMyAdminを使うと、SQL文を細かく手書きせずに、GUIでテーブルやカラムを設定できるのが便利です。
マウスカチカチしてるだけで各テーブルが完成してました。
テーブルの設定では、特に以下のカラムを注意して設計しました。

- **主キー（PRIMARY KEY）**：各テーブルでデータを一意に識別できるように設定。
- **外部キー（FOREIGN KEY）**：他のテーブルとの関係を設定（phpMyAdminで視覚的に設定できるため、初学者でも迷わず進められました）。

実際に作った中で一つ、各エピソード情報のテーブルをご紹介。
**エピソードテーブル**
| カラム名         | データ型     | NULL | キー    | 初期値 | AUTO INCREMENT | 説明           |
|------------------|--------------|------|---------|--------|----------------|----------------|
| episode_id       | INT          | NO   | PK      |        | YES            | エピソードID   |
| program_id       | INT          | NO   | FK      |        | NO             | 番組ID         |
| episode_name     | VARCHAR(100) | NO   |         |        | NO             | エピソード名   |
| season_number    | INT          | YES  |         |        | NO             | シーズン数     |
| episode_number   | INT          | YES  |         |        | NO             | エピソード数   |
| movie_length     | TIME         | NO   |         |        | NO             | 動画時間       |
| release_date     | DATE         | NO   |         |        | NO             | 公開日         |
| episode_detail   | TEXT         | NO   |         |        | NO             | エピソード詳細 |

phpMyAdminを使えば主キーもプルダウンから選択するだけ、テーブル同士の結合も簡単操作。
データベースの大枠を作るまでの工程は正規化さえしっかりできていれば超簡単に終わります。
## 4.データの挿入、編集、削除
あとは中身を入れていけばデータベース完成。これに関してもGUIを操作するだけで簡単にできるんですが、複数のデータを操作する場合はさすがにSQL文を書いたほうが勝手がいいので、ここでは簡単なSQL文を使ったデータの操作方法を紹介します。
### データ挿入
エピソードテーブルに新しいエピソード情報を複数追加するには、`INSERT INTO`文で複数の`VALUES`をカンマで区切って指定します。

```sql
INSERT INTO episode (program_id, episode_name, season_number, episode_number, movie_length, release_date, episode_detail) 
VALUES 
(1, 'エピソード1', 1, 1, '00:24:00', '2024-01-01', 'エピソード1の詳細'),
(1, 'エピソード2', 1, 2, '00:24:00', '2024-01-08', 'エピソード2の詳細'),
(1, 'エピソード3', 1, 3, '00:24:00', '2024-01-15', 'エピソード3の詳細');
```
### データ編集
複数のエピソード情報を一度に更新する場合、`UPDATE`文に`WHERE`句を使って条件を指定し、それに一致するすべての行を更新します。
```sql
UPDATE episode 
SET episode_detail = '更新されたエピソード1の詳細' 
WHERE episode_id = 1;

UPDATE episode 
SET episode_detail = '更新されたエピソード2の詳細' 
WHERE episode_id = 2;
```
### データ削除
複数のエピソードを一度に削除するには、`DELETE`文に`WHERE`句で複数の条件を指定します。

例えば、特定の番組IDに属するすべてのエピソードを削除するには以下のようにします：

```sql
DELETE FROM episode 
WHERE program_id = 1;
```
また、特定のエピソードIDをリストで指定して削除する場合は、IN句を使うと便利です。
```
DELETE FROM episode 
WHERE episode_id IN (1, 2, 3);
```
## おまけ. インデックスの設定

### インデックスとは？
一言でいうなら｢目次｣です。インデックスを設定しておくと、検索の際にデータベースが直接そのインデックスを参照して必要なデータを見つけやすくなるため、処理速度が向上します。
ただ設定しすぎると今度は書き込みが遅くなるという欠点もあるので何にでも設定すればいい、というものでもない。
### インデックスを設定する場面
例えば、エピソードテーブルで「エピソードID」や「公開日」で検索することが多い場合、それらのカラムにインデックスを設定すると検索速度が上がります。

### phpMyAdminを使ったインデックスの設定方法
phpMyAdminを使えば、インデックスの設定も簡単です。次の手順でインデックスを追加できます。

1. **インデックスを追加したいテーブルを選択**
   phpMyAdminで、インデックスを設定したいテーブルを開きます。

2. **「構造」タブでインデックスを設定するカラムを選択**
   「構造」タブから、インデックスを設定したいカラムを探し、右端にある「インデックス」ボタンをクリックします。

3. **インデックスの種類を選択**
   インデックスには、通常のインデックス（INDEX）、ユニークインデックス（UNIQUE）、プライマリキー（PRIMARY）などがあります。用途に応じてインデックスの種類を選択しましょう。

4. **インデックスを作成して保存**
   インデックスの設定が完了したら、「保存」をクリックするだけで完了です。設定後はphpMyAdminの「インデックス」タブから確認できます。

複数のカラムの組み合わせにユニークキーを設定したい時もチェックボックスを選択して｢ユニーク｣を選択するだけ。超簡単です。

## まとめ
データベース設計、というよりSQLに割と苦手意識がそれまではあったんですけどそんな悩みとはいったんオサラバできそうです。直感的に操作できてテーブル作成やインデックスの設定が視覚的に行えるため、設計の意図が頭の中で整理しやすかったです。

phpMyAdminを使うことで、データベース設計に自信が持てるようになり、作業が楽しくなったのが大きな収穫です。次は、もっと複雑なテーブルやデータ管理にも挑戦してみたいなぁと。
データベースって分野はどうしてもエンジニアを目指すうえで避けて通れないので、もし苦手意識を僕と同じように持ってる方がいたらぜひ使ってみてください。