カレンダー共有のためのテーブル設計(案)
日付の確認や予定の確認・追加・編集などが行えるカレンダー機能。
現在、このカレンダーを複数人で共有するためのテーブル設計について考えています。
要件
- ユーザは複数のカレンダーを作成することができる
- ユーザは作成したカレンダーを他人と共有することができる(別のユーザを招待)
- ユーザは自分のカレンダーか、招待を受諾済みのカレンダーにのみアクセスすることができる
- カレンダーへの招待は通知で知らせ、その際、カレンダー名とオーナーのユーザ名を表示したい
例: 〇〇さんから「共有カレンダー1」への招待が来ています という通知 - /calendar/xxxxxで対象のカレンダーにアクセスする
テーブル設計案
部分関数従属や推移的関数従属がなく第3正規形にできており、以下のようなクエリで 「招待されているが、まだ招待を受諾していないカレンダー」の名前や招待者(作成者)の名前が 取得できることから要件も満たせそうです。
SELECT users.name AS owner, calendars.name FROM users_calendars INNER JOIN calendars ON users_calendars.calendar_id = calendars.id AND users_calendars.user_id = 2 AND f_approval = 0 INNER JOIN users ON calendars.user_id = users.id;
この設計で気になっているのは以下の2点です。
1. リレーションがループしているが問題ないのか
2. 結合2回はコストが大きいのではないか
このテーブルの作成方法だと、どうしてもユーザとカレンダーの間に多対多と1対多の2つの関係が
成り立ってしまいます。
①ユーザは複数のカレンダーに参加でき、カレンダーは複数ユーザの参加を許可している
②ユーザは複数カレンダーを作成できるが、同じカレンダーを複数ユーザが作成することはできない
そのため、解決するとしたら別のテーブルを追加したりする必要があるように思います。
現状ではほかの設計が思いつかないので、実装していく中で改善案があればまた載せたいです。