カレンダー共有のためのテーブル設計(案)

日付の確認や予定の確認・追加・編集などが行えるカレンダー機能。
現在、このカレンダーを複数人で共有するためのテーブル設計について考えています。

要件
  1. ユーザは複数のカレンダーを作成することができる
  2. ユーザは作成したカレンダーを他人と共有することができる(別のユーザを招待)
  3. ユーザは自分のカレンダーか、招待を受諾済みのカレンダーにのみアクセスすることができる
  4. カレンダーへの招待は通知で知らせ、その際、カレンダー名とオーナーのユーザ名を表示したい
     例: 〇〇さんから「共有カレンダー1」への招待が来ています という通知
  5. /calendar/xxxxxで対象のカレンダーにアクセスする
テーブル設計案

f:id:YYProgramming:20210202185647p:plain

部分関数従属や推移的関数従属がなく第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つの関係が 成り立ってしまいます。
①ユーザは複数のカレンダーに参加でき、カレンダーは複数ユーザの参加を許可している
②ユーザは複数カレンダーを作成できるが、同じカレンダーを複数ユーザが作成することはできない

そのため、解決するとしたら別のテーブルを追加したりする必要があるように思います。
現状ではほかの設計が思いつかないので、実装していく中で改善案があればまた載せたいです。