Доброе время суток. Проблема такая. 1. Есть группы пользователей (nested sets). 2. Есть пользователи которые принадлежат группам. 3. Есть такая фитча как область видимости. К примеру Вы где-то в середине дерева групп. И Вам дозволен просмотр пользователей по ACL. Следовательно Вы должны видеть всех кто ниже по дереву. Как оптимально хранить отношения кто кого видит или не видит? Раньше создавал 2 таблицы такого рода. 1. Таблица видимости групп. 2 поля - ЮЗЕР -> ГРУППА_КОТОРУЮ ВИДИТ ЮЗЕР. 2. Таблица видимости пользователей. 2 поля - ЮЗЕР -> ПОЛЬЗОВАТЕЛЬ КОТОРОГО ВИДИТ ЮЗЕР. И думал что все ок. НО когда добавляются новые пользователи и группы приходится пересчитывать эти таблицы, а элементов там более 250 000 :shock: И ведь эти таблицы участвуют в подзапросах, к примеру: SELECT * FROM TABLE WHERE user IN (select target_user from VISIBILLITY_INDEX WHERE user=1). А когда идет запись в эти таблицы то все операции выборки LOCK! Вообщем товарисчи выручайте советом.
ну nested sets это значения LEFt и RIGHT. Все дочерние узлы, данного узла, лежат между ними. есть таблица пользователей. id, name, phone и тд. 3-я это группы пользователей. состоит из user_id и group_id user_id - id пользоватея и group_id - id группы. пользователь может быть в нескольких группах(наверное) допустим LEFT=5 а RIGHT=40 делаеш запрос SELECT * FROM группы пользоватлей WHERE group_id BETWEEN 5 AND 40 вот тебе и все пользователи.
Не в тему. Вопрос был По поводу left & right я в курсе и без этого примера %) Не хранить отношения а постоянно их выдергивать из групп это долгая операция. Но все равно спасибо за внимание.
O_O Полагаю, лучше добавить поле "ранг". И пускай юзер видит пользователей, "ранг" которых меньше или равно ему (ну или просто меньше). Число ранга не обязательно должно быть уникальным.
Думал по поводу рангов и ранее, но если пользователи находятся на одном уровне дерева, но в разных ветвях как тогда ранг высчитывать?