1. PHP / Говнокод #1930

    +153.3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    function catGetCategoryById($categoryID)
    {
    	$categoryID = (int)$categoryID;
    	$q = db_query("select categoryID, name, parent, products_count, description, picture, ".
    		" products_count_admin, sort_order, viewed_times".
    		", allow_products_comparison".
    		", allow_products_search".
    		", show_subcategories_products, meta_description, meta_keywords ".
    		"  from ".CATEGORIES_TABLE.
    		" where categoryID=$categoryID");
    	return db_fetch_row($q);
    }

    снова ShopScript...
    пересчитал ради интереса количество полей в таблице - как и в запросе 14. вот хотел я добавить еще одно поле. хорошо, что посмотрел, как берутся данные

    Запостил: gorky, 03 Октября 2009

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

    • Интересно... Можно ли сократить объём пересылаемых запросами данных, если писать звёздочку там, где вынимаются все или почти все поля? Ведь эти названия, вся вот эта строка с названиями и запятыми, попадёт в СУБД, которая ещё и будет её, строку, разбирать... А нужно всего-то... Всё... Хм...
      Ответить
      • ну можно измерить ради интереса. вообще логично предположить, что если нужно выбрать все данные, то запрос со звездочкой должен выполняться быстрее, но это уже на совести разработчиков сервера БД.
        Ответить
        • замерил. для этого запроса и для запроса со звездочкой время примерно одинаково (около 5% в пользу звезды =) ).
          вообще для меня тут больше играет роль что нужно добавлять в список полей еще одно, что не очень удобно + код читабельнее со звездой все же.
          Ответить
          • Добавление поля -- этого не избежать, если действительно нужно вынуть только часть. Даже если нужно вынуть 30 полей из 40, то лучше выписать 30... Тем более, если в "невыбираемых" полях хранятся тяжёлые данные. А вот, если всё нужно вынимать, то перечисление может и время работы понизить и сетевое соединение с базой загрузить.
            Ответить
    • Если говнокод заключается в том, что вместо звёздочки указаны все поля, то это не говнокод.
      Если в таблица добавятся столбцы неизвестно куда, то этот код будет работать.
      Да к тому же сразу видишь где какой столбец вернулся, не надо в базу глядеть.

      Негодую, не говнокод, минусую.
      Ответить
      • Согласен. Все необходимые поля нужно указывать явно, а не звездочкой.
        Ответить
        • Это вопрос относительный.
          Если речь идёт о том, чтобы вынуть два - три поля из десяти -- конечно нужно. А если вынуть все поля, тогда банально вы гоняете по сети лишние байты текста, кроме того, я уверен, что во всех СУБД есть оптимизации выборки по скорости всех полей.
          Плюс, в некоторых случаях, звёздочка является элементом проектировки. Например, если таблица представляет структурированные записи, и вы пишите запрос по выборке определённых структур, например данных в узлах циклического подграфа, при этом сама программа по коллекционированию данных ничего не знает о том, что именно может хранится в узлах.

          Программист, который занимает одну позицию -- плохой программист. Проектировка -- это всегда выбор. В разных ситуациях выбор может пасть на различные решения.
          Ответить
          • поддерживаю. кстати, хочу напомнить аудитории, что я только потому и вынес это творение на обозрение публики, что здесь производится выборка по ВСЕМ полям.
            плюс к этому меня, как пользователя функции вообще не должна заботить ее начинка, и если функция называется catGetCategoryById то она должна действительно взять ВСЮ категорию, а не часть данных, даже если изменилась структура БД.
            Ответить
            • А не смущает, что порядок полей может быть разным если, к примеру, одна база разворачивается с нуля, а другая апгрейдится добавлением полей? Да и еще с десяток случаев придумать можно.
              Не говнокод - минуснул.
              Ответить
              • не смущает, я поля не по номеру беру, а по имени.
                а 5% процентов меня не волнуют на самом деле, мне важно меньше кода затрагивать при добавлении функционала.
                Ответить
      • не согласен, работать будет и со звездой при добавлении новых полей, если выборку делать не по номеру поля, а по названию.
        >Да к тому же сразу видишь где какой столбец вернулся, не надо в базу глядеть.
        вовсе не видишь, если выборка запехана в отдельную функцию, не видную сразу же. тут уже становится проще и надежнее посмотреть непосредственно на таблицу в СУБД.
        Ответить
        • аффтор, все хорошо и даже "быстрее", пока кто-то не добавил в базу поле типа text и не забил туда собрание сочинений. Все правильно сказано, обычно всегда используют перечисление полей, а то что ты там намерял - это настолько незаметная мелочь, что даже на погрешность списать не получится. Звездочку используют ленивые, а программисты используют ORM.
          Ответить
          • во-первых, 5 процентов - не мелочь. повышению производительности на высоконагруженных системах на 5% будут очень рады.
            во-вторых, я как раз хочу чтобы собрание сочинений таки было доступно. если не нужно будет - я это поле из перечисления уберу.
            в-третьих снова повторяю, для особо слоупочных, что в этом примере из таблицы выбираются все поля, независимо от типа поля.
            и, в-четвертых, каким образом звездочка мешает ORM?
            Ответить
            • Уважаемый, вы о чем? Какие 5 процентов, какая пересылка лишнего текста? Если нужен каждый процент производительности, пользуйте прекомпилированные запросы, оптимизируйте структуру БД, смените движок в конце концов.
              Касательно ORM и звездочки вообще молчу - RTFM, одним словом.
              Ответить
            • ты плохо измерял, 5% это погрешность твоих часов. Во-вторых, а если из этой же таблицы тянутся данные в другом месте? не везде нужен одинаковый набор, зато если использовать везде *, легко перебрать лишнего
              Ответить
              • >не везде нужен одинаковый набор, зато если использовать везде *, легко перебрать лишнего
                я согласен с этим, но тогда вообще незачем было писать универсальную функцию.
                Ответить
              • забыл залогиниться
                Ответить
    • Звёздочка - зло.
      Здесь верный подход, кроме как этой куевой тучи конкотенаций.
      Ответить
      • Согласен. Звёздочка зло за исключением случаев, если речь идёт о достаточно малом количестве полей и значений.
        Хотя в таких случаях её использование можно оправдать разве что ленью :)
        Ответить
        • Желаю вам приятного набора сорока названий полей по десять символов в каждом ;)
          А ленивые программисты пока будут повторно используя код выходить на рынок быстрее.
          Чего это я вас отговариваю названия писать? Пишите, пишите.
          А я за это время успею свою звёздочку продать без потери производительности.
          Ответить
          • да, суровые програмисты выходят на рынок быстрее потому что используют звездочку в MySQL запросах. Еще и без потери производительности!Ё!!11 Ну надо же, целых 40 полей по 10 символов (400 символов) — целых 2-3 минуты набора ай ай ай как грустно все это
            Ответить

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