オリジナルアプリ開発#3【DB設計】

現在、転職先の企業へのアピールポイントになるポートフォリオ作成（オリジナルアプリ開発）をしています。
私は、タスク管理ツールの完成を目指しています。

今回は、DB設計についてです。

##エンティティを洗い出す
エンティティ（実体）とは、ある共通項を持ったデータの集合体のこと。

「システムに必要なエンティティ（＝データ）は何か？」を洗い出していきます。


###機能

- サインアップ・サインイン機能
- リスト機能
- カード機能

これらの機能に必要なテーブルを以下のように抽出します。


###必要なテーブル

- usersテーブル
- listsテーブル
- cardsテーブル

これで必要なテーブルは決まりました。
次はそれぞれのテーブルに必要なカラムを決めるために、テーブルごとに管理する情報を考えていきます。

##テーブルごとに管理する情報

###usersテーブル
- ニックネーム
- メールアドレス
- パスワード

###listsテーブル
- リストタイトル
- user情報(外部キー)

###cardsテーブル
- カードタイトル
- カードの詳細
- list情報（外部キー）

全ての情報の関係性を考えます。
全ての情報をの関係を洗い出したら、テーブル設計を行います。
テーブル設計には、ER図を描きます。

Railsプロジェクト新規作成してから行います。
下の記事を参考にしてみてください！

https://qiita.com/kyohhh/items/811c189df254acfdb4a2


##ER図

<details><summary>ER図とは、データベース設計における代表的な設計図のことです。</summary>
ER図のEはエンティティ（Entity）の略で、Rはリレーションシップ（Relationship）の略です。

![ToDoList_ER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/c2b4b8ad-a099-9b7f-6286-c83cbd86da0e.png)



##READMEに設計情報を記述
<details><summary>README（リードミー）とは、ソフトウェアの仕様、規格、インストール方法などを文書化したアプリケーションの説明書のようなファイルです。</summary>
特徴として、rails newを実行した際に自動生成され、マークダウンと呼ばれる記述方法で記載されています。

今回、READMEには以下の内容を記述します。

- テーブル名
- カラム名
- カラムの型
- カラムのオプション（null false制約など）
- アソシエーション


```ruby:README.md
# テーブル設計

## usersテーブル

| Column             | Type   | Options     |
| ------------------ | ------ | ----------- |
| nickname           | string | null: false |
| email              | string | null: false |
| encrypted_password | string | null: false |

### Association

- has_many :lists

## listsテーブル

| Column     | Type       | Options                        |
| ---------- | ---------- | ------------------------------ |
| list_title | string     | null: false                    |
| user       | references | null: false, foreign_key: true |

### Association

- has_many :cards
- belongs_to :user

## cardsテーブル

| Column     | Type       | Options                        |
| ---------- | ---------- | ------------------------------ |
| card_title | string     | null: false                    |
| memo       | text       | null: false                    |
| prototype  | references | null: false, foreign_key: true |

### Association

- belongs_to :list

```

マークダウンを用いて記述すると、上記は以下の画像のように見た目が整った形で反映されます。
マークダウンが反映されているかどうかはGitHub等で確認します。

# テーブル設計

## usersテーブル

| Column             | Type   | Options     |
| ------------------ | ------ | ----------- |
| nickname           | string | null: false |
| email              | string | null: false |
| encrypted_password | string | null: false |

### Association

- has_many :lists

## listsテーブル

| Column     | Type       | Options                        |
| ---------- | ---------- | ------------------------------ |
| list_title | string     | null: false                    |
| user       | references | null: false, foreign_key: true |

### Association

- has_many :cards
- belongs_to :user

## cardsテーブル

| Column     | Type       | Options                        |
| ---------- | ---------- | ------------------------------ |
| card_title | string     | null: false                    |
| memo       | text       | null: false                    |
| prototype  | references | null: false, foreign_key: true |

### Association

- belongs_to :list


テーブル設計については以上です。
ER図の描き方やREADMEの記述方法については今回触れませんでしたが、今後、ご紹介できればと思っています！！



##参考
https://eh-career.com/engineerhub/entry/2018/06/22/110000

https://qiita.com/Qiita/items/c686397e4a0f4f11683d