Через месяц после выхода на новое место руководство, предвидя очередную волну короновируса, разогнало нас по домам, обязав появляться в офисе по графику — один дома, второй в офисе и меняемся. Поэтому как выпал жребий я засел дома, снабженный корпоративной симкой и VPN.

Дома работать неудобно — монитор один, стол маленький, по комнате бродят жена и собака, выпрашивая ласку, внимание и еду, и если собака на место уходит послушно, то жена скалит зубы и рычит. Превозмогая трудности подключился к рабочему месту и стал разбирать почту.

Пришло письмо от второго сотрудника, находящегося в офисе, с текстом «Тут менеджер жалуется на deadlock, разберись». По тексту письма сразу понятно — чтобы я дома не скучал на меня сгрузили проблему, которую решать надо, но не сильно хочется. Скрин ошибки в письме был, но как это порой бывает из него можно было узнать название продукта, версию фреймворка, имя разработчика, дату рождения, его сексуальные предпочтения, имена родителей и положение солнца, когда собирался релиз. Ничего относящегося к делу там не было и мне пришлось пытать менеджера на предмет входных данных — кто, как и главное — зачем. На удивление менеджер очень бодро рассказал, где лежит тестовая база с нужной таблицей и процедурой. Вооружившись студией, я начал изучать процедуру с таблицей, оказалось всё просто — из 50 входных параметров брался один, если такой был в базе — остальными 49 обновлялись имеющиеся данные, а если не был — просто дописывались. Просто и понятно.

Из переписки выяснилось, что эти данные раз в n минут обновляются процедурой, но т.к. между обновлениями интервал невелик часто накладываются друг на друга, т.к. других желающих лезть в эту таблицу нет. Откладываю процедуру в сторону и лезу в таблицу. При изучении метаданных выпадает левый глаз от крайнего удивления — в базе нет ни одного индекса и порядка 20 тысяч записей, что гарантирует перебор всех данных в ней каждый запуск. Возвращаю глаз на место и согласовываю с менеджером создание уникального индекса на поле, которое проверяется в процедуре. Пытаюсь создать индекс и получаю ошибку создания из‑за нарушения уникальности по полю, где должен быть порядковый номер сотрудника и по словам менеджера дубликатов там быть не должно. Ищу запросом совпадения номеров и выпадает правый глаз — совпадений до 10 штук! Сразу вспомнился Гоголь Николай Васильевич, и мать его, «Мёртвые души». Против самого автора я ничего против не имел, читал всё с удовольствием, только «Мёртвые души», навязанные уроками литературы не пришлись ко двору, т.к. была непонятна первопричина, заставившая Чичикова мотаться по России. Это уже потом мне объяснили, что причина была в грядущем освобождении крестьян от крепостного права и похожа на схему с возвратом НДС через левую контору, но учительница литературы историю знала плохо, а про отмывание денег — тем более и на мои вопросы невнятно мычала.

Ну да бог с ним с Гоголем. Откуда взялись в таблице повторные записи о крестьянах сотрудниках? Пытаюсь выяснить у админов кто вообще это чудо писал, оказывается, что это было давно и неправда, описания таблиц нет, можно только догадываться, какое поле и за что отвечает. Ладно, поля name, surname, phone и подобные я пойму по названию и содержимому, а как быть с полями ID,PID,GID,SID? Где в varchar хранится целочисленные значения? Вообще все поля в таблице, кроме дат, имеют тип varchar(50) и varchar(100), удивительная согласованность.

Перехожу в общий чат и пытаюсь призвать коллективный разум на помощь. Самые старые сотрудники рассказывают, что это была интеграция сначала одной системы с другой, потом с третьей, причем переписывать это особо никто и не пытался — работает же. Также никто не парился с индексами, ключами и прочим. Приплыли. Пытаюсь объяснить, что дубли выкосить можно, но сложно, индекс я создам, но наличие дублей попортит картину, ну и обновлять данные, размазанные по 10 строками не совсем правильно. Пишу письмо менеджерам и пытаясь не использовать слова на «Х», «Б» и «Ж», дабы не сорваться и не написать лишнего объясняя ситуацию, что индекс я создам, но надо проверить поможет или нет. Если не поможет — буду пытаться получить добро на чистку таблицы от «мертвых душ».

