我正在为我的社交网络应用制作通知方案。我有不同类型的通知,分为两组:与朋友相关和与事件相关。目前,我的数据库架构是这样的:
+---------------------+------------------------+------+-----+---------+----------------+
| 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 | |
+---------------------+------------------------+------+-----+---------+----------------+
现在,我有两个与事件相关的通知和与朋友相关的通知的不同表格。以下是与事件相关的通知表的架构:
+-------------------------+----------------------------------------------------+------+-----+---------+-------+
| 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
,added
,new-message
,info-edited
类型的通知添加了4个表格,因为每个表格都需要具有不同类型的属性(例如kicked
需要一个理由)。
现在,我想编写一个条件SQL查询,以便notification
加event_notification
notification_type
如果event
为{{1}}则另有不同。
SELECT * FROM notification_table t WHERE t.seen = FALSE和t.user_id =? INNER JOIN event_notification en ON(t.notification_type ='event'AND en.notification_id = t.notification_id)INNER JOIN .....
会有这么多内部联接有没有更好的方法呢?我认为我的查询也没有得到很好的优化,如果可以提供任何帮助,我将不胜感激。
答案 0 :(得分:1)
您可以使用联接。但是,您希望使用左外连接而不是内连接来创建查询:
SELECT *
FROM notification_table t
WHERE t.seen = FALSE AND t.user_id = ? left JOIN
event_notification en
ON(t.notification_type='event' AND en.notification_id = t.notification_id) left JOIN ...
不要担心连接的扩散。如果您的表具有正确的索引,它们将表现良好。
请考虑更改数据结构,以便只有一个表用于不同的通知类型。拥有一些未使用的字段不会增加太多的性能开销,尤其是当您考虑到具有如此多连接的复杂性以及拥有更多表的额外管理开销时。