大吾「データベースとER図ってなんじゃ！」


## データベースとは？


- 大悟
ノブ、データベースって何？

- ノブ
大悟、データベースってのはさ、データを管理・蓄積する仕組みのことやで。アプリやサイトで使うデータを効率的に扱えるようにするんや。

## ER図とは？


- 大悟
で、ER図ってなんなん？
- ノブ
ER図は、`Entity Relationship Diagram`の略で、データベースの構造を視覚的に表す図のことや。これを使ってデータ同士の関係性を整理してデータベース設計を行うんや。

## データベース設計のポイント

### データベース設計における重要なポイント
- 大悟
ノブ、データベース設計って何が大事なん？

- ノブ
大悟、いい質問やな。データベース設計で大事なのは、正規化やリレーションの設定、適切なデータ型の選択やインデックスの設定などやで。

- 大悟
正規化ってなんや？

- ノブ
正規化っていうのは、データベースの構造を効率的にするために、テーブルのデータを分割して、重複をなくすことや。

- 大悟
リレーションって？

- ノブ
リレーションは、テーブル同士の関係性を表すんや。例えば、ユーザーが商品を出品するアプリだったら、ユーザーテーブルと商品テーブルが関連付けられるようにリレーションを設定するわけや。

- 大悟
で、データ型って？

- ノブ
データ型は、データベースに保存するデータの種類を表すんや。例えば、整数型や文字列型、日付型とか。これを適切に選択することで、データを効率的に管理できるんや。
- 大悟
インデックスって何？
- ノブ
インデックスは、データベースの検索速度を向上させるための仕組みや。データの並び順を記録しておくことで、検索が早くなるんや。ただ、インデックスを設定すると、データの追加や更新が遅くなる場合もあるから、適切な設定が大事やで。
- 
## 実践例：フリーマーケットアプリのデータベース設計

#### フリーマーケットアプリのデータベース設計を題材にした実践例を紹介
- 大悟
ノブ、じゃあ実際にフリーマーケットアプリのデータベース設計をしてみたいんやけど、どうすればいい？

- ノブ
いいんちゃう？フリーマーケットアプリのデータベース設計は、ユーザー管理機能や商品出品機能、商品購入機能などのテーブルが必要になるから、それぞれのテーブルの設計を考えてみようや。

- 大悟
ユーザーテーブルには、ユーザーIDとか名前とかメールアドレスとかが必要やろ？

- ノブ
そうや！他にもパスワードや住所などの情報も必要になるで。

- 大悟
商品テーブルには、商品名や説明、値段とかが必要やな？

- ノブ
ああ、それに加えて出品者IDやカテゴリーID、商品の状態や配送方法なども必要やで。

- 大悟
購入履歴テーブルはどんな感じにすればいいん？

- ノブ
購入履歴テーブルは、購入者ID、出品者ID、商品IDなどの情報を持っておくといいで。これで、誰がどの商品を購入したかが分かるようになるんや。

- 大悟
ノブ、具体的な例で教えて！

- ノブ
仕方ないのお、例えばフリーマーケットアプリのデータベース設計やったら、ユーザー、商品、購入履歴などのテーブルが必要になるわな。それぞれのテーブル間のリレーションをER図で表現して、データベース設計を行うんじゃ

- 大悟
じゃあ、ER図を書く流れを教えてくれ！

- ノブ
おっけー。まず、全てのテーブルとそのカラムをリストアップするんや。それから、テーブル同士の関係を線で繋いでいくで。

- 大悟
関係って何？

- ノブ
関係ってのは、一つのテーブルのデータが他のテーブルのデータとどんな関係があるのかってことや。例えば、ユーザーと商品の関係は「1対多」やな。1人のユーザーが複数の商品を出品できるから。

- 大悟
ユーザーテーブルは、ユーザーID、名前、メールアドレス、パスワード、住所とかが必要やな。

- ノブ
せや。それに加えて、商品テーブルには、商品ID、商品名、説明、値段、出品者ID、カテゴリーID、商品の状態、配送方法とかが必要や。

- 大悟
じゃあ、購入履歴テーブルは、購入者ID、出品者ID、商品IDなどの情報を持っておくんやな？

- ノブ
ああ、そうや。これで誰がどの商品を購入したかが分かるようになるで。
```
[User]                [Product]                  [Purchase]
+ user_id [PK] <-----+ seller_id [FK]         + buyer_id [FK]
+ name                + product_id [PK] ------>+ product_id [FK]
+ email               + product_name           + seller_id [FK]
+ password            + description
+ address             + price
                      + category_id
                      + condition
                      + shipping_method

```
## markdown形式("databese.yml"に記述するもの)
```

## ER図

### User

| Column    | Type    |
| --------- | ------- |
| user_id   | integer |
| name      | string  |
| email     | string  |
| password  | string  |
| address   | string  |

### Product

| Column          | Type    |
| --------------- | ------- |
| product_id      | integer |
| product_name    | string  |
| description     | text    |
| price           | integer |
| seller_id       | integer |
| category_id     | integer |
| condition       | string  |
| shipping_method | string  |

### Purchase

| Column     | Type    |
| ---------- | ------- |
| buyer_id   | integer |
| product_id | integer |
| seller_id  | integer |

```
### 実際の見え方(READE.MEにはこう映る)
### User

| Column    | Type    |
| --------- | ------- |
| user_id   | integer |
| name      | string  |
| email     | string  |
| password  | string  |
| address   | string  |

### Product

| Column          | Type    |
| --------------- | ------- |
| product_id      | integer |
| product_name    | string  |
| description     | text    |
| price           | integer |
| seller_id       | integer |
| category_id     | integer |
| condition       | string  |
| shipping_method | string  |

### Purchase

| Column     | Type    |
| ---------- | ------- |
| buyer_id   | integer |
| product_id | integer |
| seller_id  | integer |

- ノブ
このようにmarkdown形式だと、表形式で表せることができるんやで！ただテーブル間の関係性を表現する線はMarkdown形式では直接書くことはできんのじゃ。せやから、テーブル間の関係性については文章で説明することが望ましい。

## まとめ
- ノブ
「データベース設計で大事なポイントは、正規化やリレーションの設定、適切なデータ型の選択、インデックスの設定などがあるど。これらを理解し、効率的なデータベース設計ができるようになると、アプリやサイトの開発がスムーズに進むじゃろ」