За последние 24 часа нас посетили 18105 программистов и 1662 робота. Сейчас ищут 1669 программистов ...

Вложенные комментарии

Тема в разделе "Решения, алгоритмы", создана пользователем d1gi, 9 июл 2011.

  1. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    озадачился, как оптимальнее всего сделать вложенные комментарии... например как на скриншоте:

    [​IMG]

    т.е. камент от alienator (17:57) является ответом на камент от 0Lexx0 (17:50), но ниже стоит камент от Abductio (17:52)

    у кого какие мысли? :) единым запросом из БД в таком порядке как-то непонятно как можно взять... а пересортировывать каждый раз чредсвами ПХП в памяти, тоже расточительно %) особенно если встанет задача выдать большое кол-во каментов на одной странице...
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Также, как и вложенные категории на сайте - через parent_id...
     
  3. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Например хранить именованный путь.

    Например -
    1
    1.23
    1.23.15
    1.23.16
    1.23.17
    - где цифры - это ID записи

    Так и уровень несложно считать
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    поле вида
    1
    11
    12
    13
    131
    132
    1321

    далее сортировка по этому полю
     
  5. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    а каким образом формировать это поле?
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    при добавлении
    зная поле от родительского поста, пройти like'ом по детишкам и получить count()
     
  7. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    хорошо, допустим пользователь отвечает на камент у коготого позиция в вашем примере равна 12, тогда какую позицию надо присвоить новому каменту?
     
  8. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    моим способом не хочешь попробовать?
    Он очень даже жизнеспособный)
     
  9. rainarr

    rainarr Активный пользователь

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
    Тоже самое когда то реализовал в своем проекте с parent_id, остальные сообщения сами по себе сортируются по дате/ид. Если parent_id == 0 тогда это просто новый независимый комментарий. Но самое интересное - что делать с дизайном сайта когда на каждый ответ идет еще ответ, и выстраивается дерево на 7+ ступеней :)
     
  10. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    а в моем способе - чтобы узнать уровень вложенности - просто считаешь сколько точек =) Все легко и просто)
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну все просто же.
    получаем с=COUNT() как-то так tree LIKE '12%'
    тогда tree='12'.(с+1)

    кстати, по-правильному, нужно добавить разделитель между цифрами. точку например.
    tommyangelo
    а если каментов лимончик, а если два...
     
  12. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    т.е. позици будет 121? и какое оно место займет? :)
     
  13. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    иду на допущение конечно, но почему то мне кажется, что уровень вложенности не будет превышать 70

    Лимончик - это 7 символов, потому мы возьмем случай с 9 символами - как раз до миллиарда 1 коммент не дотянем.

    70*10 = 700

    10 - это с точками. 700 символов - фигня для MySql.

    А уровень можно проще считать - дописывать в путь нолики, до 9 символов. Т.е. 000000012.000005689.00012583 и.т.д.

    Тогда уровень будет тупо length(path)/10
     
  14. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    и помножить все это на 100000000 комментов :)
    и потом, есть ещё и разница, делать индекс по varchar(70) или по varchar(700)
    правильнее так 1.2.1
    займет место после 1.2
     
  15. rainarr

    rainarr Активный пользователь

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
    ну в моем способе точки считает (т.е. делает отступы слева) css, но возможную теоретическую проблему это не решает :)
     
  16. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Mr.M.I.T.

    один фиг без бенчмарков обсуждаем - недоказуемо)))))

    rainarr

    ну дык то же самое - кол-во точек умножить на шаг - и в марджин-лефт подставляется)
     
  17. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Да ты гений просто ;-)
    Ещё можно использовать 16-ричный формат. Например:
    Код (Text):
    1. 01-000
    2. 01-001
    3. 01-001-1
    4. ...
    5. 01-001-a
    6. 01-001-f
    7. ...
    8. 0e-fff
    Или даже какой-нибудь 27-ричный. Человеку всё равно это не разгребать, а для сортировки и уплотнения данных удобно.
    А количество разрядов зависит от максимального количества записей на уровень. Если количество записей выходит за рамки ff (в первой цифре), то просто всем добавляется "0" (это придётся редко делать, т. что не страшно).
    Плюсы такого метода:
    1. Удобно сортировать;
    2. В самом пути заложена иерархия;
    3. Сразу видна глубина вложенности;
    4. Легко найти предка, прапредка... главного предка;
    5. Легко вывести дерево с нужной глубиной вложенности.
    Минусов не замечал. Возможно, на сайтах с миллионами страниц и с постоянным удалением/перемещением записей будет сильный загруз.