1. SQL / Говнокод #24336

    0

    1. 1
    2. 2
    //Список категорий записан в строках с разделителем вида "23", "11||12" или даже "3||8||12||43||23"
    SELECT id, pagetitle FROM modx_site_content WHERE categores LIKE "%|[[*id]]" OR categores LIKE "%|[[*id]]|%" OR categores LIKE "[[*id]]|%" OR categores="[[*id]]"

    Запостил: FODD, 29 Мая 2018

    Комментарии (49) RSS

    • показать все, что скрытоvanished
      Ответить
      • Структура базы тоже приемлема для какого-нибудь проходного блога по кулинарии или Интернет-магазина, торгующего игрушками или наклейками с огрызком.
        Ответить
        • нет, не приемлема.

          За выбор по лайку в OLTP надо выгонять из профессии навсегда, особенно когда в categores лежит какая-то ненормализованная хуита
          Ответить
          • Я в профессии неделю, а меня уже выгоняют. Бяда.
            Ответить
            • Вогнал тебе. Проверь.
              Ответить
            • показать все, что скрытоvanished
              Ответить
            • То-есть ты неделю назад начал изучать базы данных?
              Тогда купи себе скорее хорошую книжку!
              Ответить
              • Зачем покупать книжку, когда в Интернете полно годной информации нахаляву? И я не имею в виду Мишку Русакова.
                Ответить
                • Ну берешь и кочаешь книжку.
                  Ответить
                • Потому что хорошие учебники продаются. Конечно, можно бесплатно скачать электронную книгу, но разве можно воровать??
                  Ответить
                  • На "Habrahabr.ru" полно дебилов, готовых тратить своё время на то, чтобы бесплатно учить желающих. Этим и можно воспользоваться.
                    Ответить
                    • Я бы не стал учиться у дибилов.
                      Ответить
                    • вместо разрозненных статеек, написанных нигде не обучавшимися пыхопыхерами, не лучще-ли читать нормальную книгу?

                      А что начитаются всякой mysql.ru, а потом не знают какие бывают виды объединений, не знают что такое CTE и не умеют пользоваться констреинтами.
                      Ответить
                      • Все твои шаблоны легко порушит "Facebook" (второй по величине сайт Интернета): по официальной информации, у них никаких объединений нет, вся информация хранится в одной, распределённой по серверам, таблице, а зависимости между записями в "MySQL" ("лайки", подписчики и т.д.) хранятся в графовой базе данных - единственной наработке, которую они реализвали своими силами, для хранения данных. И таки-имеют весь мир.
                        Ответить
                    • показать все, что скрытоvanished
                      Ответить
                    • > бесплатно учить желающих...
                      ... своему однобокому пониманию какой-нибудь хуйни.
                      Ответить
            • показать все, что скрытоvanished
              Ответить
              • mysql, friendfeed и реляционная база в которой все хранится в одной ячейке -- не нужны
                Ответить
          • показать все, что скрытоvanished
            Ответить
            • OnLineTransactionProcessing -- сильно нормализованная база данных, удобная для быстрой вставки данных и (в силу своей нормализованности) недопускающая неконсистентности.
              Неудобна для отчетов (надо делать кучу джойнов, медленно).

              OnLineAanalysisProcessing: возможно денормализованная база, возможно генерируется раз в N часов по OLTP. Удобна для быстрого получения отчетов. Может быть как обычная реляционная СУБД так и OLAP куб.

              OLTP
              |ID|UserId|ItemId|Quantity|Timestamp|


              OLAP (реляционный, не куб)
              |ID|CustomerCountry|CustomerEmail|TotalPrice|DateOfWeek|Date|
              Ответить
          • Сайтов, требующих нормализации, оптимизации и прочей херни - полпроцента. Остальным и так нормально.
            Ответить
            • >Сайтов, требующих нормализации, оптимизации и прочей херни - полпроцента. Остальным и так нормально.

              Сайтов, требующих базы данных - полпроцента. Остальным и так нормально.
              Ответить
          • > За выбор по лайку в OLTP надо выгонять из профессии навсегда

            Удваиваю. За table_full_access надо гнать.

            Сталкивался с похожей задачей. Писал парсеры: https://gist.github.com/kai3341/45cd4f06a1ed346a999629c66a14199e

            Удивительно, что в SQL отсутствует такая простая (для императивных языков) штука, как split. Удивительно, что приходилось изобретать велосипеды

            PS: а что, отформатировать код в читабельном виде религия не позволяет?
            Ответить
            • >> split
              Потому что первая нормальная форма говорит нам что ненужно хранить в поле коллекции чего-либо.

              Но суха теория, мой друг: в postgresql и ms-sql можно хранить XML и JSON. Можно строить по ним индексы, и даже дергать данные через XQuery.

              Вон даже в mysql завезли
              Ответить
              • а че xml-то сразу и че сразу "хранить"? какой-то comma-separated может прийти откуда угодно и пригодиться в неподходящий момент (особенно на фоне того, что далеко не каждый разработчик заднего конца умеет передавать массивы через драйвер его субд)

                regexp_split_to_array, regexp_split_to_table штатно в постгресе делают то, как называются - сплитят строку в массив или setof по паттерну

                в оракле это через жопу, но тоже есть, но учитывая, что массивы/коллекции в оракле - это стыд и позор + контекст переключения sql<->plsql тоже стыд и позор, то изложенный ниже вариант может быть самым "адекватным" и самому аналог писать не стоит:
                select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
                  connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;
                ----------------------
                SMITH
                ALLEN
                WARD
                JONES
                Ответить
    • А, я понял в чем дело. Автор не знает как хранить много-к-одному, как делать внешний ключ в базе данных, и при этом проектирует базы.

      Это примерно как не знать что такое цикл, и пытаться писать приложения
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • показать все, что скрытоvanished
        Ответить
      • Вообще, всё не в пример проще: достаточно хранить идентификаторы разделёнными запятой и для поиска использовать такой запрос:

        SELECT `id`, `pagetitle` FROM `modx_site_content` WHERE FIND_IN_SET([id], `categores`);
        Ответить

    Добавить комментарий