ソーシャル ネットワーキング アプリの通知スキームを作成しています。フレンド関連とイベント関連の 2 つのグループに分類されるさまざまな種類の通知があります。現在、私のデータベース スキーマは次のようになっています。
+---------------------+------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+------------------------+------+-----+---------+----------------+
| notification_id | int(11) | NO | PRI | NULL | auto_increment |
| notification_type | enum('event','friend') | NO | | NULL | |
| notification_date | datetime | NO | | NULL | |
| notification_viewed | bit(1) | NO | | NULL | |
| user_id | int(11) | NO | MUL | NULL | |
+---------------------+------------------------+------+-----+---------+----------------+
これで、イベント関連の通知とフレンド関連の通知の 2 つの異なるテーブルができました。以下は、イベント関連の通知テーブルのスキーマです。
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
| notification_id | int(11) | NO | PRI | NULL | |
| event_id | int(11) | NO | MUL | NULL | |
| event_notification_type | enum('added','kicked','new-message','info-edited') | NO | | NULL | |
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
また、通知の種類ごとkicked
にさらに 4 つのテーブルがあります。それぞれに異なる種類のプロパティが必要なためです (たとえば、理由が必要です)。added
new-message
info-edited
kicked
ここで、条件付き SQL クエリを作成して、それ以外の場合はifを結合notification
するようにしたいと考えています。event_notification
notification_type
event
SELECT * FROM notification_table t WHERE t.seen = FALSE AND t.user_id = ? INNER JOIN event_notification en ON(t.notification_type='event' AND en.notification_id = t.notification_id) INNER JOIN .....
非常に多くの内部結合が発生するので、それを行うより良い方法はありますか? 私のクエリもあまり最適化されていないと思います。何か助けがあれば幸いです。