Автор |
Сообщение |
Richard Ferlow Гуру Предупреждений : 2
|
|
Блин, не могу придумать никак.
Ситуация такая.
Есть система пользователей. Она имеет иерархичную систему. А именно - есть один пользователей - он заводит еще двух, и они становятся его пользователями, те в свою очередь еще сколько-то, они уже их пользователями и так далее. Я думаю структура ясна.
Сей вариант в примитиве выглядит просто - в базе данных три колонки(ну в примитиве конечно) - id пользователя, имя пользователя, id того, кому принадледжит. Собственно вот, все просто. НО.
Мне надо так, чтобы у двух(и более) пользователей мог бы быть одинаковый под пользователь.
Тоесть он бы принадлежал не только тому, кто его создал, но и еще какому-то.
В теории можно было бы сделать так - в id того, кому принаджлежит записывать значения через запятую.(1,6,9) Но, я потом не знаю как оттуда удалять, как обрабатывать это, если понадобится от одного пользователя убрать и пристыковать к другому.
Дальше, эьл порождает проблему вывода всех пользователь в виде...ну похожем на генеалогическое дерево(все я думаю представляют как это). Это происходит как - берется первый пользователь, и выясняется, какие у него есть пользователи, выводим их, а потом выводим пользователей этих пользователей - ну и т.д. Проблема в том, что это получается нужно через скрипт всю базу пользователей прогонять, чтобы найти тех, у кого в "id того, кому принадлежит" записаны нужные нам значений, ибо стандартную выборку в духе WHERE id=$id мы произвести не можем.
В общем - что делать...ума не приложу..как сделать, как оперировать этим.
Помогите кто ведает. |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
Нашелся ответ.
Завести отдельную базу принадлежностей
1 3
1 5
1 7
2 4
2 5
Надо - добавил, что 5 принадлежит ещё и 3
3 5
Если же кто-то перешёл к кому-то, то от кого (2) меняем на к кому (3)
1 3
1 5
1 7
2 4
3 5
Дальше ушёл 5 от 1 - удаляем.
1 3
1 7
2 4
3 5
Топик можно закрыть |
|
|
|
|
def Гость |
|
В ощем, читай статьи типа "Хранение деревьев (графов) в плоском виде".
Можно же отдельно хранить список пользователей, например:
Код: |
table users:
id int autoincremet primary;
login varchar(50);
password varchar(50);
и т.п. |
А отдельно таблицу связей, например:
Код: |
table relations:
parent_id int;
user_id int.
|
По обоим полям индексы.
По поводу вывода, как я бы сделал, если записей немного — загрузил таблицу relations в массив, оббежал бы её ("обход графа в глубину" — рекурсивная функция), и в процессе обхода выбирал инфу по нужным пользователям из users.
Мой вариант неидеален... Наверное, можно попробовать построить SQL-запрос, который выберет тебе то что нужно. |
|
|
|
|
def Гость |
|
Я долго писал |
|
|
|
|
M1Les Эксперт |
|
Ну первую проблему решить можно так -- делаешь таблицу, в которой будет храниться соответствие Id_юзера--Id_его_юзера -- то есть в ней будет два поля. Ну и вторая проблема, мне кажется тут же решится -- просто придется побегать по таблицам |
|
|
|
|
M1Les Эксперт |
|
гг) я еще дольше |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
Вот таблицу со связями щас и буду делать.
Я че-то уперся в одну таблицу, и сижу торможу уже долго.
А с выводом... из table relations буду выбирать по parentid и выводить через fetcharray и while |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
Во, буду знать что у нас все таки есть кто разбирается |
|
|
|
|
andryv Форумчанин |
|
хех... собственно самая простая связь многие ко многим...
че думать-то? |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
andryv, да все уже высказались и пришли к решению, поздновато ты Проблемы была потмоу как я средствами одной таблицы хотел это сделать. Я даже придумал как - но было бы до не могу геморно. |
|
|
|
|
def Гость |
|
andryv писал(а): |
хех... собственно самая простая связь многие ко многим...
че думать-то? |
Да часто бывает что "залипаешь" и простого-гениального не видишь |
|
|
|
|
farlow Форумчанин |
|
def писал(а): |
andryv писал(а): |
хех... собственно самая простая связь многие ко многим...
че думать-то? |
Да часто бывает что "залипаешь" и простого-гениального не видишь |
в такие моменты надо на все плюнть и покурить или пива попить
потом мозги проясняются и тайное становится явным |
|
|
|
|
def Гость |
|
farlow писал(а): |
в такие моменты надо на все плюнть и покурить или пива попить
потом мозги проясняются и тайное становится явным |
Ага, можно просто сменить вид деятельности |
|
|
|
|
M1Les Эксперт |
|
def
Ага, как у нас говорила семинаристка по терверу: "Откройте задачник, если вы не можете решить какой-то задачи, то откройте книгу под названием Справочник ВУЗов Новосибирска и подыщите себе другое учебное заведение". |
|
|
|
|
markers Главный Модератор |
|
Мдяя, я когда магаз писал, бегал иногда за пивом в рабочее время И главное помогало )) |
|
|
|
|
|