Через 15 минут, потраченных на выпрашивание у жены капучино и его последующее употребление получаю письмо, в котором менеджер радуется, что проблема сдвинулась с мертвой (опять это слово!) точки, рапортует, что на тестовом контуре всё «ок» и интересуется, когда я это перенесу на продуктив. Осторожно объясняю, что в таблице есть несостыковки с данными, нужно их приводить в порядок, и вообще может оказаться так, что то что работало на тестовом контуре на продуктиве покажет себя не так. И тут в голову приходит запоздалая мысль — а что в продуктиве? При изучении рабочей базы я понимаю — вот тут то он и пришел, пушной зверь... 75 тысяч строк, из которых 15 тысяч дублей, от 2 до 10 копий одной строки... Что будет индекс, что не будет, ворочаться это будет очень долго. Ещё раз призываю коллективный разум, который высказывает те слова на «Х», «Б» и «Ж», которых я избегал и предлагает писать письмо руководителю — на благословление разгребать авгиевы конюшни.

Менеджер присылает очередное письмо, в котором излагает желание пообщаться со мной по телефону. По телефону объясняю ситуацию, что в продуктиве данные сильно отличаются от тестовой базы и создание индекса на поле ID нам не сильно поможет, но можно попробовать, на что получаю изумительный ответ: конечно не поможет, я посмотрел процедуру и оказывается там используется поле PID!...Немая сцена. Оказывается продуктив отличался от тестовой площадки, причем сервисная шина передавала все данные в XML, а что ты будешь выбирать как первичный признак ты уже сам в процедуре базы прописывал. В какой‑то момент процедуру поменяли, но кто, когда, зачем никто уже не знал. Наученый горьким опытом я проверил совпадения по этому полю, они нашлись и, о чудо, их было всего три. Причем, строки не отличались ничем, что естественно вызывало отдельные проблемы при их удалении, кто знает, что такое 2НФ и кто пытался удалить или изменить строки с полностью одинаковыми значениями во всех полях, поймут как это весело.

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

