|
|
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarerКакие - неопределенность. Скажем, представьте себе, что в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие? password <> '' ? password is not null ? ( password <> '' ) and ( password is not null ) ? length ( password ) > 0 ? any other idea? password is null означает что у юзера была возможность не вводить пароль, и он его не вводил. password = '' означает что юзер ввел пустую строку в качестве пароля. вы все еще не видите разницу между пустой строкой и неопределенным значением, но легко представляете себе несколько разных пустых строк, совместимых с любым другим типом данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 19:10 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
fooopassword is null означает что у юзера была возможность не вводить пароль, и он его не вводил. password = '' означает что юзер ввел пустую строку в качестве пароля. Возможна и такая трактовка. Она означает, что ответ, который чуть дальше дал Frankie, неверен (не является ответом на поставленную мной задачу). Вот и иллюстрация проблем, вызываемых указанным различием. Простейшая вещь, а вы с ним уже поняли по-разному. А что было бы, если бы каждый из вас разрабатывал свой модуль, а потом потребовалось бы связать их в каком-то бизнес-процессе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 19:55 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ответ Frankie (3й вариант) - верен, почему нет? вы же не предполагали аутентифицировать юзера как-то иначе, чтобы наглядно проиллюстрировать не наши проблемы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 20:30 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
foooответ Frankie (3й вариант) - верен, почему нет? Потому что задача поставлена однозначно - "не давать вводить пустые пароли". Фильтрация "паролей, которых пользователь не вводил" является логической ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 20:33 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
а мы не знаем что есть "пустой". пароль - последовательность символов, в нем может не быть ни одного символа или он может отсутствовать как объект. в строке может храниться список, например, прав на доступ (acl). в этом случае пустая строка может означать запрет на все действия, null - наоборот - полный доступ. это логично и удобно. вот поэтому и задача поставлена неоднозначно, и разговариваете вы сами с собой... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 21:33 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelR Сергей Васкецов ModelRно без NULL невозможен Outer Join Это ошибочное утверждение.Плз подробнее таблица t1: id_t1 xxx таблица t2: id_t2 id_t1 yyy логика такая: 1. Все показанные поля обязательные. 2. t2.id_t1 ссылается на t1.id_t1. 2. На одну запись в таблице t1 не может ссылаться более одной записи в таблице t2 (но может вообще ни одной не ссылаться). Тогда 1. Запрос типа select t1.*,t2.* from t1 left outer join t2 on t1.id_t1=t2.id_t1 легко возвращает null-ы в качестве значений полей yyy и id_t2. 2. В нем outer join нельзя без потери смысла заменить на inner join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 23:37 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer foooответ Frankie (3й вариант) - верен, почему нет? Потому что задача поставлена однозначно - "не давать вводить пустые пароли". Фильтрация "паролей, которых пользователь не вводил" является логической ошибкой. Мой ответ основан на выборе самого надёжного решения, Вы же призываете рисковать надёжностью ради экономии времени на жалкую password is not null. Понимаете, я не знаю контекста и обязан учитывать, что в password может попасть NULL. Глупо, просто глупо зависеть от инетрперетации NULL и ''. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 12:16 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer ModelRХотел ответить, но уже отвечено: Не согласен принять такой ответ без уточнений. Чем, по-Вашему, код Код: plaintext 1. 2. 3. лучше, нежели Код: plaintext 1. 2. 3. ? Второй, однако, спокойно обойдется без null.Дык это и есть способ налететь на вредный постулат "null рассматривается как такое же значение, как и любое другое". Скажем теперь задача - выдать нестыковки, но как их отличить:( 2 Сергей Васкецов Никто не говорил, что исходные таблицы должны иметь NULL -поля. Речь о том, что outer join - такая операция , которую невозможно корректно определить (имеется ввиду с результатом - также таблицей) не используя понятие NULL. Частные случаи разумеется могут без него обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 12:19 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
foooа мы не знаем что есть "пустой". Это, пардон, отмазка, но забавная тем, что снова приводит к моему тезису: "не знаем, что есть "пустой"" - как раз та неопределенность, которую я зачислил в неудобства. FrankieМой ответ основан на выборе самого надёжного решения, Я понимаю. Правильно будет сказать - самого надежного из возможных в данной архитектуре. Потому что это решение не есть самое надежное вообще, стоит ли объяснять, почему? FrankieВы же призываете рисковать надёжностью ради экономии времени Не стоит делать поспешные и неверные выводы о том, к чему я якобы призываю. FrankieПонимаете, я не знаю контекста Именно. Поэтому Вы либо принимаете внутренний стандарт, определяете контекст (и имеете проблемы, например, при интеграции с другими модулями, выполненными в другом контексте) либо должны помнить и в каждом месте выполнять по две проверки (а это - заведомо тонкое место, где-то да забудете). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 12:23 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarerЯ понимаю. Правильно будет сказать - самого надежного из возможных в данной архитектуре. Потому что это решение не есть самое надежное вообще, стоит ли объяснять, почему? Конечно не стоит. По условию MSSQL, потому и такой ответ. softwarerИменно. Поэтому Вы либо принимаете внутренний стандарт, определяете контекст (и имеете проблемы, например, при интеграции с другими модулями, выполненными в другом контексте) либо должны помнить и в каждом месте выполнять по две проверки (а это - заведомо тонкое место, где-то да забудете). Если говорить вообще - то проблемы безусловно возможны. Если про данный пример - не вижу, где они могут быть. На практике конечно я всегда изучу контекст и напишу минмальную достаточную проверку. Про две проверки согласен, всегда раздрожало, как в php надо было писать if (isset($a) && $a!='smth' ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 12:33 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
2 stenf Вы действительно перевыпускаете спецификацию и все чертежи входящих деталей на некую сборку СБ12345, если примените ее (без каких-либо изменений) в другом изделии ??? Уже несколько раз прочел, но все не верится.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 12:42 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelRДык это и есть способ налететь на вредный постулат "null рассматривается как такое же значение, как и любое другое". Стоп-стоп-стоп. В концепции "null вообще нет" постулат "null рассматривается..." определенно не верен :) Давайте по пунктам. Глобально - я считаю null большим достижением, очень полезной вещью в интересующей нас области, причем вещью, реализованной оптимально или близко к тому. Далее, вышеуказанный постулат - в рамках существующего null - я считаю вредным, неправильным. В то же время было выдвинуто локальное утверждение - без null невозможен outer join. Это утверждение представляется мне неверным, что я как-то пытаюсь обосновать. Если сделать описанную модель, она в целом будет хуже существующей - из-за отсутствия null. Но в то же время именно outer join будут работать ничем не хуже. ModelRСкажем теперь задача - выдать нестыковки, но как их отличить:( Я могу придумать какой-то ответ, но имхо не в этом суть. Понятно, что "с бедра" я - или кто-то другой - вряд ли предложит модель поведения, оптимальную в каждой детали; это все-таки задача для достаточно серьезных раздумий и обсуждений. Но принципиальная возможность имхо показана, оставшиеся задачи - технические, решаемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 19:43 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
barsukoff Сделать иерархию, чуть выше с каринкой я писал. Верхом иерархии будет Ваша сборка ,в таблице связи её (IDВернейДетали=0) по ней мы узнаем что это предел совершенства и выше искать не нада , в этой же таблице добавим поле ЗАКАЗ. вы невнимательно читали топик. Иерархия и так есть, она у меня называется Входимостью. Содержит ссылку на детальСборку, детальПодсборку и количество. softwarer Почему в нескольких? Если замена идет в одном месте, в одной сборке, значит update-им одну строку одной таблицы. Если замена идет в "нескольких из многих" - меняем несколько строк, скорее всего в одной таблице. ... Про это. Возможно и есть, но в первом посте темы оно... как минимум не очевидно. Можно предположить, что у Вас IDСборки есть ссылка на таблицу деталей, если так, дерево становится видным, но это повод пересмотреть стандарты именования :) наверно я так все по-дурацки обьяснил, что всех запутал. Давай-те по-новой, с учетом вашего предложения пару страниц назад: Код: plaintext 1. 2. В таблице Входимость IDСборки и IDДетали ссылаются на Детали.IDДетали, это и есть дерево изделия. Можно конечно было их назвать IDДеталиСборка и IDДеталиПодсборка но это не суть важно. Что теперь происходит, если мы хотим создать новую детать и включить ее вместо старой ? Инсертим новую деталь. Запоминаем получившийся ее ID'шник. Идем во Входимость, и заменяем IDСтаройДетали на IDНовойДетали везде где она встречается. Потом идем в другие таблицы, содержащие ссылки на IDСтаройДетали и их тоже меняем. Таких "других" таблиц вообще говоря может быть много. softwarer Вот уж простите, не верю я в это. Не бывает так. В изделии и в какой-то его подсборке запросто может быть "четыре таких винтика и два вот таких", но вот чтобы шесть уникальных были типовым случаем..... ... Не понял. Это "то есть" прямо противоречит предыдущей Вашей фразе. Если они уникальны, значит изменение касается только одного вхождения. Чтобы поменять все вхождения, надо много ссылок из сборки на один винтик. нет нет, если винтик входит например в 50 сборок одного изделия, то во всех 50 сборках идет ссылка на один и то-же винтик. Про уникальность я тут похоже вообще неудачно выразился, он уникален в том смысле, что для конкретного изделия в таблице Детали винтик "ВИНТ В.М5-6ех14.48.С.029 Г.17475-80" имеет только одну запись, и все вхождения ссылаются на нее. Но это только для одного изделия. Если этот винтик входит в 2 изделия, то в таблице Детали будет уже 2 записи, но каждая для своего IDИзделия. softwarer Итак, непомнюкакому заводу были заказаны 20 самолетов Ту-4 - опытная партия. Сделали первые три, облетали, по первоначальным результатам решили сразу внести в остальные некоторые изменения. Имхо вполне обычная ситуация, которая должна закончиться тем, что в базе лежит заказ на три самолета конструкции 1 и на семнадцать самолетов конструкции 2. Далее, изменения, сами понимаете, были не очень велики, поэтому обе версии конструкции допустим, отличаются в 5% мест. Имхо вполне естественно иметь в базе 95% общего и дважды по 5% - различий. Ситуация, когда изначально в базу введено двадцать раз по не помню уж сколько cотен тысяч деталей в каждом, а потом оператор меняет одно и то же в семнадцати местах, оптимальной имхо не выглядит. А при чем тут собственно оператор ? Для него это будет выглядеть как окно, в котором он грубо говоря печатает старое и новое обозначение винтика, потом галками указывает изделия, где надо провести изменения и жмет ОК. Ему глубоко наплевать как там внутри это сработает. Но мне-то не наплевать. В случае вашего варианта, если винтик используется в нескольких изделиях, мы (как я уже писал) создаем новый винтик, и апдейтим все таблицы, которые имеют ссылки на старый винтик, заменяя их ссылками на новый (разумеется только для отмеченных изделий). Тут кстати возникнут интересные моменты, в частности, потребуется как-то различать к какому изделию относиться конкретная запись входимости (сейчас эта информация имеется в Детали.IDИзделия). В моем варианте, апдейтим записи винтика для каждого изделия. Не вижу очевидных преимуществ первого варианта. softwarer Это неудачная мысль, пожалуй не стоит ее обсуждать. в таком случае как насчет привязки детали к изделию ? Надо-ли понимать так, что вы согласны с тем, что она нужна ? softwarer Так то же самое. К моменту детализации хотя бы одной сборки общая схема изделия уже известна, а следовательно ввести ее несложно. ... Безусловно. Давайте на пальцах: Вы не знаете, что принесут раньше - карбюратор или коробку передач. Но еще на этапе ввода общей информации по автомобилю Вы уже знаете, что в нем есть салон, есть коробка передач, есть двигатель, в котором есть карбюратор... знаете принципиальную схему изделия и можете ее ввести. А дальнейшее наполнение - спокойно пройдет в любом порядке. Не понял, а что значит "ввести принципиальную схему изделия" ? Ввести сначала все сборки что-ли ? Они-же не все известны сразу. Я-же говорю, оператор ввода входимости не знает, что карбюратор входит в двигатель. Что-ж ему теперь, запретить вводить структуру карбюратора, пока он не узнает про двигатель ? Так ведь и этого будет мало, двигатель тоже не напрямую к нулевой сборке автомобиля цепляется. softwarer Я перевел эту фразу ровно так же, как и Вы. Я сказал, что меня в ней не устраивает. Если Вы с этим не согласны - было бы разумно это обсудить. Вместо этого Вы полагаете, что я неправильно перевел. Подозреваю, связано с тем, что Вы придерживаетесь точки зрения "если бы перевел как я, то и думал бы как я". Печально..... не вижу правда, почему в результате именно я в глупом положении, но давайте считать, что Вам виднее. если-бы вы перевели эту фразу так-же как и я, то чушью-бы ее не обозвали. Ладно, закрыли тему softwarer С тем, что микрософт такую идею продвигает, Вы готовы согласиться? Какую идею ? Возможность создания несложных БД с помощью дизайнера ? softwarer перешли на ориентацию на неграмотных программистов. Точнее, ту стратегию маркетинга, которую применили на пользователях, применили и на программистах. И снова сработало неплохо, популярности среди программистов добились. "стратегия ориентации на неграмотных программистов". Было-бы неплохо подкрепить такие слова ссылками, а то это выглядит очередной "интепретацией" и "логическим выводом", за которые вы меня тут так критиковали softwarer Если посмотрите, увидите, что разницы в сложности никакой. Что же до лучше-хуже, вопрос в количестве применений. Для запроса, который в течение жизни системы применяется, например, 100.000 раз, требования к оптимальности одни; для запроса, который выполняется, например, 40.000.000 раз в неделю, требования к оптимальности другие. ну хорошо, если даже и нет разницы в сложности. И что собственно из этого следует-то ? Стратегия ориентации на неграмотных программистов ? softwarer stenf, простите, знаете ли Вы Oracle достаточно, чтобы от своего имени критиковать его за излишнюю сложность? Если так - если хотите, давайте создадим отдельный топик в "Сравнении СУБД" и поговорим. Если нет - простите, но говорить со "слышал звон" бессмысленно. Вы взяли одно сомнительное утверждение, и не глядя на пример, развили из него теорию "что в этом примере находится". нет я не знаю Оракл, и от своего имени я его и не критиковал. Я сказал "критикуют". Что-бы убедиться в наличии этой критики, не надо знать Оракл. А раз критикуют, то не все здесь так просто, дыма без огня не существует. softwarer А вот ситуация "сервер не дает применить эффективное решение, поскольку решает за меня слишком грубо" меня, если честно, напрягает и эффективным я такой подход не считаю. Вообще согласен, оптимальный подход - некое автоматизированное действие по умолчанию с возможностью изменить поведение по-желанию. Но в каждом случае надо смотреть по ситуации, я допускаю наличие случаев, в которых ничего вы руками не сделаете softwarer Код, понятный Вам, будет непонятен человеку, позавчера впервые открывшему учебник по программированию. А код, понятный тому, не будет понятен пятилетнему ребенку. Говоря "писать понятный код" Вы на самом деле не говорите ровно ничего, бросаете бессмысленный лозунг, поскольку не даете ответа на ключевой вопрос - "понятный для кого". Для любой задачи, для любой команды, есть некий оптимальный минимальный уровень ее членов, равно как и оптимальный максимальный. Есть задачи, куда просто нельзя привлекать студентов, есть задачи, куда однозначно не следует привлекать гуру. Код должен быть понятен членам команды. Говорить "код хорош только если его без малейших усилий поймет каждый придурок" - неоптимально с точки зрения решаемой задачи. Далее, писать "слишком сложный код" безусловно плохо. В то же самое время команде полезно, если ее члены подтягивают свой уровень, члены "минимально допустимого уровня" должны быть временным явлением. а причем тут пятилетние дети ? Да, код должен быть понятен членам команды. Понятность - никакой не лозунг, а здравый совет. softwarer Пример хорошего, правильного подхода: вопрос, ответ, результат. Хотя я почему-то подозреваю, что Вы этот пример не воспримете. я тоже например не знаю того хитрого оператора. И что с того ? (если позволите, то гуглить не полезу, поздно сейчас, на выходных возможно) softwarer Вы забываете про одну мелкую, но важную деталь: "относительная сложность кода" - вещь субъективная. ... Скажете, этот код сложнее? Нет, ему так было проще. if - более простое понятие, чем например "массив". Так вот: совершенно незачем ориентировать технологию на тех, кто будет писать такой код и из-за этого будет лишен необходимости изучать такие сложные концепции как массивы, не говоря уже о таких дико сложных, как например ассоциативные массивы. вы немного смешиваете понятия. Дело не в том, что массив сложнее, чем if. Дело в том, что некоторые подходы усложняют код в не зависимости от ваших познаний (я уж не говорю о таких случаях, как глубокая вложенность if-else'ов например, очевидно тут надо не людей нанимать, способных разобраться в n-уровневой вложенности, а упростить код). Например рекурсия. Может быть полезна в некоторых случаях. Однако вообще она усложняет понимание в не зависимости от того, как хорошо вы в ней разбираетесь. Есть даже такой известный пример, когда рекурсию лучше заменить итерацией - вычисление факториала. softwarer Неправильное значение может появиться из-за неверного where в update. Неправильная строка может появиться из-за неправильного on в merge или where в insert..select. В чем разница? ... Я не очень понимаю, с какой стати я замучаюсь писать и сопровождать check-и, если это забота CASE-средства. Моя забота - нарисовать дугу в ER-диаграмме. Впрочем, даже если и надо будет писать руками - .... Вы всерьез полагаете, что аргумент "замучаешься писать foreign key-и" достаточен, чтобы не делать в БД никаких foreign key-ев? А ведь ситуация та же. хорошо, я понял ваши аргументы. Действительно, если выставить определенные проверки бизнес-правил, заложенных в БД и учесть незначительность (согласно вашего опыта) привносимых null проблем, то разницы нет. Если разрешите, задам вопрос такой вопрос: правильно-ли я вас понял, что при разработке схемы БД вы ориентируетесь на такие параметры как количество обьектов БД, кол-во чеков и пр. для обеспечения бизнес-правил, а получаются-ли в результате nullable поля - не обращаете внимания ? ModelR Вы действительно перевыпускаете спецификацию и все чертежи входящих деталей на некую сборку СБ12345, если примените ее (без каких-либо изменений) в другом изделии ??? нет, а с чего вы взяли ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2007, 21:40 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenf barsukoff Сделать иерархию, чуть выше с каринкой я писал. Верхом иерархии будет Ваша сборка ,в таблице связи её (IDВернейДетали=0) по ней мы узнаем что это предел совершенства и выше искать не нада , в этой же таблице добавим поле ЗАКАЗ. вы невнимательно читали топик. Иерархия и так есть, она у меня называется Входимостью. Содержит ссылку на детальСборку, детальПодсборку и количество. softwarer Почему в нескольких? Если замена идет в одном месте, в одной сборке, значит update-им одну строку одной таблицы. Если замена идет в "нескольких из многих" - меняем несколько строк, скорее всего в одной таблице. ... Про это. Возможно и есть, но в первом посте темы оно... как минимум не очевидно. Можно предположить, что у Вас IDСборки есть ссылка на таблицу деталей, если так, дерево становится видным, но это повод пересмотреть стандарты именования :) наверно я так все по-дурацки обьяснил, что всех запутал. Давай-те по-новой, с учетом вашего предложения пару страниц назад: Код: plaintext 1. 2. В таблице Входимость IDСборки и IDДетали ссылаются на Детали.IDДетали, это и есть дерево изделия. Можно конечно было их назвать IDДеталиСборка и IDДеталиПодсборка но это не суть важно. Что теперь происходит, если мы хотим создать новую детать и включить ее вместо старой ? Инсертим новую деталь. Запоминаем получившийся ее ID'шник. Идем во Входимость, и заменяем IDСтаройДетали на IDНовойДетали везде где она встречается. Потом идем в другие таблицы, содержащие ссылки на IDСтаройДетали и их тоже меняем. Таких "других" таблиц вообще говоря может быть много. Да, Вы на самом деле немного неточно объяснили. Надо было делать акцент не только (и не столько) на опытном производстве, сколько на его УНИКАЛЬНОСТИ / ШТУЧНОСТИ. Таким образом получаем, что один и тот же тип изделия (т.е. катапульта, мортира, гаубица и т.д. ) будет состоять из неизменной/фиксированной части и переменной части, определяемой требованиями покупателя-заказчика. Именно поэтому изделие привязывается к заказчику... Только я бы сделал так (примерно так было в нашей системе): Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2007, 07:10 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenf ModelR Вы действительно перевыпускаете спецификацию и все чертежи входящих деталей на некую сборку СБ12345, если примените ее (без каких-либо изменений) в другом изделии ??? нет, а с чего вы взяли ?С ваших пояснений. ИМХО обсуждение одного примера типа ДСЕa1a2bc1c2 Изделияc1 Заказ1 срок=15c2 Заказ1 срок=20 Входимостьчто куда сколькоa1b30a2b40bc13bc27 заменило бы 6 страниц топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2007, 11:38 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer ModelRСкажем теперь задача - выдать нестыковки, но как их отличить:(Я могу придумать какой-то ответ, но имхо не в этом суть. Понятно, что "с бедра" я - или кто-то другой - вряд ли предложит модель поведения, оптимальную в каждой детали; это все-таки задача для достаточно серьезных раздумий и обсуждений. Но принципиальная возможность имхо показана, оставшиеся задачи - технические, решаемы.Единственное принципиальное назначение NULL - отличить несуществующие (все равно по каким причинам) данные от существующих. Outer join по определению обязан уметь выдавать это отличие. Так что "оставшиеся задачи - технические" решаемы единственно игрой в слова. Давайте не будем в арифметике 0 называть нулем, пусть это будет специальное значение (1-1), ну переформулируем правила... - и что? избавимся от запрета делить на 0 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2007, 12:05 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelRЕдинственное принципиальное назначение NULL - отличить несуществующие (все равно по каким причинам) данные от существующих. Согласен. ModelROuter join по определению обязан уметь выдавать это отличие. Так что "оставшиеся задачи - технические" решаемы единственно игрой в слова. Вы сделали две ошибки. Во-первых, из того, что null - глобальный механизм решения какой-то задачи, не следует, что это единственный способ решения этой задачи, и локально не может быть применен другой. Если Вы имели в виду "null необходим" именно в плане "нужно будет как-то различать", я с этим соглашусь, но назову исходную формулировку неудачной. Во-вторых, outer join обязан не "выдавать", а "обрабатывать". Как обрабатывать для выдачи пользователю - я уже показал. Обрабатывать для логики внутри запроса - той же самой конструкцией default, скажем Код: plaintext 1. 2. 3. 4. превратится в Код: plaintext 1. 2. 3. 4. Так что как видите, то, что Вы необдуманно назвали "игрой слов" выливается во вполне конкретную реализацию, ни в коей мере на null не опирающуюся. Главный вывод: сделать можно, так что исходное утверждение не верно? Нужно ли так делать? Имхо не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2007, 13:02 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Ну, упражнения со списком селект никак не влияют на определение самой операции outer join. Или это какой-то особый outer join, где Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2007, 14:27 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Чтобы закончить вопрос о softwarer в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие? <li>password <> '' ? <li>password is not null ? <li>( password <> '' ) and ( password is not null ) ? <li>length ( password ) > 0 ? <li>any other idea? приведу, как это решается в проекте с которым я сейчас работаю. Ответ 5 :) Код: plaintext В принципе, одно условие, достаточно удобно пользоваться при сохранении надёжности 3го варианта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2007, 14:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34264335&tid=1544780]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
153ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 437ms |

| 0 / 0 |
