Тестовый пост (миграция комментариев)

Объединил Ответы и Комментарии. Однако пришлось пожертвовать лайками с 2 уровня вложения и комментарии были потеряны с 3.

Спасает только то, что это надо было сделать чтобы двигаться далее. И ещё то, что обычно ценность комментариев на самом деле минимально.

Они обычно бывают важны только в момент написания.

Анекдот

Драчливый мужик сидит на свадьбе, вздыхает и говорит:

Ну, сиди — не сиди, а начинать надо, — и переворачивает стол.

:)

Чтобы быстрей работа была, залил сюда, буду отлавливать ошибки.

Теперь комментарии это комментарии, есть посты и есть комментарии к ним. Ничего большего. А вот далее будем их развивать. Теперь это просто.

На GitHub:
Показаны 96 измененных файлов, 1011 добавлений и 1639 удалений.

https://github.com/LibArea/libarea/commit/40f9345ea49d65b873531dbfed143a318e6a86b3

30 Ответов

  1. C почином! Миграция без ошибок прошла?

    1. Без ошибок, я проверял 2 раза, но мало ли. Часть комментариев потеряны. Я не стал делать временную таблицу, туда переносить, определять при миграции новые id и т.д.

      1. А запросов в посту на сколько меньше стало?

        1. Ранее было N+1 и зависело от количество комментариев. Запросов 10 точно в среднем ушло, там жуть была на самом деле. ( комментарии это было первое, что делал на этом сайте. И ещё взял самую сложную схему. )


          Меня как бы подбивали ввести страницы, протестировать на 50.000 комментариев, но не мог даже это сделать. Т.к. ранее чего было тестировать, легло бы всё.

          А теперь вот можно смотреть. :) И плюс ещё, вложения сделал нормальные.

          Некоторая служебная информация пока видна, далее отключю.

          1. Отметку про мобильную платформу в комментариях предусмотрели?

            1. Да, это есть уже. Ctrl+F5 и можно видеть иконку телефона рядом с моим ником. :)

              Ещё есть что:

              • нормальная подсветка коммента с фикс. шапкой;
              • возможно менять автора коммента.

              И осталось сделать вывод любого в корень и посмотреть моб. версию. Там шаг в отступах надо сделать меньше.

  1. Возможно увеличить количество выводимых комментариев на центральной странице?

    1. Можно увеличить, только высоту экрана надо будет наверное учитывать. Посмотрим.

  1. протестировать на 50.000 комментариев

    Маловато будет:

    1. Ужас ужасный :) ничего, протестируем сколько надо. )

  1. есть посты и есть комментарии к ним.

    А что раньше было?

    1. Ответы. Разные таблицы были. Если отвечать на пост, то это ответы — таблица answers, а если ответить на этот ответ, то комментарий. Теперь везде комментарии. Запросов и кода стало значительно меньше. Значит легче стало и быстрей. Не только для нагрузки, но и для разработки.

      1. Ясно…

  1. body.dark .content_tree {
      padding: 5px;
    }

    Паддинг это я зря посоветовал. Так как выделенный коммент уходит вверх. Извеняюсь. Всего не предвидишь без тестов

    ошибки

    1. Тут на самом деле ошибок много, я буду уже завтра смотреть. Изменения были не только в css, но и в html.

      1. Аа, нуу чего не знаю того не знаю, может паддинг и не причем. Я же не знаю какие изменения в хтмл произошли. Ладно, не буду мешать.

  1. Что тут происходит, почему кнопка ответить не работает?!
    Почему сортировка по дате уехала к бабушке на кулички?!

    Сортировка

    1. Я написал выше, что происходит. Работы идут, не забываем чистить кеш. Сайт может штормить сегодня / завтра. )

  1. А мне нравится такое нововведение, простота мне по душе))

    1. Да, да… теперь хоть порядок можно навести. И со стороны логика более простая, а то раньше: ответы, комментарии, где и что? Объединять надо чтобы показать и т.д. Теперь проще. )

      1. И в плане дизайна выводить комменты проще))

      1. Вот и мне всегда непонятно было… какие ответы если везде по сути комментарии:) Даже помню я Evg с этим вопросом доставал… Потом заткнулся, чтобы не выглядеть полным дебилом:)

        А в базе значит надо выполнить это?

        ALTER TABLE `facets` ADD `facet_is_comments` TINYINT(1) NOT NULL DEFAULT '0' COMMENT 'Are comments closed (posts, websites...)?' AFTER `facet_type`; 
        
        
        ALTER TABLE `answers` ADD `answer_parent_id` INT(11) NOT NULL DEFAULT '0' AFTER `answer_post_id`; 
        
        INSERT INTO answers (answer_post_id, 
                            answer_user_id, 
                            answer_parent_id,
                            answer_date, 
                            answer_modified, 
                            answer_ip, 
                            answer_content, 
                            answer_published, 
                            answer_is_deleted)
                SELECT comment_post_id, 
                        comment_user_id, 
                        comment_answer_id,
                        comment_date, 
                        comment_modified,
                        comment_ip, 
                        comment_content, 
                        comment_published, 
                        comment_is_deleted
                                FROM comments WHERE comment_parent_id = 0;
        
        
        ALTER TABLE `posts` DROP `post_comments_count`;
        ALTER TABLE `answers` DROP `answer_order`;
        ALTER TABLE `answers` DROP `answer_after`;
        ALTER TABLE `users_setting` DROP `setting_email_comment`;
        
        
        UPDATE files SET file_type = 'comment' WHERE file_type = 'answer';
        
        DROP TABLE `votes_comment`;
        ALTER TABLE `votes_answer` RENAME TO `votes_comment`;
        
        ALTER TABLE `votes_comment` CHANGE `votes_answer_id` `votes_comment_id` INT(11) NOT NULL AUTO_INCREMENT, CHANGE `votes_answer_item_id` `votes_comment_item_id` INT(11) NOT NULL, CHANGE `votes_answer_points` `votes_comment_points` INT(11) NOT NULL, CHANGE `votes_answer_ip` `votes_comment_ip` VARCHAR(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, CHANGE `votes_answer_user_id` `votes_comment_user_id` INT(11) NOT NULL DEFAULT '1', CHANGE `votes_answer_date` `votes_comment_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
        
        
        DROP TABLE `comments`;
        ALTER TABLE `answers` RENAME TO `comments`;
        
        ALTER TABLE `comments` CHANGE `answer_id` `comment_id` INT(11) NOT NULL AUTO_INCREMENT, CHANGE `answer_post_id` `comment_post_id` INT(11) NOT NULL DEFAULT '0', CHANGE `answer_parent_id` `comment_parent_id` INT(11) NOT NULL DEFAULT '0', CHANGE `answer_user_id` `comment_user_id` INT(11) NOT NULL DEFAULT '0', CHANGE `answer_date` `comment_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `answer_modified` `comment_modified` TIMESTAMP NOT NULL DEFAULT '2020-12-31 03:00:00', CHANGE `answer_published` `comment_published` TINYINT(1) NOT NULL DEFAULT '1', CHANGE `answer_ip` `comment_ip` VARBINARY(16) NULL DEFAULT NULL, CHANGE `answer_votes` `comment_votes` SMALLINT(6) NOT NULL DEFAULT '0', CHANGE `answer_content` `comment_content` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, CHANGE `answer_lo` `comment_lo` INT(11) NOT NULL DEFAULT '0', CHANGE `answer_is_deleted` `comment_is_deleted` TINYINT(1) NOT NULL DEFAULT '0';
        
        ALTER TABLE `posts` CHANGE `post_answers_count` `post_comments_count` INT(11) NULL DEFAULT '0'; 
        
        UPDATE `audits`  SET `action_type` = 'comment' WHERE `action_type` = 'answer';
        
        ALTER TABLE `facets` ADD `facet_is_comments` TINYINT(1) NOT NULL DEFAULT '0' COMMENT 'Are comments closed (posts, websites...)?' AFTER `facet_type`; 
        UPDATE `favorites` SET `action_type` = 'comment' WHERE `action_type` = 'answer'; 
        ALTER TABLE `comments` ADD `comment_is_mobile` TINYINT(1) NOT NULL DEFAULT '0' AFTER `comment_lo`; 
        1. Вот, еще одна идея для @Evg . Когда цитата или код длинные, поставить max-height:250px overflow:hidden. И внузу яваскрипт div, show/hide.

          1. Там есть чуток другая реализация. Подправил код. Появилось копирование с том числе, и скролл, просто код надо указать какой за 3 первыми кавычками (это разметка), этой sql был.

             ```sql
             тут код
             или
             ```php
             и т.д.

            А все указывают просто 3 первые кавычки без языка. Но это разметка Markdown. Форматирование многое понимает, просто требует показывать, что это.

            1. Раз такое дело что люди не ставят какой код именно(я тоже) тогда надо взять как реализован вывод с php или mysql, и прикрутить его к quote. тоесть к голому «`»»

        1. Надо посмотреть есть ли поле facet_is_comments в таблице facets, если есть, то запрос не пройдет (первая строка попытается сделать то, что уже есть и будет ошибка).

          Не забывать только сделать бекаб базы. Это очень актуально сейчас!

          А по поводу ответов и комментариев, не всё золото, что блестит. Не все комментарии были комментариями. Визуально все было отлично, они выглядили так. Но под капотом было совсем всё по другому. Сложно. Теперь стало проще.

          1. Надо посмотреть есть ли поле facet_is_comments в таблице facets

            Да, у меня есть такое в поле в facets. Просто удалить его?

            1. Нет. Значит это поле есть и его добавлять не надо, а именно это делает 1 строка в опубликованном тобой коде тут.

              Короче, как написал выше, надо сделать запросы с 1588 строки:

              https://github.com/LibArea/libarea/blob/main/dev.sql#L1588

  1. А комментарии будут сворачиваться?

    1. Да, это надо доделать. Там набросок уже есть.

      P.S. Дополнил: сделал. Ctrl+F5. Js нет, только css. :)