Kassy0220 / fjord-minutes

This is an application for taking minutes of fjord-bootcamp's team development.
0 stars 0 forks source link

DB設計を行う #28

Closed Kassy0220 closed 1 month ago

Kassy0220 commented 2 months ago

5 に基づき、このIssueではDB設計を行います。

ER図

erDiagram
Courses ||--o{ Members: "course_id"
Courses ||--o{ Minutes: "course_id"
Minutes ||--o{ Topics: "minute_id"
Minutes ||--o{ Attendances: "minute_id"
Members ||--o{ Attendances: "member_id"
Members ||--o{ Hibernations: "member_id"

Admins {
  integer id PK
  string email "null: false"
  string password "null: false"
  datetime remember_created_at
  string provider "null: false"
  string uid "null: false"
  string name
  string avatar_url
  datetime created_at
  datetime updated_at
}

Courses {
  integer id PK
  string name
  integer meeting_week
  datetime created_at
  datetime updated_at
}

Members {
  integer id PK
  string email "null: false"
  string password "null: false"
  datetime remember_created_at
  string provider "null: false"
  string uid "null: false"
  string name
  string avatar_url
  integer course_id FK "null: false"
  datetime created_at
  datetime updated_at
}

Minutes {
  integer id PK
  string release_branch
  string release_note
  text other
  date meeting_date
  date next_meeting_date
  datetime nitified_at
  integer course_id FK "null: false"
  boolean exported
  datetime created_at
  datetime updated_at
}

Topics {
  integer id PK
  string content "null: false"
  integer minute_id FK "null: false"
  integer topicable_id "null: false"
  string topicable_type "null: false"
  datetime created_at
  datetime updated_at
}

Attendances {
  integer id PK
  integer status "null: false"
  integer time
  string absence_reason
  string progress_report
  integer minute_id FK "null: false"
  integer member_id FK "null: false"
  datetime created_at
  datetime updated_at
}

Hibernations {
  integer id PK
  date finished_at
  integer member_id FK "null: false"
  datetime created_at
  datetime updated_at
}

各テーブル説明

リソース型

Admins(管理者)

管理者のテーブルです。駒形さんと町田さんのみAdminモデルでログインすることになります。

Members(チーム開発メンバー)

チーム開発メンバーのテーブルです。サービスを利用するユーザーはMemberモデルでログインすることになります。

Courses(コース)

コースを表すテーブルです。現時点(2024/09/13)では「Railsエンジニアコース」または「フロントエンドエンジニアコース」の二種類しか存在しません。

Minutes(議事録)

議事録を表すテーブルです。

Topics(話題にしたいこと・心配事)

議事録の「話題にしたいこと・心配事」を表すテーブルです。

イベント型

Attendances(出席)

ミーティングに出席することを表すテーブルです。

Hibernations(休止)

チーム開発メンバーが休止していることを表すテーブルです。 以下の理由からメンバーの休止状態を保存する必要があり、このテーブルを作成しました。

メンバーが休止状態となるのは以下のケースを想定しています。

初回提出時のER図とテーブル説明 ```mermaid erDiagram Courses ||--o{ Members: "course_id" Courses ||--o{ Minutes: "course_id" Minutes ||--o{ Topics: "minute_id" Minutes ||--o{ Attendances: "minute_id" Members ||--o{ Attendances: "member_id" Members ||--o{ Hiatuses: "member_id" Admins { integer id PK string email "null: false" string password "null: false" datetime remember_created_at string provider "null: false" string uid "null: false" string name string avatar_url datetime created_at datetime updated_at } Courses { integer id PK string name integer meeting_week datetime created_at datetime updated_at } Members { integer id PK string email "null: false" string password "null: false" datetime remember_created_at string provider "null: false" string uid "null: false" string name string avatar_url integer course_id FK "null: false" datetime created_at datetime updated_at } Minutes { integer id PK string release_branch string release_note text other date meeting_date date next_meeting_date boolean nitified_on_the_day "default: false" integer course_id FK "null: false" datetime created_at datetime updated_at } Topics { integer id PK string content "null: false" integer minute_id FK "null: false" integer topicable_id "null: false" string topicable_type "null: false" datetime created_at datetime updated_at } Attendances { integer id PK integer time string absence_reason string progress_report integer minute_id FK "null: false" integer member_id FK "null: false" datetime created_at datetime updated_at } Hiatuses { integer id PK date finished_at integer member_id FK "null: false" datetime created_at datetime updated_at } ``` ## 各テーブル説明 ### リソース型 #### Admins(管理者) 管理者のテーブルです。駒形さんと町田さんのみ`Admin`モデルでログインすることになります。 - `remember_created_at` : DeviseのRememberableモジュールに付随して追加されるカラムです。[Rememberableモジュール内で利用されている](https://github.com/heartcombo/devise/blob/72884642f5700439cc96ac560ee19a44af5a2d45/lib/devise/models/rememberable.rb#L103)ようです。 - `provider`, `uid` : GitHub認証で必要となるカラムです。 #### Members(チーム開発メンバー) チーム開発メンバーのテーブルです。サービスを利用するユーザーは`Member`モデルでログインすることになります。 - `remember_created_at` : DeviseのRememberableモジュールに付随して追加されるカラムです。 - `provider`, `uid` : GitHub認証で必要となるカラムです。 #### Courses(コース) コースを表すテーブルです。現時点(2024/09/13)では「Railsエンジニアコース」または「フロントエンドエンジニアコース」の二種類しか存在しません。 - `meeting_week` : ミーティングが開催される週(**奇数週開催**/**偶数週開催**)が保存されます。 - `enum :meeting_week, %i(odd even), suffix: true`といった形で実装しようと考えています。 #### Minutes(議事録) 議事録を表すテーブルです。 - `other` : 議事録の「その他」の項目が保存されます。 - `meeting_date` : 議事録のミーティング開催日が保存されます。 - `next_meeting_date` : 次回開催されるミーティングの開催日が保存されます。 - `notified_on_the_day` : ミーティング開催日のDiscord通知を送ったかどうかを判別するためのカラムです。 - ミーティング開催日のDiscord通知は、Rakeタスク + Heroku Scheduler で定期実行されます - 定期実行は**毎日・1時間ごとに**実行されます。毎時間Discord通知が送られてしまうことを防ぐため、通知を送ったか否かを保存し、`false`の時に通知を送るためにこのカラムを導入しています。 - [プロトタイプアプリでの実装箇所](https://github.com/Kassy0220/third-prototype-fjord-minutes/blob/db211ff6333c21dee2218d37cde03e4dd7602a9e/app/models/meeting_secretary.rb#L108)(`sent_invitation`という属性名になっていますが、`notified_on_the_day`に読み替えてください🙏) #### Topics(話題にしたいこと・心配事) 議事録の「話題にしたいこと・心配事」を表すテーブルです。 - `topicable_id`, `topicable_type` : ポリモーフィック関連付けを表すカラムです。 - `Admin`と`Member`が`Topic`を作成することができます。 ### イベント型 #### Attendances(出席) ミーティングに出席することを表すテーブルです。 - `time` : 出席時間帯または欠席が保存されます。 - `enum :time, [:day, :night, :absence]`(昼の部/夜の部/欠席)の形で実装しようと考えています。 - カラム名を`time`にしていますが、しっくりきていません。`status`という語も検討しましたが、曖昧かなと思い選択しませんでした。 - `absence_reason` : 欠席理由が保存されます。 - `progress_report` : 欠席者の今週の作業の進捗報告が保存されます。 #### Hiatuses(休止) チーム開発メンバーが休止していることを表すテーブルです。 以下の理由からメンバーの休止状態を保存する必要があり、このテーブルを作成しました。 - 議事録には「出席者」と「欠席者(お休み)」を表示するが、休止中のメンバーは表示しないようにするため - メンバーの出席表示で、休止していた期間中は表示を`休止`とするため メンバーが休止状態となるのは以下のケースを想定しています。 - メンバーがFBCを休会した場合 - メンバーがチーム開発プラクティスを修了した場合 テーブル名には活動を中止するという意味を持つ`hiatus`という単語を選びました。(https://eow.alc.co.jp/search?q=hiatus) ただ、bootcampアプリでは`Hibernation`という言葉が使われており、テーブル名をそちらに合わせた方が良いのか迷っています。 https://github.com/fjordllc/bootcamp/blob/ad910a04927f6cc83aef85d732e919228c16f334/db/schema.rb#L351
maedana commented 1 month ago

notified_on_the_day

通知を送った時間を入れるカラムにしてもいいのかなーと思いました。単なるbooleanでもいいのですが、いつ送ったのかがわかるほうが情報量が多くなるしなぁ、と。最終的にどうするかはお任せします。

time : 出席時間帯または欠席が保存されます。

確かにカラム名悩ましいですね。出席or欠席を別カラムでbooleanとして持って、出席のときの時間帯を別カラムにすればもう少し命名は考えやすそうな気がしますが、冗長ですかねー。

Hibernation

パソコンの休止モードで使われる単語のイメージありますね。hiatusは個人的に馴染みがなかったです。というただの感想です。

Kassy0220 commented 1 month ago

@maedana さん、コメントありがとうございます!

通知を送った時間を入れるカラムにしてもいいのかなーと思いました。単なるbooleanでもいいのですが、いつ送ったのかがわかるほうが情報量が多くなるしなぁ、と。

なるほど、送った時刻を保存すると情報量が多くなりますね👀 Booleanではなく通知を送った時間を保存するようにし、カラム名をnotified_atに変更しました。

確かにカラム名悩ましいですね。出席or欠席を別カラムでbooleanとして持って、出席のときの時間帯を別カラムにすればもう少し命名は考えやすそうな気がしますが、冗長ですかねー。

アドバイスを受けて、「出席時間帯」と「欠席」という異なる括りの情報を一つのカラムに保存しようとしていることに違和感を覚えました。 そこで、「出欠」と「出席時間帯」を分けて保存するように変更しました。

これに伴い、ペーパープロトタイプの出席登録/編集ページも変更しました。 ペーパープロトタイプの出席登録の箇所

出欠に応じて異なる入力フォームを表示するようにしたことで、利用しやすくなったように思います。

パソコンの休止モードで使われる単語のイメージありますね。hiatusは個人的に馴染みがなかったです。

パソコンの休止モードをHibernationというの知らなかったです、勉強になりました🙏 ハイバネーション(休止状態)とは?スリープとの違いや無効化のメリット・デメリットを解説 | @niftyIT小ネタ帳

Hibernationの方が伝わりやすいと判断し、テーブル名をHibernationsに変更しました。

以下変更箇所のまとめになります。

Kassy0220 commented 1 month ago

DBの修正案をmaedanaさんにご確認いただいたので、DB設計はOKとし、このIssueをクローズします。

Kassy0220 commented 2 weeks ago

10/28追記

126 の実装に伴い、GitHub Wikiにエクスポートしたことを判別するexportedカラムをMinutesテーブルに追加しました。