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

    −859.5

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    CREATE TABLE GOVNOTABLE(
      GOVNOTABLEID VARCHAR2(60) NOT NULL DEFAULT ''
      /*
       Еще всякого говна
      */
    )

    Это Oracle 7.
    Так построены все таблицы складской системы, разработанной каким-то нашим НИИ.

    Меня поражает, что в одной строчке можно сделать столько говна:

    1. Все ID в системе имеют вид XYZ000NNN, где XYZ - префикс подразделения, 0000NNNN - численный идентификатор, переведенный в строку и добитый нулями. (Сто раз такое говно видел, до сих пор поражаюсь)

    2. VARCHAR2(60) - идентификатор никогда не может быть больше 12 символов, на хрена 60?

    3. NOT NULL DEFAULT '' - вот это мое любимое! Присмотритесь.
    Если кто не догадался: это Oracle, Oracle отличается тем, что '' = NULL.
    Т.е. этот цинизм расшифровывается как NOT NULL DEFAULT NULL!!!

    Еще в догонку:
    Индексация базы ОООЧЕНЬ порадовала.
    Индексы это хорошо, они все ускоряют, поэтому проиндексировано КАЖДОЕ ПОЛЕ В БАЗЕ!

    Запостил: guest, 02 Марта 2009

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

    • показать все, что скрытоТы хуй и говносос. Идентификатор в Оракле вообще-то 30 символов по умолчанию. Даже в семерке. Ты хуй. Иди читай трахнутые оракловые мануалы.
      Ответить
    • показать все, что скрытоВ догонку к комментарию 1 если уж взялся критиковать чужой код, сначала Read the fucking manualsптому как NULL это NULL а пустая строка это пустая строка.
      Ответить
    • Sano:
      К первому комментарию: Аффтор имеет в виду,что исходя из формата ID его длина никак не может быть больше 12 символов.
      Ответить
    • К первому комментарию:
      * Идея делать идентификатор не int дурацкая изначально
      * Если длина идентификатора по логике должна быть не больше и не меньше 12 символов, значит не VARCHAR2, а CHAR2 и ровно 12 символов.

      Ко второму комментарию:

      Чего я распинался? Если ты не знаешь этого ораклевого твика (который я, кстати, одобряю):

      http://www.google.ru/search?hl=ru&as_qdr=all&newwindow=1&q=Or acle+NULL+empty+string+site%3Aoracle.com &btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr= &aq=f&oq=

      Не ты ли эту хуйню писал, дарагой?
      Ответить
    • Говнораклист:
      К комментарию 2:

      выполни этот запрос в Oracle и посмотри, что он вернёт, оракловый гуру...:)
      SELECT CASE WHEN '' IS NULL THEN 'null' ELSE 'not null' END FROM dual
      Ответить
    • Говнораклист:
      К комментарию 1:

      ты - мудоёб :) Аффтар имел ввиду, что по бизнес-логике он не может быть больше 12 символов.

      Говногость под номером 4 это понял. Я тоже.

      А ты, матерщиное животное, нет :)
      Ответить
    • Говногость 4 это я, он же ОП.


      Я, вообще, обожаю эту хренотень - NOT NULL DEFAULT NULL

      Вообще, заболевание идеей делать идентификаторы 0000xxx обычно переживают в первые полтора-два месяца.
      Но иногда это идет в ынтрыпрайз.

      Немного секретов - это в ЦБ.
      Ответить
    • это что еще прикольнее когда идентификатор состоит из 3 полей
      Ответить
    • "это в ЦБ." - а потом ещё удивляются что это рубль вдруг падает. Похоже дело не только в нефти.
      Ответить
    • кошмар
      Ответить
    • по сути претензий:
      п. 1 - вполне себе удобный идентификатор для весчей типа
      /*выбор всего по подразделению*/
      select t.*,to_number(substr(ID,4)) as number_id
      from table t
      where ID like :TREBA_ID||'%'
      особенно для Data Warehouse
      п.2. и 3. - это вероятнее всего результат генерации какого-нить CASE-средства и кривые руки пейсателей из "какого-то нашего НИИ" тут не причём.
      п.3. - это м.б. защита от дураков, которые потом приписывают модули расширения системы - требование обязательного указания идентификатора, а то вдруг пишущий является мс-скульщиком/аксесником и т.п., и увидев наименование поля "ID" решит что там автогенерация значения?
      В общем - незачет
      Ответить
      • Дубина.
        Зачем строка в 60 байтов, когда можно два инта суммарно 8 байтов?
        Без всяких to_number(substr
        Ответить
        • Тип VARCHAR2 имеет переменную длину, можно написать хоть VARCHAR2(1000) — от этого место, используемое под хранение данных, не увеличится.
          Ответить

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