- 1
phases.Where(phase => phase == null || phase.Trim().Length == 0)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+4
phases.Where(phase => phase == null || phase.Trim().Length == 0)
Нашёл в своём проекте, эта строка прошла code review. phase - это строка.
Придерживайся какого-нибудь соглашения (пустая строка это string.Empty в БД, тогда поле NOT NULL), тримай строки перед отправкой в БД и будет тебе щастье. Будешь писать Ну или == null. Что удобнее.
А вдруг у них там почему-то char вместо varchar?
Серьёзно - БД в продакшене десять лет и никто не может представить, какое это говно. А я написал только webApi
Это не твоё собачье дело, оракл, что я пихаю в БД. Твоё собачье дело - положить туда то, что я дал, и вернуть мне в точности то же самое. Я не хочу терять свою информацию, только потому, что по статистике 95% не отличают пустую строку от DbNull.
Вот поэтому проще заменять пустые строки на NULL или "" (главное - единообразно) и не ебать мозг...
> по дефолту конвертирует пустые строки в NULL
А кому очень-очень-очень-очень-очень хочется поебаться с различением пустых значений (вдруг эти 5 пробелов и табуляция, оставленные юзером, так важны для истории) - дефолт же всяко можно перекрыть.
Вот. Я об этом и говорю. Но только это должен делать программер, а не БД по умолчанию. Если БД так делает по умолчанию, она считает программера обезьяной, которая не понимает разницы. Not Null же придумали? Вот въебите его туда. Хочется нуллов вместо пустых строк? Въебите constraint или триггер, если mysql головного мозга.
Я в этом правиле оракла вижу нарушение основного принципа работы БД: хранение данных. БД должна либо сохранить то, что я ей отдал, либо послать нахуй, потому что нельзя так хранить. Тут молча проглатывает и меняет тип. Оно бы ещё в инте 0 на null бы меняло...
то, что в стандарте написали иначе, еще не значит, что удобней
в том же постгресе 'foo' || (null as varchar) и 'foo || '' разные результаты даёт, тоже после оракла хочется морду набить тому, кто придумал такое
Ну и хуле? Чем старее, тем правдивее? Пусть себе продают... Таки уже давно продали и деньги потратили. А если надо будет назад - низзя! Обратная совместимость и кастомеры загрызут. Поэтому фича.
А в постгресе нинада строки с нуллом клеить. Не, ну вот правда, на что ты надеялся?
серьезно, эквивалентность '' и null - это очень удобно
пустая строка в колонке уже означает то, что она означает - нет содержимого, она уже окрасила себя в те цвета
а про говно и костыль - как стандартная функция, иногда сокращающая выражение в несколько раз, может быть плохой?
дано: есть таблица, в которой есть стабильный ключ и строковый доп атрибут, nullable - в неё мы будем апсертить.
есть, скажем, другая таблица (например, временная), в которой есть ключ из первой таблицы и "новое" значение строкового атрибута, nullable
как мне проверить без говна и костылей, что старое значение не совпадает с новым, и только в этом случае провести обновление записи?
о тщете и тлене nvl/coalesce или нет
Ответь, добрый человек на один простой вопрос. Какого хуя мне будет БД возвращать null, если я положил пустую строку, при том, что я могу положить и пустую строку и null?
Чтобы было честно, отвечаю на вопрос. Я не говорил, что coalesce плохая, негодная. Ей в самый раз говно разгребать. Я говорил о том, что она говно и костыль, т.е. обозначал область применения.
У меня возникала необходимость отличать '' от нулл. Последний комментарий. Он может быть пустой, а может и не быть его. Задача: найти заказы с последним пустым комментарием.
p.s. Сам нуллом в строках не пользуюсь, не только в БД, но и (ужас-ужас) в коде. Предпочитаю пустую строку, как отсутствие текста.
p.p.s. Ораклом тоже не пользуюсь. Ну потому что не нужен.
Оралук сучий, троль ебучий
Всей душой его ненавижу
говну, которое не умеет даже в пул подключений и рест интерфейсы делает через глубокий анус, место только для домашних страничек
Умеет.
> рест интерфейсы делает через глубокий анус
поподробней можно чего там не так с REST ?
тут обычно принято прикладывать пруф
если пыховно умеет, нахуя людям приходится поднимать pgbouncer?
> поподробней
говорят, есть такие языки и фреймворки, их изобрели те, то не осилил php, там можно в контроллере рядом с методом написать "GET /api/foo/{fooId}/bar/{barId}", и он сам разберет запрос, вызовет нужный метод, и кое-когда и даже wadl сгенерит
можно пример такого же на php?
>тут обычно принято прикладывать пруф
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://github.com/pagekit/pagekit/blob/develop/app/modules/database/src/Query/QueryBuilder.php
Реально люди в 2016м году так пишут??
> У меня возникала необходимость отличать '' от нулл. Последний комментарий. Он может быть пустой, а может и не быть его. Задача: найти заказы с последним пустым комментарием.
как ты себе представляешь передачу с клиента на сервер "последнего комментария" в двух различных состояниях - "пустой" и "его нет"? как должен выглядеть 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. Где-нибудь хранится флаг, указывающий, что страна происхождения уточнена?
Возможно, я чего-то не понимаю, но у меня сложилось впечатление, что кто-то жмот и пытается сэкономить на спичках.
На этапе загрузки счет фактуры от поставщика.
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 '')
Святая наивность ) Мир не ограничен интернет-магазинами, которые один раз сделались и всё. Существуют сложные и переменчивые приложения с длительным жизненным циклом сущностей. Вчера не было поля комментария, сегодня есть. Завтра, возможно, опять не будет. Кому его предлагали для заполнения, а кому нет - без пустой строки не разобраться.
Понимаешь? Пустая строка - это тоже ответ пользователя. Пустой, правда. А нулл - это отсутствие ответа. И поведение приложения может различаться в этих случаях. Если пользователь сказал, отъебись со своим комментом, значит надо отъебаться, а если пользователя не спрашивали, то надо спросить.
> функция поиска подстроки substring возвращает null, если по заданной регулярке не было найдено такой подстроки
И правильно делает. Только зачем тебе в таком случае клеить? Если результата поиска нет, то уже и клеить нечего, не говоря уже о том, что склейка строк - это не самое лучшее применение баз данных. Это уже клиентская логика, база данных должна отдавать, то, что нашла, а поклеить и разобраться может и клиент. Делаешь вот вьюшку, где один столбец - твоя регулярка и высасываешь клиентом хоть с null, хоть без null, это уже клиенту виднее, что ему надо.
(здравствуйте, я никита, и я не написал ни одного интернет магазина, всё как-то переменчивые системы с лайфтаймом годы)
и в этом случае затачивать логику на отличие '' от null в БД - вот это настоящий пиздец, раз уж так критично отследить был ли комент
и я снова прошу пример реальный, пожалуйста, можно скриншот, где вдруг не было критично, а потом стало, а потом опять не стало, а то теоретизация порядком поднадоела
случай из практики плиз
Случай из практики уже был. Могу ещё один:
Переодически собираются менеджеры с руководством, обсудить успешность готовых заказов. Для этого они делают распечатку заказов с комментарием о производственных косяках. Соответственно к встрече готовятся и заполняют поле коммента. При этом, если косяков нет, поле может быть пустое.
Задача от руководителя группы: найти все заказы, у которых ещё нет комментария о косяках производства, чтобы по этому списку быстро выдать живительных пиздюлей бездельникам.
ну вот, UX какой?
как они заполняют поле коммента, чтобы оно ушло на бек либо пустое, либо null??
самый очевидный способ вышел? может, у вас там спец галочка есть "хочу оставить комментарий"? почему эту галочку не хранить как отдельный атрибут? почему я не могу поставить галочку "проблем нет"?
> То есть БД должна хранить любой вариант, разрешённый этим типом данных, либо null.
и как, удобно? наилучший вариант?
как мне отменить создание инпута?
Заполнить поле - действие. По умолчанию поле NULL. Если в поле уже не нулл, значит действие было совершено, т.к. null туда никто никогда не отправляет.
> почему эту галочку не хранить как отдельный атрибут?
Можно. Но нахуя, если есть уже NULL? Костылить неудачную архитектуру упоротых разрабов? Типа, если БД смешивает пустую строку с нуллом, то проэмулируй, дружок, в коде поведение nullable field. Заебись.
видел много проектов где все было обвешано "NOT NULL". потому что (народ говорит) быстрее. нуллность это доп флаг и его где-то надо хранить и обновлять.
> При этом, если косяков нет, поле может быть пустое.
пользователь случайно что-то ввел в этом поле, а потом нажал backspace что бы отменить. было нулл стало пустой строкой. удачи разгребать.
из всего говна которым напичкан оракл, вы выбрали не самое говнистое.
на сибасе в старые времена видел проекты где буквально все везде было обклепано `coalesce()` потому что народ на фронт-энде заибался долбатся. только не говорите мне что это лучше.
Это уже на выбор программеров, юзать или нет. Архитектура и подход, они разные бывают, где-то удобнее nullable, где-то not null. Вопрос быстродействия спорный, т.к. если в поле null, то само поле не хранится в БД, значит экономим память и выборки быстрее. С другой стороны, если поле равно default value, то во многих БД тоже значение не хранится, т.к. похожий механизм работает. Но это от реализации зависит.
> из всего говна которым напичкан оракл, вы выбрали не самое говнистое.
Да я с ораклом в живую не знаком. Про приведение ораклом пустой строки к нуллу узнал только вчера от roman-kashitsyn
иначе бы кастомеры слишком быстро на более дешевые альтернативы перебирались.
MS-SQL не сильно-то дешевле *плюс стоимость венды*
PostgreSQL примерно 30% от него покрывает
ну про всякие mysql и файлики, разделенные запятыми, мы не говорим
из наиболее критично-повседневного в нем, пожалуй, не хватает мат. вьюх, что решается закатом вручную - мат таблицей вручную с рефрешем своей функцией вручную (о фиче квери реврайт по мат вьюхе говорить не приходится, но и справедливости ради, эта оракловая фича именно для проектов, где тысячи запросов уже написаны до нас)
убогий мёрж они уже худо-бедно сделали в последней версии
+ в постгресе могут внезапно случиться факапы, сравнимые с ударом в спину - то инстанс 9.5 течь начинает при интенсивном использовании временных таблиц на беке, поедая всю память на сервере, то таблицы дефрагментируются так, что вакуум занимает по несколько минут
зато и в постгресе есть фичи, которых в оракле нет - одни только банальные массивы уже круть, по сравнению с костылями в оракле
например 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 или целиком
вопросы вопросы
И при чём тут комментарии? Ты хочешь определять наличие косяков по наличию или отсутствию комментария?
По любому должен быть статус "есть косяки/нет косяков" или джоин на таблицу косяков. И по-любому понятие "пустоты" надо будет расширять, иначе сотрудники быстро наловчатся пробельчик в комментарий ставить.
Нет. Я же расписал. Коммент нужен, чтобы потом, на совещании не вспоминать судорожно, какие и где косяки были. Вот распечатка заказов, вот комменты-подсказки. Садимся и обсуждаем.
>По любому должен быть статус "есть косяки/нет косяков" или джоин на таблицу косяков.
Слишком избыточно для разового мероприятия. Удобнее одним полем обойтись.
> И по-любому понятие "пустоты" надо будет расширять, иначе сотрудники быстро наловчатся пробельчик в комментарий ставить.
Всё это проходили, запрещать пользователям пустой комментарий бесполезно, сначала будут пробелы, потом точки, потом "ок"... Это всё приводит к мусору в БД и нечитабельности таблиц. Лучше разрешить пустую строку... А, ну и строки я ещё тримаю перед отправку в базу и чищу от лишних символов. Так ччто расширять тоже не надо.
> я жру говно не первый год и поэтому оно мне нравится
Тогда да.
Но у нас аффтар слился, не подумал в личке отключить нотификации и слился ) Так что мы его уже, наверное, не спросим
А вот если тормозит/нагружает сеть, тогда надо выборку переносить на сторону БД. Тут ровно два варианта: либо ручками запрос с клиента (что говно), либо делать вьюху по таблице с выборкой (что тоже говно, а в некоторых случаях полное говно).
Тащем-та выбор между говном, говном и говном.
Тогда: Пикачу, Говно, я выбираю тебя!
p.s. linq2sql не нужен, чтобы разбираться в тонкостях выражений. Linq2sql нужен, чтобы распарсить дерево и составить запрос на сервер, там, где он может. Он нужен, чтобы запрос был записан нативным кодом, что уже очень много. И да, таки концепция его использования предусматривает, что его IQueryable иногда превращается в тыкву IEnumerable со всеми исходящими...
p.p.s. Преждевременная оптимизация - ещё худшее говно, чем это.
или даже
Ручками-то можно варианты подобрать, а кто возьмётся проверить? Мне самому интересно.
из профайлера
Это не я, это [code=<c#>]
Хотя вменяемый движок не должен так делать.