我正在为我的社交网络应用程序制定一个通知方案。我有不同类型的通知,分为两组:与朋友相关的和与事件相关的。目前,我的数据库模式是这样的:
+---------------------+------------------------+------+-----+---------+----------------+
| 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_type
为event
或不同的情况下,它使用event_notification
连接notification
。
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 .....
会有这么多的内部连接,有没有更好的方法呢?我认为我的查询也不是很优化,如果能提供任何帮助,我将不胜感激。
发布于 2013-04-20 04:55:27
您可以使用连接。但是,您希望使用左外部联接而不是内部联接创建查询:
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 ...
不用担心joins的激增。如果您的表有适当的索引,它们将执行得很好。
请考虑更改数据结构,以便只有一个表用于不同的通知类型。拥有一些不使用的字段并不会增加太多的性能开销,特别是当您考虑到拥有如此多的连接的复杂性和拥有更多表的额外管理开销时。
https://stackoverflow.com/questions/16112850
复制相似问题