有一些事件。事件可以是私有的 - 只有被邀请的用户可以在组中看到它的公共 - 所有人都可见 - 只有成员才能看到它。团体可以是公共的或私人的。我们不应该向私人团体展示事件。
event
id, title, group (nullable), is_private
event_invitee
event_id, user_id
group
id, title, is_open
group_participant
group_id, user_id
现在,为了显示当前经过身份验证的用户可用的事件,我们执行类似(伪代码)的查询:
SELECT
e
FROM event e
LEFT JOIN e.invitees i WITH i.user = :current_user # is current user invited to event ?
LEFT JOIN e.group g
LEFT JOIN g.participants p WITH g.user = :current_user # is current user are participant of group?
WHERE ((e.group IS NULL OR g.is_open = true OR (g.is_open = false AND p IS NOT NULL))
AND (r.is_private = false OR (r.is_private = true AND i IS NOT NULL)))
AND /* other filters, like by location */
这很有效,但非常懒散。并且没有可能陈旧它。如何更改结构以获得更快和可扩展的结果?
答案 0 :(得分:-1)
为了加快速度:你必须将“左连接”重写为“where子句”。这说起来容易做起来难。但它为您提供了应用首先删除最多记录的过滤器的优势。假设一个位置只有10个事件,并且选择了位置过滤器,那么查询不必过滤不在该位置的私有,公共或组事件。我知道这很容易,但除非我能掌握一些数据,否则不能提供真正的代码。我希望这能指出你正确的方向。我设法加速超过30秒持续查询到1秒多一点。最后我们忘了编写生产数据库的索引脚本。因此,您还可以添加一些放置好的索引来加快速度。