Комментарии (83)


  1. martyncev
    04.07.2023 16:02
    +22

    Простите, но оформление статьи лютая жесть...


    1. Gallemar Автор
      04.07.2023 16:02
      +14

      Полностью согласен! Крутил исходник и так, и эдак - всё равно кроме двух абзацев и картинки в голову ничего не пришло, поэтому кто осилит до конца сею пиСсанину имеет право на шоколадную медальку!


      1. Ilusha
        04.07.2023 16:02
        +5

        Выделение абзацев Вам бы помогло. Куплю себе медальку, обязательно шоколадную


        1. Gallemar Автор
          04.07.2023 16:02
          +3

          выделил абзацы


    1. igrek11
      04.07.2023 16:02
      +9

      А я считаю, что оформлено как надо - упор на юмор. Здесь не надо ничего структурировать - это так, "лёгкое чтение". Мне понравилось - сразу вспоминаются аналогичные


      1. sepetov
        04.07.2023 16:02
        +3

        Не-не-не, к юмору определённо претензий нет и быть не может. В этом смысле статья на 5+.

        Коллега, вероятно, имеет в виду абзацы, пунктуацию. Но с этим лучше бороться через ctrl+Enter, конечно же.


        1. Gallemar Автор
          04.07.2023 16:02
          +2

          сделал легкий тюнинг текста


          1. TsarS
            04.07.2023 16:02
            +2

            Мы же на Хабре — рефакторинг!


  1. Tzimie
    04.07.2023 16:02
    +9

    Совершенно обычная ситуация, бардак обыкновенный


  1. printf
    04.07.2023 16:02
    +15

    Вы странных архитектур не видели, если вас инты в строках и таблицы без индексов до сих пор удивляют.


    1. Gallemar Автор
      04.07.2023 16:02
      +2

      Давно не удивляют ????‍♂️


  1. ErshoffPeter
    04.07.2023 16:02
    +8

    Слишком быстрый happy-end! ????Не хватает части как искали собственников данных, как согласовывали изменения, как ИБ не давало доступ и так далее... ????


    1. Gallemar Автор
      04.07.2023 16:02
      +1

      С доступами было наоборот хорошо :) как и с ИБ, что потом в итоге организации вышло боком


      1. ErshoffPeter
        04.07.2023 16:02
        +8

        Доступы и ИБ обычно в противофазе - если с доступами хорошо, то значит с ИБ плохо и наоборот. ????


        1. Gallemar Автор
          04.07.2023 16:02

          Примерно так и было


    1. Tishka17
      04.07.2023 16:02

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


      1. uszer
        04.07.2023 16:02

        Это ещё одна обязательная вишенка на таком торте!


      1. ErshoffPeter
        04.07.2023 16:02

        ...а ещё нашли целого подрядчика, который сидит на пребывании данных из одной кривизны в другую... ????


      1. serge-sb
        04.07.2023 16:02

        Вспомнился високосный 1900-й...


  1. klis
    04.07.2023 16:02

    кто знает, что такое ACID и кто пытался удалить или изменить строки с полностью одинаковыми значениями во всех полях, поймут как это весело.

    А при чем тут ACID?


    1. Gallemar Автор
      04.07.2023 16:02
      +1

      Извините, acid за уши притянут, тут скорее нарушение 2нф и атомарности


      1. Aquahawk
        04.07.2023 16:02
        +4

        Надо сказать что я в жизни ни разу не видел в продукте которому больше года в продакшне базы приведённой к любой нормальной форме.


        1. Gallemar Автор
          04.07.2023 16:02
          +1

          Даже 1нф и 2нф?


          1. Aquahawk
            04.07.2023 16:02

            согласен, с первой нф погорячился, её нарушения редко видно. А вторую только так нарушают, особенно в big data.


            1. klis
              04.07.2023 16:02
              +2

              Так НФ - это вобщем-то не требование/правило, чтобы ее нарушать. Это стремление минимизировать таблицы с точки зрения оптимизации хранения. На практике довольно часто приходится этим принебрегать в угоду скорости выборки, в этом нет проблемы.


              1. lorc
                04.07.2023 16:02
                +3

                Ну не только оптимизация хранения, но еще и консистентность. Если одну копию изменить, а вторую - забыть, то что потом делать и как искать правду?


                1. SergeyMax
                  04.07.2023 16:02
                  -2

                  Проапдейтить ту, которую забыли данными из той, которую не забыли.


                  1. lorc
                    04.07.2023 16:02
                    +2

                    Как определить, которую именно забыли. Вот что правильно: 13 или 17?


                    1. KongEnGe
                      04.07.2023 16:02

                      В любой непонятной ситуации правильно будет 42.


                    1. czz
                      04.07.2023 16:02
                      -1

                      Храните номер версии или дату последнего обновления :)


          1. mentin
            04.07.2023 16:02

            1нф отсутствует как класс во всевозможных document db. В бигдате чаще всего отсутствует если база данных поддерживает repeated field.


  1. vagon333
    04.07.2023 16:02
    +1

    Ох, у меня коллега кодил в 90х похоже - одной непрерывной строкой. :)


    1. Gallemar Автор
      04.07.2023 16:02
      +1

      Да я так до сих пор код пишу, его мало кто после меня видит


      1. vagon333
        04.07.2023 16:02
        +6

        Нещадно плюсую - нечего коллегам расслабляться.


  1. Wesha
    04.07.2023 16:02

    была непонятна первопричина, заставившая Чичикова мотаться по России. Это уже потом мне объяснили, что причина была в грядущем освобождении крестьян от крепостного права и похожа на схему с возвратом НДС через левую контору,

    Эммммм... помнится, первопричина вообще-то была стара как мир: гребля (на байдарках и каноэ) — Чичиков хотел жениться, но родители невесты хотели не какого-то там мелкого чиновника, а солидного рабо душевладельца, поэтому Чичиков и демпинговал покупал себе ну хоть какеие-нибудь души "на бумаге", которые помещики отдавали ему за сущие копейки, потому как всё равно ведь померли.


    1. gazkom
      04.07.2023 16:02
      +13

      Что за эротические фантазии. Хотел взять кредит под залог крестьян и пропасть. Инспектору, которые приедет проверять наличие душ, дать на лапу.


      1. Wesha
        04.07.2023 16:02
        -1

        Не знаю, не знаю. Лично мне помнится так. Может быть, потому, что в советское время было бы довольно сложно объяснить (да ещё школоло), что такое "кредит", да ещё под залог.


        1. SlFed
          04.07.2023 16:02
          +3

          Это при встрече с Ноздрёвым Чичиков историю историю про свадьбу придумал:
          — Ну, так я ж тебе скажу прямее, — сказал он, поправившись, — только, пожалуйста, не проговорись никому. Я задумал жениться; но нужно тебе знать, что отец и мать невесты преамбиционные люди. Такая, право, комиссия: не рад, что связался, хотят непременно, чтобы у жениха было никак не меньше трехсот душ, а так как у меня целых почти полутораста крестьян недостает...
          — Ну врешь! врешь! — закричал опять Ноздрев.

          А поскольку это самое первое объяснение (хоть и придуманное на ходу) которое встречается в книге, вот оно и осталось в памяти. А настоящая причина скупки мертвых душ раскрывалась в последней главе :

          "Эх я Аким-простота, — сказал он сам в себе, — ищу рукавиц, а обе за поясом! Да накупи я всех этих, которые вымерли, пока еще не подавали новых ревизских сказок, приобрети их, положим, тысячу, да, положим, опекунский совет даст по двести рублей на душу: вот уж двести тысяч капиталу!...."


      1. rinac
        04.07.2023 16:02
        +1

        Ну а зачем ему деньги-то? Да, в том числе, чтобы женится на хорошей невесте. Почему по вашему во времена Пушкина мужчины женились в основном в 30+ лет, а женщины могли вообще в 15 лет выйти замуж? Именно поэтому, от мужчины ожидали, что он будет полностью содержать семью, а женщина просто будет рожать детей.


        1. mayorovp
          04.07.2023 16:02
          +5

          Деньги ему для того чтобы жить хорошо. Хорошая невеста сюда, может, и входит (а может и нет) — но вот никакие родители никакого условия на количество "душ" ему совершенно точно не ставили.


    1. Gallemar Автор
      04.07.2023 16:02

      Возможно


    1. oragraf
      04.07.2023 16:02
      +10

      Ниже комментарий верен. Мне в свое время учитель объяснял так. Перепись крестьян проводилась не чаще 1 раза в 10 лет. В этот промежуток они считались живыми по "ревизским сказкам". Чичиков хотел заложить несуществующих крестьян и получить под это дело кругленькую сумму. Когда все это выплыло бы - крестьяне оказались умершими и формально к Чичикову претензий бы не было.


  1. FreeNickname
    04.07.2023 16:02
    +2

    Помню, как-то работал с системой, в которой было 3-5 (уже точно не помню) способов представить булевый тип данных в базе, и ни один из них не был нормальным. Запомнился только мой фаворит: varchar(1), где символ '1' – это true, а null – это false.

    Ещё там в качестве "языка разметки" при формировании документов использовался Lisp, интерпретатор которого был зашит в Java (система была на Java).


    1. DikSoft
      04.07.2023 16:02
      +1

      Помню, как-то работал с системой, в которой было 3-5 (уже точно не помню) способов

      В конфигах линуксовых оно и сейчас так.
      Хорошо ещё, если не THIS_CRAZY_VALUE_IS_TRUE как "истина", любое другое - "ложь".


  1. Latrommy
    04.07.2023 16:02

    Иванов *
    Иванов *
    Иванов *
    Иванов Пётр *
    Иванов Пётр *
    Иванов Пётр Сидорович
    Иванов Пётр Геннадьевич

    Такое... пишет в поле имён гостей одна достаточно известная ERP. Почему и зачем - загадка.


  1. MVS366
    04.07.2023 16:02
    +12

    Автор такой молодец и пусечка, возьми с полки пирожок, ибо походит на хвастовство в стиле "они все дураки, а я умный".

    Возьмём в пример это негодование:

    Ладно, поля name, surname, phone и подобные я пойму по названию и содержимому, а как быть с полями ID,PID,GID,SID ? Где в varchar хранится целочисленные значения? Вообще все поля в таблице, кроме дат, имеют тип varchar(50) и varchar(100), удивительная согласованность

    Потому, что данные приходят из других источников и придти может что угодно и когда угодно. Например, строка вместо числового идентификатора. И разработчики просто абстрагировали себя от каких-либо проблем с этим, потому что четкого понимания "что нам пришлют" не было ещё на этапе проектирования этой таблицы. А не потому, что разработчики были дураки.

    Огромное количество ИС построены в таком духе и это поведение никто не меняет, потому что сделать "правильно", на первый взгляд, может оказаться фатальными последствиями и вечными проблемами. Если вы видите, что в программе/таблицах творится, на первый взгляд дичь, не надо спешить все переделывать, ибо есть очень высокие шансы все сломать. Т.е. тут фигурирует принцип "работает - не трогай".

    То, что у автора все сразу завелось, это конечно, замечательно. Но вот бывают в жизни куда печальные истории, когда самоуверенный в своих силах юноша делает вроде бы всё правильно, а в итоге все рушится. Лично видел лет 10 назад ситуацию, когда найденная и убранная в коде ошибка привела к невозможности сделать заказ товара в коде интернет-магазина.


    1. AnthonyMikh
      04.07.2023 16:02
      +2

      Лично видел лет 10 назад ситуацию, когда найденная и убранная в коде ошибка привела к невозможности сделать заказ товара в коде интернет-магазина.

      Я жажду подробностей. Какого рода ошибка? Какие ещё ошибки были (ибо один багфикс не мог бы сломать работоспособность всей системы)? Как оно вообще работало?


      1. MVS366
        04.07.2023 16:02
        +3

        Это была старая версия магазина Мвидео, написанная на PHP в ужасном стиле. Ошибка была как я помню такая:

        if ($var = true) {

        Как только это пофиксили (сделали $var === true), все сломалось. Логика сломалась.


        1. NickyX3
          04.07.2023 16:02

          ой, да я целые куски кода иногда внедряю через какой-то то if и проверку feature flag, а потом перед окончательным внедрением некоторое время остается

          if(true){...}


        1. Danem
          04.07.2023 16:02
          +3

          Очень странный фикс, конечно сломалось, т..к. логика поменялась. Вместо присваивания, поставили проверку. Разбираться конечно надо, что имелось ввиду.

          Мне встречались такие записи. И в моем случае их надо было фиксить типа так:

          $var = true;

          if ($var) {

          Под true - там может быть и переменная и функция.


          1. joeyes
            04.07.2023 16:02

            Вас не смущает, что if ($var = true) это как бы и не проверка вовсе? Тело этого if'a будет выполняться всегда. Если вы уберете if, то в логике, собственно, ничего не изменится.


    1. ogost
      04.07.2023 16:02
      -2

      Потому, что данные приходят из других источников и придти может что угодно и когда угодно. Например, строка вместо числового идентификатора.

      Это в стиле хуяк-хуяк и впрод?


      1. isadora-6th
        04.07.2023 16:02
        +5

        В базу могут писать из чужой системы свои id. Если завязаться на то, что на handler вам всегда будут прилетать uint32, и в базе хранить также, будет очень больно -- когда поставщик добавит нолик в начало или дефисы "021-34-124". А уж когда добавляют префикс... ммм, закачаешься)

        Поэтому при интеграции с внешними системами id и хранят строкой, просто по той дурацкой причине, что входные данные могут поменяться в любой момент.


        1. Gallemar Автор
          04.07.2023 16:02

          В моем случае системы не были внешними, так что вполне можно было узнать какой тип поля использовать. Другой момент в том, что база использовалась как промежуточная для шины данных, возможно передача данных строками единственное что можно быть, но тут уже вопросы к разработчика biztalk.


        1. iig
          04.07.2023 16:02

          Потому что ID не является числом. Это идентификатор. Арифметические операции с ним бессмыссленны.


        1. barbaris76
          04.07.2023 16:02

          Очень напоминает логику одной системы для хранения, скажем так, сущностей клиентов в одном очень большом зеленоватом банке, название которой начинается на "Е" и состоит из трёх букв )

          Прилететь действительно может что угодно и откуда угодно, от ФНС до планшета операциониста, поэтому абсолютно все поля - string, и только внутренние идентификаторы самой системы long int.


    1. 1CUnlimited
      04.07.2023 16:02

      Просто одно дело когда такое делают в программном коде на языках программирования для быстрой разработки без строгой типизации, а другое дело когда закладывают бомбу в структуре СУБД (в которой целостность данных как минимум должна быть, констрейнты и много другое) . Разные уровни последствий (исправить код против исправить структуру СУБД) . Да автор умный - разгреб , а они все ...


  1. Wesha
    04.07.2023 16:02
    +1

    я остался дальше думать о странной архитектуре системы обмена, которая работала годами, кривая и косая, без сбоев.

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



  1. Daddy_Cool
    04.07.2023 16:02
    +7

    Ну нет.

    Есть такие авторы которые начинают писать текст без каких-то вводных частей, сплошным потоком мыслей персонажа. Читатель в такой момент выдает автору некий кредит доверия, надеясь что через не слишком продолжительное время все ниточки завяжутся в узелки и будет понятно ради чего это всё. И в конце читатель скажет: "Эвон как! Ого! А я-то и не думал..." . Что имеем здесь. Автор решил типовую проблему для БД - наличие дублей. Автор молодец. Всё. И об этом статья?


  1. Dimaasik
    04.07.2023 16:02
    +15

    Меня недавно спросили, почему программисты ненавидят работать с чужим кодом. Долго думал, как донести до обычного пользователя всю суть пиздеца.Решил привести небольшую аналогию:

    Вот представь, что тебе доверили достроить за другим прорабом лабораторию на острове. Ты приходишь на объект, а там кроме недостроенного здания: огромный вентилятор (размером со здание), большой воздушный шар и комната набитая швабрами. Почесав голову, ты разбираешь этот хлам и доделываешь лабораторию. Сдаешь объект ученым, но через 5 минут они выбегают с криком: "УТЕЧКА ЯДОВИТОГО ГАЗА!!!".
    — Как так–то, блять! Должно же работать! — в отчаянии кричишь ты и звонишь прошлому прорабу:
    — Вася, у нас ядовитый газ потёк! В чем проблема?
    — Не знаю, должно было все работать. Что–то в проекте менял?
    — Немного, швабры вынес...
    — Швабры потолок держали!
    — Что??? Что, блять, извините???
    — Говорю, швабры потолок держали. Над ними цистерны с газом были. Очень тяжелые, пришлось в комнату снизу швабры напихать.
    — Ты хотя бы записку на двери повесил бы, что швабры для держания потолка! У нас тут ядовитый газ течет! Что нам делать?
    — Включай вентилятор. Он сдует газ с острова.
    — Я его, блять, демонтировал сразу же!
    — Зачем?
    — Зачем ты построил 120 тонный вентилятор? Ты не мог положить ящик блядских ПРОТИВОГАЗОВ?
    — Ящик противогазов искать нужно, а вентилятор у меня с прошлого заказа оставался.
    — Вася, я убрал твой вентилятор! Мы тут задыхаемся!
    — Херли вы тогда там делаете? Садитесь на воздушный шар и уебывайте!


    1. DmitryKuzmenko
      04.07.2023 16:02
      +3

      в начале 90х работал в конторе. Язык ДИАМС (mumps). И в отделе было 3 основных программиста. Поскольку я переквалифицировался из электронщика в программисты, приходилось иногда работать с чужим кодом.
      Один вроде писал нормально. Но остальных двух запомнил навсегда:
      1 - именовал переменные только как A2, B5, C31 и так далее. Переменных было много. После страницы текста было уже невозможно вспомнить, зачем нужна переменная D4.
      2 - использовал динамический код. Хранил в базе куски кода, которые подгружались по условиям, после чего формировался какой-то код в переменных, переменные выполнялись по execute. По коду было невозможно понять, что происходит в программе, приходилось понимать только через отладчик.


    1. z250227725
      04.07.2023 16:02

      Сюда бы копирайт...


  1. Slonosvin
    04.07.2023 16:02
    +5

    Не помню, где я это спёр, но по духу очень подходит ))

    Hidden text


    1. randomsimplenumber
      04.07.2023 16:02

      Кул стори, бро ;) Выглядит как тайм-бомба. А такие вещи делают не от неумелости, а для подстраховки от кидка. Судя по всему, кидок произошел


      1. Gallemar Автор
        04.07.2023 16:02

        Не думаю, просто неумелость разработчиков


        1. iig
          04.07.2023 16:02

          Неумелость? Не думаю! (ц)

          Заложить переполнение в правильное место, чтобы оно свалилось, но не не сразу. это надо умеючи. И чтобы DBA, даже просматривая содержимое таблиц, ничего не заподозрил. Да, и в результате срабатывания всё остановилось, и заказчик потерял денег. Напоминает поделки выетконговских партизан - выглядят коряво, но результат ровно как планировался.


    1. Wesha
      04.07.2023 16:02
      +2

      Можно было начать класть туда \t!


  1. Joysi
    04.07.2023 16:02
    +2

    "Случаи они разные бывают" (c) анекдот. Начинающие финтех разрабы делают счета как decimal, а потом "внезапно" появляются счета металлов.


    1. bear11
      04.07.2023 16:02

      Интересно. А как правильно тогда делать? Ведь float для хранения денег нельзя. В тексте хранить и свои обработчики делать?


      1. lorc
        04.07.2023 16:02
        +4

        int же. Хранить наименьшую единицу: копейки, центы, граммы, караты, планковские массы.


    1. zaiats_2k
      04.07.2023 16:02
      +1

      А в чем подвох с металлами?


  1. nivorbud
    04.07.2023 16:02

    а как быть с полями ID,PID,GID,SID? Где в varchar хранится целочисленные значения? Вообще все поля в таблице, кроме дат, имеют тип varchar(50) и varchar(100), удивительная согласованность.

    А что вас смущает? Предполагаю, ваше ретроспективное мышление, когда вы видите конечный результат и его текущее окружение.

    Давайте переместимся назад во времени - в точку одной из многочисленных переинтеграций. Откуда то из-вне приходят xml-файлы. Айдишники там в то время возможно были символьными и только в одной из следующих интеграций стали целочисленными. Или в то время не было четко понятно или не было гарантий, что айди будут абсолютно всегда целочисленными. Но даже если при очередной интеграции было строго определено (с гарантией), что айдишники далее будут только целочисленными, то... возникает вопрос: "А стоит ли трогать работающую систему?"

    В общем не удивляйтесь подобным странностям, когда видите старый продукт. Зачастую перед руководством встает возможных решения: 1) Модернизировать старую систему с компромиссами и костылями, либо 2) переписать всё с нуля. Далеко не всегда второй вариант возможен и целесообразен.


    1. Gallemar Автор
      04.07.2023 16:02


    1. OlegZH
      04.07.2023 16:02

      Давайте переместимся назад во времени ...

      В реляционных базах данных (наверное, в базах данных, вообще) с давних времён существует понятие домена — некоторого семантического диапазона допустимых значений. По идее, схема БД должна опираться на домены.

      ... Далеко не всегда второй вариант возможен и целесообразен.

      К сожалению, да. Хотя, с точки зрения целесообразности, нужно именно переписывать, а сами данные прогонять через конвертер, используя, при этом, некий внешний открытый формат для промежуточного хранения.


      1. mayorovp
        04.07.2023 16:02
        +3

        Домен помогает когда задача обеспечения формата данных важнее задачи их сохранения. Если задача системы — хранить все поступающие в неё данные независимо от изменений в их формате, то тут не то что varchar, тут BLOB бывает хранить приходится.


        Ну а если некоторые данные являются суррогатным ключом из внешней системы и не имеют смысла за её пределами — то попытки их конвертировать или как-то валидировать — и вовсе вредительство.


  1. czz
    04.07.2023 16:02
    +7

    Не очень понятна проблема. Если нужно просто ускорить поиск, индекс не обязательно должен быть уникальным.

    Дальше упоминаются объемы данных — 20 тысяч, 75 тысяч записей — это по современным меркам вообще ничто, оно бы целиком лежало в дисковом кэше, и даже полный скан выполнялся бы за миллисекунды. Неочевидно, почему с таким объемом оно бы еле ворочалось.

    Или это какая-то совсем специфичная БД, которую пора закапывать, но не дают.


    1. Gallemar Автор
      04.07.2023 16:02

      75 тысяч строк, из которых 15 тысяч дублей, от 2 до 10 копий одной строки... Что будет индекс, что не будет, ворочаться это будет очень долго.

      Тут индекс нужен для ограничения добавления дубликатов записи, по скорости проблема возникла из-за частого обновления данных и ненужного перебора одинаковых строк. 75к строк в одной таблице, а таких таблиц было достаточно, что запуск обмена данными накладывался друг на друга.


      1. czz
        04.07.2023 16:02

        То есть, они хотели, чтобы не добавлялись дубликаты, но при этом в данных уже была куча дубликатов. Тогда понятно :)


  1. nikalone555
    04.07.2023 16:02

    >Откуда взялись в таблице повторные записи о крестьянах сотрудниках?

    Можно было и не зачеркивать


  1. Programisli
    04.07.2023 16:02
    -1

    Плюсик в поддержку


    1. Gallemar Автор
      04.07.2023 16:02

      Спасибо!


  1. Dominux
    04.07.2023 16:02
    -1

    В ВК, месте встречи "лучших", на всех проектах, что я работал, а они были буквально в несколько месяцев отроду, были точно такие же проблемы

    В душе не ипу, откуда берутся такие слепые олухи, что не включают мозг от слова совсем