如何使用隐私设置选择数据?

时间:2012-10-12 13:44:44

标签: mysql

有一些事件。事件可以是私有的 - 只有被邀请的用户可以在组中看到它的公共 - 所有人都可见 - 只有成员才能看到它。团体可以是公共的或私人的。我们不应该向私人团体展示事件。

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

这很有效,但非常懒散。并且没有可能陈旧它。如何更改结构以获得更快和可扩展的结果?

1 个答案:

答案 0 :(得分:-1)

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