MongoDBで作る群馬県民のためのアプリ、基盤が固まった日！

# 開発日記11日目：データベース設計完成！Gunma Naviの情報が形になり始めました！📊✨

群馬県民がもっと地元イベントを楽しめるように！イベント発見アプリ「**Gunma Navi**」を個人開発している🐮です！

---

🎮 **今日達成した"ゲームで言うと"**

「重要アイテムを入手して、次のステージへの扉が開いた状態」🔑🚪

---

🌟 **今日のハイライト**

✅ データベースのテーブル設計完了！

✅ 各テーブルのカラムとデータ型を決定！

✅ データベース構築の土台が完成！

---

🛠 **今日の作業内容**

1. **データベースのテーブル設計**

   昨日設計したデータモデルを元に、具体的なデータベースのテーブル設計を行いました。使用するデータベースは**MongoDB**なので、正確にはコレクションとドキュメントの設計ですね。

   - **ユーザーコレクション**

   - **イベントコレクション**

   - **コメントコレクション**

   - **カテゴリーコレクション**

   - **お気に入りコレクション**

   - **場所コレクション**

2. **各テーブル（コレクション）のカラム（フィールド）とデータ型の決定**

   各コレクションのフィールドと、そのデータ型を詳細に定義しました。

   - **ユーザーコレクション**

     | フィールド名        | データ型       | 説明                 |
     |---------------------|----------------|----------------------|
     | `_id`               | ObjectId       | 主キー               |
     | `username`          | String         | ユーザー名            |
     | `email`             | String         | メールアドレス         |
     | `password`          | String         | パスワード（ハッシュ化）|
     | `created_at`        | Date           | アカウント作成日時     |

   - **イベントコレクション**

     | フィールド名       | データ型       | 説明                      |
     |--------------------|----------------|---------------------------|
     | `_id`              | ObjectId       | 主キー                    |
     | `event_name`       | String         | イベント名                 |
     | `description`      | String         | イベント詳細               |
     | `start_date`       | Date           | 開始日時                  |
     | `end_date`         | Date           | 終了日時                  |
     | `category_id`      | ObjectId       | カテゴリー参照ID（外部キー）|
     | `location_id`      | ObjectId       | 場所参照ID（外部キー）     |
     | `created_at`       | Date           | イベント登録日時           |

   - **コメントコレクション**

     | フィールド名     | データ型       | 説明                        |
     |------------------|----------------|-----------------------------|
     | `_id`            | ObjectId       | 主キー                      |
     | `user_id`        | ObjectId       | ユーザー参照ID（外部キー）     |
     | `event_id`       | ObjectId       | イベント参照ID（外部キー）    |
     | `comment_text`   | String         | コメント内容                 |
     | `rating`         | Number         | 評価（1〜5）                |
     | `created_at`     | Date           | コメント投稿日時             |

   - **カテゴリーコレクション**

     | フィールド名       | データ型       | 説明               |
     |--------------------|----------------|--------------------|
     | `_id`              | ObjectId       | 主キー             |
     | `category_name`    | String         | カテゴリー名        |
     | `created_at`       | Date           | カテゴリー登録日時   |

   - **お気に入りコレクション**

     | フィールド名   | データ型       | 説明                     |
     |----------------|----------------|--------------------------|
     | `_id`          | ObjectId       | 主キー                   |
     | `user_id`      | ObjectId       | ユーザー参照ID（外部キー）|
     | `event_id`     | ObjectId       | イベント参照ID（外部キー）|

   - **場所コレクション**

     | フィールド名   | データ型       | 説明                 |
     |----------------|----------------|----------------------|
     | `_id`          | ObjectId       | 主キー               |
     | `address`      | String         | 住所                  |
     | `latitude`     | Number         | 緯度                  |
     | `longitude`    | Number         | 経度                  |
     | `access_info`  | String         | アクセス方法          |
     | `created_at`   | Date           | 場所登録日時          |

---

🔍 **テーブル設計のポイント**

1. **データ型の選定**

   - 日付や日時はすべて`Date`型で統一し、時間帯によるイベントのフィルタリングを容易にしました。
   
   - 緯度経度は`Number`型で保存し、地図表示や位置情報検索に対応。

2. **パフォーマンスを意識した設計**

   - 頻繁に検索されるフィールド（`event_name`や`category_id`など）にはインデックスを設定予定。
   
   - ユーザーのパスワードはセキュリティを考慮し、ハッシュ化して保存。

3. **将来の拡張性**

   - 必要に応じてフィールドを追加できるよう、MongoDBのスキーマレスな特性を活かした設計。
   
   - `お気に入りコレクション`を中間コレクションとすることで、多対多の関係を柔軟に管理。

---

🗾 **群馬愛ある開発のこだわり**

「イベント情報には、**地元の人しか知らない豆知識フィールド**を追加予定！  
例えば、イベントの裏話やおすすめの楽しみ方など、群馬の魅力を深く知ってもらえる工夫を盛り込みます📚🍶」

---

💬 **読者のみなさんに質問！**

「アプリであったら便利だと思うデータ項目や機能はありますか？  
例えば、イベントの混雑予想や、天気情報など。あなたのアイデアをぜひコメントで教えてください！😊」

---

💡 **今日の気づきと学び**

**成功した点**

- **具体的なテーブル設計が完了**

  - データ型やフィールド名を明確にしたことで、実装時のミスを減らせそうです。

- **パフォーマンスとセキュリティに配慮**

  - インデックス設定やパスワードのハッシュ化など、基盤部分での重要なポイントを押さえられました。

**改善が必要な点**

- **データの正規化と非正規化のバランス**

  - パフォーマンスと柔軟性を天秤にかけながら、最適な設計を探る必要があります。

- **バリデーションの設計**

  - データ入力時の検証ルールを詳細に決めておくことで、品質の高いデータを保持できます。

---

🚀 **次回予告：システムアーキテクチャ設計とフロントエンド・バックエンドの連携**

- アプリ全体の基本的なシステムアーキテクチャを設計します。

- フロントエンドとバックエンドの通信方法、データの流れを明確化！

- いよいよアプリが動き始める準備段階に突入です！🔥

---

✨ **今日のひとこと**

データベースの設計が完了し、アプリの土台がしっかりと固まりました！  
コードを書き始めるのが待ち遠しい気持ちと同時に、設計の重要性を改めて実感しています。  
群馬の素晴らしいイベント情報を効率的に提供できるよう、引き続き頑張ります！💪

---

最後までお読みいただきありがとうございます！

皆さんの応援やフィードバックが本当に励みになります。  
コメントやいいね、お待ちしています！😊

明日も引き続き頑張りますので、よろしくお願いします！では、また明日〜！👋