-1

有事件。事件可以是私人的 - 只有受邀的用户才能看到它,公共的 - 对所有人可见,在群组中 - 只有群组成员才能看到它。组可以是公共的或私有的。我们不应该显示来自私人团体的事件。

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 */

这很好用,但很慢。并且不可能过时。如何改变结构以获得更快和可扩展的结果?

4

1 回答 1

-1

为了加快速度:您必须将“左连接”重写为“where 子句”。这说起来容易做起来难。但它为您提供了应用过滤器的优势,这些过滤器首先删除了最多的记录。假设在一个位置只有 10 个事件,并且选择了位置过滤器,则查询不必过滤不在该位置的私人、公共或团体事件。我知道这很容易,但除非我有一些数据,否则无法提供真正的代码。我希望这为您指明了正确的方向。我设法将超过 30 秒的持续查询加快到 1 秒多一点。最后,我们忘记了为生产数据库编写索引脚本。因此,您还可以添加一些放置良好的索引来加快速度。

于 2012-10-12T14:08:36.150 回答