Какой самый эффективный способ всегда делать запрос к базе данных, который, я знаю, будет возвращать результат очень редко? - PullRequest
2 голосов
/ 14 апреля 2011

Я пытаюсь понять, как реализовать новую функциональность на моем сайте. Мой сайт позволяет людям загружать вещи, загруженные членами группы. Новая функциональность позволит 1 члену группы быть «супер» пользователем, чьи загрузки не могут быть загружены. Так что на данный момент мой запрос (более или менее) -

SELECT * FROM uploads WHERE group = $groupid

Я думаю, что сохраню статус 'super' члена в таблице 'members', поэтому, возможно, поищу его, чтобы получить идентификатор члена super member перед выполнением запроса.

$all_group_members = SELECT members FROM groups WHERE group_id = $groupid
$super_member = SELECT memberid FROM members WHERE memberid IN ($all_group_members) AND super_status = 1 

Затем измените запрос на -

SELECT * FROM uploads WHERE group = $groupid AND uploader ! = $super_member

Однако в группе не всегда может быть супер-член, поэтому у меня вопрос: есть ли более эффективный способ сделать это, например, сохранить идентификаторы супер-членов в файле cookie сессии? А как насчет хранения идентификатора суперпользователя в таблице групп - все еще включает выполнение запроса -

SELECT super_user FROM groups WHERE groupid = $group_id 

Но, по крайней мере, это на один запрос меньше.

Разве нет никакого способа обойти это - я знаю, что суперпользователь будет только в 5% случаев, поэтому в 95% случаев этот запрос будет потрачен впустую. Возможно, файл cookie сеанса может хранить переменную group_has_super_user .

Есть ли другие способы сделать это, которых мне не хватает?

спасибо

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Полагаю, другие участники группы не могут ничего скачивать из материалов моей группы.Итак, просто добавьте загружаемое поле к загрузкам и установите его на

  • 1, если его загрузил простой элемент, или
  • 0, если супер-член имеет.

Тогда вам нужно выполнить запрос only :

SELECT * FROM uploads WHERE group = $groupid AND downloadable != 0

Кроме того, если членствоменяется (например, кто-то другой получает супер права), эти флаги должны быть пересчитаны в группе.

Не забудьте создать индекс для (или установить первичный ключ) groupid + downloadable (или downloadable +)GroupID)!

1 голос
/ 14 апреля 2011
CREATE TABLE uploads (id, user_id, …)
CREATE TABLE groups (id, …)
CREATE TABLE group_users (group_id, user_id, is_super, …)

SELECT  u.*
FROM    group_users gu
JOIN    uploads u
ON      u.user_id = gu.user_id
WHERE   gu.group_id = $group_id
        AND gu.is_super = 0
...