1. C# / Говнокод #19747

    +4

    1. 1
    phases.Where(phase => phase == null || phase.Trim().Length == 0)

    Нашёл в своём проекте, эта строка прошла code review. phase - это строка.

    Запостил: gogishvilli001, 03 Апреля 2016

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

    • Проверил - понял. string.IsNullOrWhiteSpace() не поддерживается в linq2sql.
      Ответить
    • По-моему это таки говно. Потому что в БД (раз уж речь про link2sql) лежат пробельные символы. И пустая строка может быть пустой строкой, а может быть null.
      Придерживайся какого-нибудь соглашения (пустая строка это string.Empty в БД, тогда поле NOT NULL), тримай строки перед отправкой в БД и будет тебе щастье. Будешь писать
      phases.Where(phase => phase == "")
      Ну или == null. Что удобнее.
      Ответить
      • > лежат пробельные символы
        А вдруг у них там почему-то char вместо varchar?
        Ответить
      • БД не мой, я просто разместил объяву)

        Серьёзно - БД в продакшене десять лет и никто не может представить, какое это говно. А я написал только webApi
        Ответить
      • Есть, к примеру, такая чудесная база данных Oracle, которая по дефолту конвертирует пустые строки в NULL.
        Ответить
        • Да заебись они ваще придумали... При аналитике потом хрен поймёшь, был ли комментарий или комментарий был, но пустой.
          Это не твоё собачье дело, оракл, что я пихаю в БД. Твоё собачье дело - положить туда то, что я дал, и вернуть мне в точности то же самое. Я не хочу терять свою информацию, только потому, что по статистике 95% не отличают пустую строку от DbNull.
          Ответить
          • > был ли комментарий или комментарий был, но пустой
            Вот поэтому проще заменять пустые строки на NULL или "" (главное - единообразно) и не ебать мозг...

            > по дефолту конвертирует пустые строки в NULL
            А кому очень-очень-очень-очень-очень хочется поебаться с различением пустых значений (вдруг эти 5 пробелов и табуляция, оставленные юзером, так важны для истории) - дефолт же всяко можно перекрыть.
            Ответить
            • > Вот поэтому проще заменять пустые строки на NULL или "" (главное - единообразно) и не ебать мозг...
              Вот. Я об этом и говорю. Но только это должен делать программер, а не БД по умолчанию. Если БД так делает по умолчанию, она считает программера обезьяной, которая не понимает разницы. Not Null же придумали? Вот въебите его туда. Хочется нуллов вместо пустых строк? Въебите constraint или триггер, если mysql головного мозга.

              Я в этом правиле оракла вижу нарушение основного принципа работы БД: хранение данных. БД должна либо сохранить то, что я ей отдал, либо послать нахуй, потому что нельзя так хранить. Тут молча проглатывает и меняет тип. Оно бы ещё в инте 0 на null бы меняло...
              Ответить
          • придумали и продали они такое поведение они еще когда ты пешком под стол пошёл
            то, что в стандарте написали иначе, еще не значит, что удобней

            в том же постгресе 'foo' || (null as varchar) и 'foo || '' разные результаты даёт, тоже после оракла хочется морду набить тому, кто придумал такое
            Ответить
            • Бггг... Учитывая, что оракл основан в 1977 году, то вполне возможно, что они это правило придумали ещё до моего рождения.
              Ну и хуле? Чем старее, тем правдивее? Пусть себе продают... Таки уже давно продали и деньги потратили. А если надо будет назад - низзя! Обратная совместимость и кастомеры загрызут. Поэтому фича.

              А в постгресе нинада строки с нуллом клеить. Не, ну вот правда, на что ты надеялся?
              Ответить
              • надеялся на то, не потрачу на целых 2 минуты больше на исследование проблемы и расстановку coalesce в куче мест

                серьезно, эквивалентность '' и null - это очень удобно
                Ответить
                • Это удобно ровно до тех пор, пока не потребуется отличать '' от null. И coalesce - это говно и костыль. И нужен он только тогда, когда NULL пихают не в то, что должно быть NULL.
                  Ответить
                  • я в профессии не первый год, и работает куча систем, и не только на оракле, и вот реально ни разу такого не было, чтобы захотелось хранить '' и null одновременно, и ещё и отличать их друг от друга
                    пустая строка в колонке уже означает то, что она означает - нет содержимого, она уже окрасила себя в те цвета

                    а про говно и костыль - как стандартная функция, иногда сокращающая выражение в несколько раз, может быть плохой?
                    Ответить
                    • Говно и костыль — применение стандартной функции там, где лучше обойтись без неё.
                      Ответить
                      • давайте обсудим классическую ситуацию - merge/upsert

                        дано: есть таблица, в которой есть стабильный ключ и строковый доп атрибут, nullable - в неё мы будем апсертить.
                        есть, скажем, другая таблица (например, временная), в которой есть ключ из первой таблицы и "новое" значение строкового атрибута, nullable

                        как мне проверить без говна и костылей, что старое значение не совпадает с новым, и только в этом случае провести обновление записи?
                        Ответить
                        • ты лучше вспомни, что у нул особые правила сравнения и сравнение "" превратится в какаху
                          Ответить
                    • Ну начинается... я не первый год замужем... оно никогда не нужно было...
                      Ответь, добрый человек на один простой вопрос. Какого хуя мне будет БД возвращать null, если я положил пустую строку, при том, что я могу положить и пустую строку и null?

                      Чтобы было честно, отвечаю на вопрос. Я не говорил, что coalesce плохая, негодная. Ей в самый раз говно разгребать. Я говорил о том, что она говно и костыль, т.е. обозначал область применения.

                      У меня возникала необходимость отличать '' от нулл. Последний комментарий. Он может быть пустой, а может и не быть его. Задача: найти заказы с последним пустым комментарием.

                      p.s. Сам нуллом в строках не пользуюсь, не только в БД, но и (ужас-ужас) в коде. Предпочитаю пустую строку, как отсутствие текста.
                      p.p.s. Ораклом тоже не пользуюсь. Ну потому что не нужен.
                      Ответить
                      • >> p.p.s. Ораклом тоже не пользуюсь. Ну потому что не нужен.

                        Оралук сучий, троль ебучий

                        Всей душой его ненавижу
                        Ответить
                        • А я еще ненавижу оленей которые используют оракл для вебпроектов. Я с одним банком работал вот они пидары как раз такие были. джумла + оракл охеренное сочитание я вам скажу.
                          Ответить
                          • ненавижу оленей, которые используют php для вебпроектов
                            говну, которое не умеет даже в пул подключений и рест интерфейсы делает через глубокий анус, место только для домашних страничек
                            Ответить
                            • > которое не умеет даже в пул подключений
                              Умеет.
                              > рест интерфейсы делает через глубокий анус
                              поподробней можно чего там не так с REST ?
                              Ответить
                              • > Умеет.
                                тут обычно принято прикладывать пруф
                                если пыховно умеет, нахуя людям приходится поднимать pgbouncer?

                                > поподробней
                                говорят, есть такие языки и фреймворки, их изобрели те, то не осилил php, там можно в контроллере рядом с методом написать "GET /api/foo/{fooId}/bar/{barId}", и он сам разберет запрос, вызовет нужный метод, и кое-когда и даже wadl сгенерит

                                можно пример такого же на php?
                                Ответить
                                • 1.
                                  >тут обычно принято прикладывать пруф
                                  http://stackoverflow.com/questions/39753/connection-pooling-in-php#39753
                                  >если пыховно умеет,
                                  легко гуглится по pconnect php
                                  >нахуя людям приходится поднимать pgbouncer?
                                  Некоторые и в жопу ебуться

                                  2.
                                  говорят, есть такие языки и фреймворки, их изобрели те, то не осилил php, там можно в контроллере рядом с методом написать
                                  Да в пхп до такой хуйни еще не додумались.
                                  В пхп есть другой способ ИМХО он более крассив. в одном месте написано чего и как вызывается.
                                  http://www.slimframework.com/docs/objects/router.html#how-to-create-routes
                                  Ответить
                                  • >> тут обычно принято прикладывать пруф
                                    > stackoverflow по этой ссылке
                                    There is no connection pooling in php.
                                    mysql_pconnect and connection pooling are two different things. There are many problems connected with mysql_pconnect and first you should read the manual and carefully use it, but this is not connection pooling.

                                    я знаю, ты меня затралел, лалка

                                    > http://www.slimframework.com/docs/objects/router.html#how-to-create-routes
                                    > джумла
                                    и как, уже работает в жумле? :)
                                    Ответить
                                    • В пхп есть другой способ ИМХО он более крассив. в одном месте написано чего и как вызывается.
                                      http://www.slimframework.com/docs/objects/router.html#how-to-create-routes

                                      где здесь про джумлу?
                                      Ответить
                                      • тут - нигде
                                        (вообще это близко к тому, о чем я спрашивал)
                                        однако
                                        http://www.opensourcecms.com/general/cms-marketshare.php
                                        можно узнать, где в вышеперечисленном это используется?
                                        как среднестатистической пыхобляди взять и запилить такой рест апи для своего корпоративного портала говнодомашней страницы на вордпрессе без анальной боли?
                                        Ответить
                                        • https://habrahabr.ru/post/274631/
                                          как минимум на этом
                                          Ответить
                                          • кошмар какой
                                            https://github.com/pagekit/pagekit/blob/develop/app/modules/database/src/Query/QueryBuilder.php

                                            Реально люди в 2016м году так пишут??

                                            protected function getSQLForSelect()
                                                {
                                                    extract($this->parts);
                                                    $query = sprintf('SELECT %s FROM '.$from, $select ? implode(', ', $select) : '*');
                                                    foreach ($join as $j) {
                                                        $query .= sprintf(' %s JOIN %s ON %s', strtoupper($j['type']), $j['table'], (string) $j['condition']);
                                                    }
                                                    if ($where) {
                                                        $query .= ' WHERE '.$where;
                                                    }
                                                    if ($group) {
                                                        $query .= ' GROUP BY '.implode(', ', $group);
                                                    }
                                                    if ($having) {
                                                        $query .= ' HAVING '.$having;
                                                    }
                                                    if ($order) {
                                                        $query .= ' ORDER BY '.implode(', ', $order);
                                                    }
                                                    return ($limit === null && $offset === null) ? $query : $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $limit, $offset);
                                                }
                                            Ответить
                      • всем доброго утра

                        > У меня возникала необходимость отличать '' от нулл. Последний комментарий. Он может быть пустой, а может и не быть его. Задача: найти заказы с последним пустым комментарием.

                        как ты себе представляешь передачу с клиента на сервер "последнего комментария" в двух различных состояниях - "пустой" и "его нет"? как должен выглядеть UX в этом случае? возможно, у вас что-то отличается, но в 146% случаях это будет textarea, который человек видит всегда и просто не заполняет его при отправке формы - в этом случае он будет пустой или null? :)

                        думай ещё над своим примером

                        а я тебе ещё один пример дам
                        > Сам нуллом в строках не пользуюсь, не только в БД
                        в постгресе, где в отличие от оракла следуют стандарту и различают '' и null, функция поиска подстроки substring возвращает null, если по заданной регулярке не было найдено такой подстроки

                        а теперь сконкатенируй результат этой функции с другой строкой без coalesce, я сейчас в комментарии выше даже специальную олимпиаду открою по такому случаю
                        Ответить
                        • Была у меня задача. Сейчас расскажу суть только сначала чуть теории

                          когда товар везут через границу ему назначают ГТД у товара произведенного в РФ ГТД нет т.е. он пустой
                          Иногда бляди оптовики на позиции которые произведены не у нас не ставят ГТД в счет фактурах.
                          И это проблема потом в будущем.
                          Решается она как раз через отличие пустой строки от null т.е. если в БД поле с ГТД null надо эту позицию пробивать по производителю если он не РФ то формировать документ отсылать его поставщику в котором выебать его как Шамиль пидора.
                          Ответить
                          • я ничего не понял
                            оптовики ставят '' или null для позиции, которая импортирована? что им помешает сделать наоборот?
                            как можно заложить логику на разнице '' и null? почему не сделано специальным boolean атрибутом? как выглядит межсистемное взаимодействие? прямо так и описано в логике - если null, то товар отечественный, а если '' - импортирован, но не проставили код при импорте?
                            Ответить
                            • оптовики ставятят --,-,'', и еще хуй знает сколько обозначений и указывают страну производитель или кодом или словом Россия.
                              так вот эти комбинации я храню как пустую строку.
                              Если страна производитель не Россия или не указана, а гтд нет я храню null

                              Потом собираю все null и для каждой позиции принимаю решение если я выясняю что это РФ ставлю отметку пустая строка. Если не могу выяснить пишу письмо поставщикам.
                              Ответить
                              • ставят где? почему нет валидации ввода?
                                что мешает оптовику поставить сразу пустую строку для импортного товара, и наебать твою логику, где ты постанализ делаешь только для null?
                                Ответить
                                • Он и найбывает. Но если он код страны ставит не Россия то его наебка не проходит. Вот если он маркирует деталь как Россия и ГТД не выставляет. Тогда я пропускаю такой товар к отгрузке его покупает клиент и если клиент потом пишет что дескать его кто то там выебал за то что он должен был использовать только отечественное а мы ему подсунули Китай. Тогда мы ебем поставщика.
                                  Ответить
                              • Рассмотрим все возможные варианты:
                                1. Производитель не Россия и поле ГТД валидно => товар импортный, OK.

                                2. Производитель не Россия и поле ГТД невалидно или не заполнено => товар (возможно) импортный. Зовём Шамиля, если он действительно оказался импортным.

                                3. Производитель Россия и поле ГТД невалидно или не заполнено => товар отечественный, OK.

                                4. Производитель Россия и поле ГТД притворяется валидным => кто-то врёт.

                                *****

                                Итак, требуются два двоичных значения: совпадение производителя с Россией и валидность/присутствие ГТД.

                                Полагаю, что происхождение товара можно каждый раз проверять простым условием, если есть отдельная колонка для страны, эта колонка индексируется и в ней присутствуют только стандартные значения. В совсем тяжёлом случае (если база уже забита значениями типа «Расия, на деревню дедушке») придётся добавлять колонку is_russia.

                                С ГТД чуть сложнее: нужно ещё проверить валидность, что на каждый чих делать слишком затратно. Проще сразу не хранить в базе невалидные значения, заменяя их при вводе на пустую строку или на null. В совсем тяжёлом случае можно добавить в базу колонку gtd_is_valid.

                                *****

                                Ты предлагаешь смешать эти два флага в один и возвращать:
                                а) null, если (not is_russia) & (not gtd_is_valid) (мой случай 2);
                                б) '', если is_russia (мой случай 3);
                                в) другие значения в противном случае, т. е. (not is_russia) & gtd_is_valid.

                                Случай 4, как я понял, специально не обрабатывается.

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

                                Остаются вопросы:
                                1. На каком этапе производится замена поля ГТД на пустую строку или на null? Возможен ли вариант, что запись будет обработана дважды или пропущена?

                                2. Где-нибудь хранится флаг, указывающий, что Шамиль вызван письмо поставщику отправлено?

                                3. Где-нибудь хранится флаг, указывающий, что страна происхождения уточнена?

                                Возможно, я чего-то не понимаю, но у меня сложилось впечатление, что кто-то жмот и пытается сэкономить на спичках.
                                Ответить
                                • 1. На каком этапе производится замена поля ГТД на пустую строку или на null?
                                  На этапе загрузки счет фактуры от поставщика.
                                  2. Где-нибудь хранится флаг, указывающий, что Шамиль вызван письмо поставщику отправлено?
                                  Само по себе письмо это лишь итог ветки в бизнес логике. там создается объект "проблема" с типом проблема у поставщика в неё вносится текст что дескать поставщик не указал ГТД и ставится отметка что менеджер "Система" отправил гневное письмо ждем ответа.

                                  3. . Где-нибудь хранится флаг, указывающий, что страна происхождения уточнена?
                                  нет.

                                  Возможно, я чего-то не понимаю, но у меня сложилось впечатление, что кто-то жмот и пытается сэкономить на спичках.

                                  Я не жмот ИМХО проще обработать одно поле в 3 состояниях чем комбинацию 2 полей в 2 состояниях каждое.
                                  Ответить
                          • для логики программы на нулл-ность полагатся я бы не стал. просто добавляешь выделенный флаг было это поле заполнено пользователем или нет. в конце концов, как резонно было замечено выше, если бы у тебя были нулл строки то ты бы ой как еще потрахался с ними в гуях (личный опыт).

                            а вот то что на самом деле говно это то что в некоторых ситуациях оракакал делает из `''` - `' '`. (из пустой строки пробел.)

                            пустая строка - нулл, это еще как-то оправдать можно. но вот пробел...
                            Ответить
                            • > (из пустой строки пробел.)
                              пример?
                              Ответить
                              • под рукой ничего нету. (оракл был на прошлой работе.)

                                быстрое гугление:

                                https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:59845202 77372

                                A ZERO length varchar is treated as NULL.

                                '' is not treated as NULL.


                                '' when assigned to a char(1) becomes ' ' (char types are blank padded strings).

                                '' when assigned to a varchar2(1) becomes '' which is a zero length string and a zero length string is NULL in Oracle (it is no long '')
                                Ответить
                        • > как ты себе представляешь передачу с клиента на сервер "последнего комментария" в двух различных состояниях - "пустой" и "его нет"? как должен выглядеть UX в этом случае? возможно, у вас что-то отличается, но в 146% случаях это будет textarea, который человек видит всегда и просто не заполняет его при отправке формы - в этом случае он будет пустой или null? :)

                          Святая наивность ) Мир не ограничен интернет-магазинами, которые один раз сделались и всё. Существуют сложные и переменчивые приложения с длительным жизненным циклом сущностей. Вчера не было поля комментария, сегодня есть. Завтра, возможно, опять не будет. Кому его предлагали для заполнения, а кому нет - без пустой строки не разобраться.

                          Понимаешь? Пустая строка - это тоже ответ пользователя. Пустой, правда. А нулл - это отсутствие ответа. И поведение приложения может различаться в этих случаях. Если пользователь сказал, отъебись со своим комментом, значит надо отъебаться, а если пользователя не спрашивали, то надо спросить.

                          > функция поиска подстроки substring возвращает null, если по заданной регулярке не было найдено такой подстроки

                          И правильно делает. Только зачем тебе в таком случае клеить? Если результата поиска нет, то уже и клеить нечего, не говоря уже о том, что склейка строк - это не самое лучшее применение баз данных. Это уже клиентская логика, база данных должна отдавать, то, что нашла, а поклеить и разобраться может и клиент. Делаешь вот вьюшку, где один столбец - твоя регулярка и высасываешь клиентом хоть с null, хоть без null, это уже клиенту виднее, что ему надо.
                          Ответить
                          • > Существуют сложные и переменчивые приложения с длительным жизненным циклом сущностей. Вчера не было поля комментария, сегодня есть. Завтра, возможно, опять не будет. Кому его предлагали для заполнения, а кому нет - без пустой строки не разобраться.

                            (здравствуйте, я никита, и я не написал ни одного интернет магазина, всё как-то переменчивые системы с лайфтаймом годы)
                            и в этом случае затачивать логику на отличие '' от null в БД - вот это настоящий пиздец, раз уж так критично отследить был ли комент

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

                            случай из практики плиз
                            Ответить
                            • Блин, я вообще не понимаю, о чём тут можно спорить. Nullable fields - это одна из основных парадигм РСУБД, которая применяется не только к строкам, но и ко всем вообще типам данных. Строки - это частный случай. То есть БД должна хранить любой вариант, разрешённый этим типом данных, либо null. И не мешать говно с котлетами.

                              Случай из практики уже был. Могу ещё один:
                              Переодически собираются менеджеры с руководством, обсудить успешность готовых заказов. Для этого они делают распечатку заказов с комментарием о производственных косяках. Соответственно к встрече готовятся и заполняют поле коммента. При этом, если косяков нет, поле может быть пустое.
                              Задача от руководителя группы: найти все заказы, у которых ещё нет комментария о косяках производства, чтобы по этому списку быстро выдать живительных пиздюлей бездельникам.
                              Ответить
                              • > Соответственно к встрече готовятся и заполняют поле коммента.
                                ну вот, UX какой?
                                как они заполняют поле коммента, чтобы оно ушло на бек либо пустое, либо null??
                                самый очевидный способ вышел? может, у вас там спец галочка есть "хочу оставить комментарий"? почему эту галочку не хранить как отдельный атрибут? почему я не могу поставить галочку "проблем нет"?

                                > То есть БД должна хранить любой вариант, разрешённый этим типом данных, либо null.
                                и как, удобно? наилучший вариант?
                                Ответить
                                • А если не галочка а кнопочка без фиксации состояния оставить комментарий в DOM / на форме создаётся инпут. Который потом отправляется на сервер. Если он не создался то сервер фигачит null
                                  Ответить
                                  • а если инпут создался, а я туда ничего не ввел?
                                    как мне отменить создание инпута?
                                    Ответить
                                • > как они заполняют поле коммента, чтобы оно ушло на бек либо пустое, либо null??
                                  Заполнить поле - действие. По умолчанию поле NULL. Если в поле уже не нулл, значит действие было совершено, т.к. null туда никто никогда не отправляет.

                                  > почему эту галочку не хранить как отдельный атрибут?
                                  Можно. Но нахуя, если есть уже NULL? Костылить неудачную архитектуру упоротых разрабов? Типа, если БД смешивает пустую строку с нуллом, то проэмулируй, дружок, в коде поведение nullable field. Заебись.
                                  Ответить
                              • > Nullable fields - это одна из основных парадигм РСУБД

                                видел много проектов где все было обвешано "NOT NULL". потому что (народ говорит) быстрее. нуллность это доп флаг и его где-то надо хранить и обновлять.

                                > При этом, если косяков нет, поле может быть пустое.

                                пользователь случайно что-то ввел в этом поле, а потом нажал backspace что бы отменить. было нулл стало пустой строкой. удачи разгребать.

                                из всего говна которым напичкан оракл, вы выбрали не самое говнистое.

                                на сибасе в старые времена видел проекты где буквально все везде было обклепано `coalesce()` потому что народ на фронт-энде заибался долбатся. только не говорите мне что это лучше.
                                Ответить
                                • >видел много проектов где все было обвешано "NOT NULL". потому что (народ говорит) быстрее. нуллность это доп флаг и его где-то надо хранить и обновлять.

                                  Это уже на выбор программеров, юзать или нет. Архитектура и подход, они разные бывают, где-то удобнее nullable, где-то not null. Вопрос быстродействия спорный, т.к. если в поле null, то само поле не хранится в БД, значит экономим память и выборки быстрее. С другой стороны, если поле равно default value, то во многих БД тоже значение не хранится, т.к. похожий механизм работает. Но это от реализации зависит.

                                  > из всего говна которым напичкан оракл, вы выбрали не самое говнистое.
                                  Да я с ораклом в живую не знаком. Про приведение ораклом пустой строки к нуллу узнал только вчера от roman-kashitsyn
                                  Ответить
                                  • у всех RDBMS есть какие-то грабле-фичи. оракл как бы просто один из старейших выживших, и как следствие имеет самое большое количество "фич".

                                    иначе бы кастомеры слишком быстро на более дешевые альтернативы перебирались.
                                    Ответить
                                    • а какие у оракла дешевые альтренативы?
                                      MS-SQL не сильно-то дешевле *плюс стоимость венды*
                                      PostgreSQL примерно 30% от него покрывает

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

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

                                        убогий мёрж они уже худо-бедно сделали в последней версии

                                        + в постгресе могут внезапно случиться факапы, сравнимые с ударом в спину - то инстанс 9.5 течь начинает при интенсивном использовании временных таблиц на беке, поедая всю память на сервере, то таблицы дефрагментируются так, что вакуум занимает по несколько минут

                                        зато и в постгресе есть фичи, которых в оракле нет - одни только банальные массивы уже круть, по сравнению с костылями в оракле
                                        Ответить
                                        • TSQL express с filestream
                                          Ответить
                                          • штоэ?
                                            Ответить
                                            • > а какие у оракла дешевые альтренативы?
                                              например Sql Server 2008 Express & filestream
                                              говорю
                                              Ответить
                                              • субд с ограничением на число ядер и памяти? ты серьезно?
                                                Ответить
                                                • Проблему памяти обычно решает файлстрим. Зато бесплатно
                                                  Ответить
                                                  • как он её может решить?
                                                    как блобы могут помочь серверу отожрать меньше оперативной памяти, но продолжать поддерживать тысячу-две коннекшенов?
                                                    Ответить
                                                  • ахринеть

                                                    а если у меня таблица на 20 миллионов строк и это сильно нормализованная OLTP, какой тут файлстрим? все в XML и в BLOB чтоле??
                                                    Ответить
                                                  • >>Зато бесплатно
                                                    нет

                                                    во-первых в лицензии express есть лимиты на использование
                                                    во-вторых резать по колву ядер смешно
                                                    и наконец винда нифига НЕ бесплатна
                                                    Ответить
                                        • >>пожалуй, не хватает мат. вьюх,

                                          http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html
                                          Ответить
                                          • гуэст, зачем ты мне это прислал, я знаю об этом, это хуйня, а не мат вьюха
                                            хочу рефреш он коммит, хочу фаст рефреш
                                            (я уж не говорю, что оракл умеет в квери реврайт, который лично мне ни разу не пригодился)

                                            а с такой балалайкой, которую надо вручную дрочить refresh materialized view (вероятно, по режиму complete, ибо ничего иного не сказано) пусть идут в жопу - мне проще вручную сделать то же самое обычной таблицей + функцией, которая будет рефрешить ровно так, как я хочу, а бек научить дёргать такую функцию
                                            Ответить
                                            • лол, она правда сама не перестраивается после коммита?
                                              тогда в жопу её, правда

                                              в ms-sql с версии 2000 (или с 2005) такая шляпа есть
                                              Ответить
                                              • можно пример? а то заинтересовался, и не нашёл
                                                есть только какая-то фигня indexed view, выглядит и ведет себя совсем не так же
                                                Ответить
                                                • А что именно не так же?

                                                  Я создаю индексированную вьюшку по запросу, и база всегда гарантирует мне что там свежие данные

                                                  При этом она строит граф зависимостей и обновляет ее только когда данные обновляются
                                                  Так что работать должно довольно быстро
                                                  Ответить
                                                  • слишком много оставили внутри, в черном ящике, начиная с неочевидного синтаксиса и отсутствии вменяемой документации (реально, проблема на мсдне), но претензии не тут

                                                    > обновляет ее только когда данные обновляются
                                                    обновляет как, хранит ли sql server логи всех изменений исходных таблиц, чтобы в "индексированной" вьюхе изменить только часть (fast refresh)? где хранит? понимает ли sql server что над исходной таблицей может быть построено куча вьюх, каждая из которых захочет узнать про изменения? (я уж не говорю про механизм, когда мат. вьюха лежит на соседнем инстансе) можно ли регулировать состав информации об обновлении, которая ведётся сервером (речь о том, что вьюха забирает 2 колонки из исходной таблицы, в которой 30 других колонок)

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

                                                    можно ли обновить тогда, когда мне удобно? (on demand)
                                                    у меня есть проект, где оракловая мат вьюха на прод сервере обновляется около минуты, и благодаря слабо изменяемым данным я могу себе позволить её обновлять раз в сутки ночью

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

                                                    вопросы вопросы
                                                    Ответить
                              • > найти все заказы, у которых ещё нет комментария о косяках производства

                                И при чём тут комментарии? Ты хочешь определять наличие косяков по наличию или отсутствию комментария?

                                По любому должен быть статус "есть косяки/нет косяков" или джоин на таблицу косяков. И по-любому понятие "пустоты" надо будет расширять, иначе сотрудники быстро наловчатся пробельчик в комментарий ставить.
                                select distinct responsible
                                from orders
                                where shit_happened
                                and comment is null
                                  or all_blanks(comment)
                                Ответить
                                • > И при чём тут комментарии? Ты хочешь определять наличие косяков по наличию или отсутствию комментария?
                                  Нет. Я же расписал. Коммент нужен, чтобы потом, на совещании не вспоминать судорожно, какие и где косяки были. Вот распечатка заказов, вот комменты-подсказки. Садимся и обсуждаем.

                                  >По любому должен быть статус "есть косяки/нет косяков" или джоин на таблицу косяков.
                                  Слишком избыточно для разового мероприятия. Удобнее одним полем обойтись.

                                  > И по-любому понятие "пустоты" надо будет расширять, иначе сотрудники быстро наловчатся пробельчик в комментарий ставить.
                                  Всё это проходили, запрещать пользователям пустой комментарий бесполезно, сначала будут пробелы, потом точки, потом "ок"... Это всё приводит к мусору в БД и нечитабельности таблиц. Лучше разрешить пустую строку... А, ну и строки я ещё тримаю перед отправку в базу и чищу от лишних символов. Так ччто расширять тоже не надо.
                                  Ответить
                    • > я в профессии не первый год, и работает куча систем
                      > я жру говно не первый год и поэтому оно мне нравится
                      Ответить
            • sqlplus придумали вообще до моего рождения.
              Ответить
    • Забыл добавить: сильно сомневаюсь, что Phase.Trim().Length распарсится в корректный запрос. Так что ты от БД получишь всю коллекцию, которая будет отфильтрована на на клиенте. Так что плюсик за говно.
      Ответить
      • О, спасибо. А как по-человечески подскажете или отправите на SO/метан?
        Ответить
        • Я может и подскажу... Только после ответа на вопрос: нахуя понадобилось выгребать из таблицы заведомо пустые записи? Я пол-дня уже мучаюсь и не могу понять, кому и зачем такое может понадобиться. Там что, исходник на whitespace лежит?
          Ответить
          • Ну может всё-таки не совсем пустые записи, а записи с пустым полем phase?
            Ответить
            • wires.Where(wire => wire.phase == null || wire.phase.Trim().Length == 0)

              Тогда да.
              Ответить
            • почему бы их сразу не хранить правильно, если уж есть анальные link2sql проблемы с правилами фильтрации
              Ответить
              • Я так подозреваю, что тут прикручивают к пизде рукав БД веб-апи. И трогать данные ну низзя совсем. Автор чего-то говорил про десять лет в проде и WebApi, то есть данные уже говно и ничего с этим не сделать.
                Ответить
                • "уже говно" исправляется одним апдейтом
                  Ответить
                  • Ага, в некоторых случаях да, если не гигабайты, если не лок на всю таблицу и если не критичен простой.
                    Но у нас аффтар слился, не подумал в личке отключить нотификации и слился ) Так что мы его уже, наверное, не спросим
                    Ответить
                    • Нет в сети меньше дня - это слился? Удивили. В комментарии ниже(http://govnokod.ru/19747#comment319774) я ответил на ваш вопрос?
                      Ответить
                      • >Нет в сети меньше дня - это спился
                        Ответить
                        • Меня не было 3,5 часа
                          Ответить
                          • Ну я ебу что у вас в рашке продают, может, уже и за это время спиться можно :)))
                            Ответить
                            • Ты опять политоту разводишь? Между прочим, Порошенко бегает к нам по ночам закупаться бухлом.
                              Ответить
                              • Причем здесь поросенко, я же в Германии живу. Но боярышник и фуфыри вроде как ваша специализация.
                                Ответить
                      • Ага. Ага.
                        Ответить
                  • Может и так, но это зависит не от меня. Это же сделать надо. А зачем трогать то, что работает? Лучше новый клиент написать. Кстати, с этой БД работает много разных клиентов. И все завязаны на её косячных данных. Если исправить - придется все клиенты переписать, а их писали индусы, которых уже не найти.
                    Ответить
                • И снова вы полностью правы
                  Ответить
        • Так, предыстория понятна... Самый лучший вариант, если всё нормально работает - не трогать. Пусть это говно живёт, ещё и не такое видели. Хотя бы понятно, что делает, уже хорошо.
          А вот если тормозит/нагружает сеть, тогда надо выборку переносить на сторону БД. Тут ровно два варианта: либо ручками запрос с клиента (что говно), либо делать вьюху по таблице с выборкой (что тоже говно, а в некоторых случаях полное говно).
          Тащем-та выбор между говном, говном и говном.
          Ответить
          • То есть на с#, используя linq2sql нельзя?

            Тогда: Пикачу, Говно, я выбираю тебя!
            Ответить
            • Хы, если заказчик хочет говно, он его получит. Он будет сопротивляться, если ему предлагать не-говно. Если говно исчезнет, он его найдёт и купит. Просто потому что он хочет говно.

              p.s. linq2sql не нужен, чтобы разбираться в тонкостях выражений. Linq2sql нужен, чтобы распарсить дерево и составить запрос на сервер, там, где он может. Он нужен, чтобы запрос был записан нативным кодом, что уже очень много. И да, таки концепция его использования предусматривает, что его IQueryable иногда превращается в тыкву IEnumerable со всеми исходящими...

              p.p.s. Преждевременная оптимизация - ещё худшее говно, чем это.
              Ответить
      • вроде как переводится в
        LEN(LTRIM(RTRIM(phase)))
        Ответить
        • А может даже и просто:
          LENGTH(TRIM(phase)) = 0

          или даже
          TRIM(phase) = ""

          Ручками-то можно варианты подобрать, а кто возьмётся проверить? Мне самому интересно.
          Ответить
          • exec sp_executesql N'SELECT [t0].[ID], [t0].[FirstName]
            FROM [dbo].[User] AS [t0]
            WHERE LEN(LTRIM(RTRIM([t0].[FirstName]))) = @p0',N'@p0 int',@p0=0

            из профайлера
            Ответить
            • Спасибо, Хер, не знал. Ну mssql поддерживает, но не им единым... )
              Ответить
              • По умолчанию Linq2Sql работает только с MsSQL, но есть и кастомные интеграции для Oracle и MySQL. Там внутри свои query билдеры
                Ответить
    • В чём говно?
      Ответить

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