|
|
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelR Но не всегда правда. GROUP BY исправно все NULL сгруппирует в единственную строчку. Ага, еще один компромис :) ModelR в ORACLE Decode(NULL, NULL, 1, 0) будет 1 - успешно сравнилось. Да, в Informix тоже, как сами NULL так и переменные со значением NULL. Работает по принципу функции IS NULL. Никакой логики в этой логики :)) Однако это не мешает писать нормальный код, если это знать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:02 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepper4213 + null = null (не удобно) Это действительно неудобно, но проблема в том, что никакой другой вариант удобнее не будет. Рассмотрите практические примеры арифметических выражений, какую-нибудь себестоимость, и получится, что в ситуации, когда один из аргументов оказался null и был воспринят как 0, будет получен неверный результат, неверное число. Последствия в этом случае будут самыми отрицательными, хуже, чем если бы получился null. Правда, из этого правила есть исключения - агрегатные функции, например sum. С другой стороны, рассмотрите типичный пример строкового выражения, например формирование строки адреса из отдельных полей. Если в силу каких-либо причин не задан, например, почтовый индекс, результат конкатенации null будет совершенно точно не лучше, нежели "неполный адрес", почти наверняка хуже. Также я говорил и о другом моменте, о join-е. join по условию 0=0 представляется вполне разумным, естественным для любого ключевого поля, join по '' = '' - сомнительная, очень сомнительная операция. Наверное можно придумать пример, где он пригодится, но в массе он скорее приведет к проблемам. Далее, сортировка. Допустим, я пишу select * from table order by field nulls last. Если field строковое - перенос пустых строк в конец не выглядит безусловно неверным. Чаще пожалуй будет верным. Если field строковое - порядок сортировки -2, -1, 1, 2, 3, 0 будет.... противоречащим нормальным представлениям человека. В группировке пожалуй что особой разницы нет, хотя возможно надо подумать получше. И так далее. 4213 + 0 = 4213 (удобно) Sgt.PepperЭто я пытаюсь следовать Вашей логике "как я ее понял". И пусть стандарты идут лесом :)) Я вроде бы говорил о рассмотрении ситуации в совокупности. Включая, кстати, клиента - на клиенте различие между null и '' довольно неудобно отражать в интерфейсе В совокупности "0 как null" представляется мне крайне неудобным - я, кстати, работал с системой, где использовали этот принцип, а "пустая строка как null" представляется удобным. И действительно, пусть плохие стандарты идут лесом. Стандарты - это отдельная большая тема. В целом, если стандарт обеспечивает ситуацию "всем одинаково плохо", он меня не привлекает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:16 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer Александр Федоренколюбое сравнение с null дает фальш. Это неправда, причем заведомая неправда, противоречащая стандарту. Сэр, не кажется ли вам, что вы меня обвинили в преднамеренной лжи? Это правда применительно, как минимум, к реализации логики в Информиксе. Н а абсолютную правду претендовать я не имею привычки :) softwarer Кстати, вот что я нашел относительно стандартов и Оракла: "Согласно ANSI все типы данных должны поддерживать неопределенные или NULL значения. Oracle в полной мере поддерживает это правило для всех типов, за исключением символьных. Для любых символьных данных пустая строка интерпретируется как NULL, например два оператора Oracle SQL: INSERT INTO TEST(COL1) VALUES(NULL) и INSERT INTO TEST(COL1) VALUES('') полностью идентичны и вставят в таблицу значения NULL, а не пустые строки. В Oracle вообще нельзя вставить пустую строку, так как она будет рассматриваться как NULL . Это отклонение особенно актуально при сравнении строк, например пусть есть следующая таблица: " http://library1.tuit.uz/LIBANTA/database/articles/oracle_ansi.html Александр Федоренколюбое сравнение с null дает фальш. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. А здесь вы сами подтвержаете мои слова: не прошло ни одно из сравнений перемой со значением null ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:20 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр ФедоренкоЦена не задана, т.е. не определена, т.е одно и то же. Нет, это не одно и то же. Это Вы сказали "то есть" на то, что синонимами не является. Александр ФедоренкоЦена есть как свойство товара, А кто сказал, что цена - это обязательное свойство товара? Нет ее. До тех пор, пока не придет кто-то и не скажет, быть может произвольно, быть может на что-то опираясь: "цена такова". Вот допустим Вы прямо сейчас взяли молоток, пилу, доску и сделали табуретку. Какова ее цена, которая есть как свойство товара? Александр ФедоренкоЭто надо принять как есть. Кому надо, и зачем? Александр ФедоренкоА неудобно кое что делать на потолке, как известно. В том числе и это. И если стандарт загоняет на потолок - стандарт идет в сауну. Александр Федоренко1. В данном случае я сказал :) Проверил на СУБД, с которой работаю. Я могу прямо сейчас проверить на трех СУБД и если не изменяет память, получить три разных результата :) Александр Федоренко2. А вот тут вы пожалуй правы: я бы и одно вхождение запретил, если по логике. Наверное реализоторы этой логики в субд пошли на компромис, для того, чтобы вообще можно было использовать поля с налом и уникальным индексом. А смысл? "Поле с единственным null" - самая бессмысленная конструкция, какую только можно представить. Мне не известно ни одного примера из обычной жизни, когда она удобна, и в нескольких беседах на эту тему никто примера так и не привел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:23 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarerХм. Боюсь Вас шокировать, но никакого "на самом деле" не существует. Компьютерная логика - такая, какая заложена в железяки и софт, какую захотим, такую и сделаем. В железки заложена бинарная логика, для реляционных баз используется трехзначная (точнее - один из вариантов трехзначной логики), для конкретного приложения, если нужно, я легко могу запрограммировать хоть восьмизначную - не суть. Я знаю, что мира "на самом деле" вообще не существует Также я знаю, что "большой взрыв" в информатике произошёл в 1930е годы. Булева алгебра уже давно существовала, но тогда нашли физическую реализацию - положительный/отрицательный потенциал и создали элементную базу. Но, и это также известный факт, всерьёз думали над тем, чтобы сделать 3х значную логику (- / 0 / +). Надо полагать, из этого 0 произошёл NULL. И ещё, я читал (не исключаю, что это ерунда), что машина зависает в случае появления такого 0. softwarerВажно, но это совершенно отдельный вопрос, не имеющий никакого отношения к обработке NULL сервером. С точки зрения клиента мне представляется наилучшим, если клиент имеет адекватный инструмент, клиентский null. Ну, повеселили!!! А ну-ка давайте спросим у пользователей - "что такое NULL?". Посмотрим сколько Вам дадут хотя бы приблизительно верный ответ На клиенте должна быть возможность трактовать бдшный NULL так, как хочется, только и всего. softwarerНе нужно, спасибо. Ваш ответ показывает... Жаль, но Вы меня не поняли. Не нужно, так не нужно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:47 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer Вы всё время пишете "в сауну стандарты, если они неудобны". Это весьма животрепещущая для меня тема! Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты? Приведу пример. На позапрошлой работе я спорил с начальником по следущему вопросу: стоит ли пользоваться типом данных столбца array (мы использовали PostgreSQL)? В доках прямо написано, что данная возможность "снимает ограничение, накладываемое реляционной теорией - атомарность". Шеф опирался на то, что "реляционная теория доказана математически, а значит надёжна и безотказна", я на то, что array идеально подходил под наши задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:53 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Как мне кажется, интересная статейка на тему NULL http://opensource.com.ua/contents/978546900257p.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:54 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр Федоренко softwarerЭто неправда, причем заведомая неправда, противоречащая стандарту. Сэр, не кажется ли вам, что вы меня обвинили в преднамеренной лжи? Нет, не кажется. Я не вижу ни слова про "преднамеренную" (преднамеренную - означает "Вы знали, что это неправда, и осознанно ее опубликовали"). Я склонен думать, что Вы просто привыкли к неправильному представлению о происходящем, поскольку этот момент трехзначной логики неочевиден, и отличить его от правильного не так-то просто. Это следует из последующего текста, в частности из Вашей реакции (непонимания) на мой пример. Александр ФедоренкоЭто правда применительно, как минимум, к реализации логики в Информиксе. Судя по документации Информикса, это неправда применительно к реализации логики в Informix. По крайней мере, по той документации, в которую я ткнулся (на сайте IBM предлагается много разных информиксов, и я не в курсе, какие между ними различия, взял тот, который выглядел посвежее). Итак, смотрим в http://publib.boulder.ibm.com/epubs/html/25122850/sqltmst62.htm#idx207 Читаем: документация по InformixA Boolean expression evaluates as true or false or, if NULL values are involved, as unknown. Александр ФедоренкоН а абсолютную правду претендовать я не имею привычки :) В этом случае в "непривязанных к СУБД" топиках это следует отдельно оговаривать. Если бы Вы сказали "В Informix любое сравнение с null дает false", я бы крайне удивился, но ограничился бы констатацией факта, что в стандарте и в других СУБД принят иной подход. Александр ФедоренкоКстати, вот что я нашел относительно стандартов и Оракла: Во-первых, не надо приписывать это достижение мне. Во-вторых, если коротко, текст детский; "похожий на правильный по сути", но содержащий много неточностей. Александр ФедоренкоА здесь вы сами подтвержаете мои слова: не прошло ни одно из сравнений перемой со значением null ) Если бы написано было без смайлика, я был бы уверен, что Вы просто не поняли приведенный код. Смайлик вызывает подозрение, что поняли, но не хотите это признать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 13:58 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
FrankieНо, и это также известный факт, всерьёз думали над тем, чтобы сделать 3х значную логику (- / 0 / +). Не логику, а арифметику. Троичная система счисления в некоторых аспектах удобнее двоичной, в частности она более эффективна с точки зрения хранения данных и позволяет обойтись без дополнительного кода и подобных извращений при работе с отрицательными числами. Ну и пришли к этой идее чуть позже; в 30-е годы делали, например, .... ладно, не помню как назывался этот чудо-арифмометр, так что опустим. FrankieИ ещё, я читал (не исключаю, что это ерунда), что машина зависает в случае появления такого 0. Скорее всего, имеется в виду то, что элементная база не позволяла сделать три четко различимых состояния, и "нечетко интерпретируемые пограничные значения" были естественным и неодолимым источником ошибок, по сути сбоями памяти. FrankieНу, повеселили!!! А ну-ка давайте спросим у пользователей - "что такое NULL?". Вы всегда приплетаете нечто, имеющее косвенное отношения к обсуждаемому вопросу? Сначала к обсуждению сервера приплели клиента, теперь к замечанию о клиенте - пользователя. Следующим, видимо, будет стул, на котором пользователь сидит. Вы делаете вид, что не понимаете сути клиента. Клиент - это транслятор бизнес-понятий, терминов, удобных и понятных пользователю, в представление, удобное машине, и обратно. Клиент работает с null, но из этого никак не следует, что пользователь работает с null и должен знать, что это такое. FrankieНа клиенте должна быть возможность трактовать бдшный NULL так, как хочется, только и всего. :) Высказывание сколь верное, столь и непродуктивное. Из серии известного "на воздушном шаре". "Должна быть" - может быть. Из всех возможных трактовок есть более и менее удобные. Более удобную - я назвал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 14:18 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
FrankieВы всё время пишете "в сауну стандарты, если они неудобны" [...] Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты? Полностью согласен, просто с языка сняли. Мне представляется, что нужно все-таки корректировать стандарты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 14:23 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 14:28 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр ФедоренкоКак мне кажется, интересная статейка на тему NULL Факты изложены точно и хорошо. В рассуждениях и трактовках мне не нравится один момент: сквозит несформулированный, но явно видимый постулат "null рассматривается как такое же значение, как и любое другое". Особенно ярко это видно во фразе "Один приемлемый метод для избежания использования NULL-значений — применение фиктивных значений для обозначения отсутствующих данных. Например, вместо NULL в символьных столбцах можно применить строки «N/A» или «NV»." - с моей точки зрения, за такие советы надо отрывать голову, и постулат в целом представляется мне неверным и опасным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 14:30 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Frankie softwarer Вы всё время пишете "в сауну стандарты, если они неудобны". Это весьма животрепещущая для меня тема! Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты? Приведу пример. На позапрошлой работе я спорил с начальником по следущему вопросу: стоит ли пользоваться типом данных столбца array (мы использовали PostgreSQL)? В доках прямо написано, что данная возможность "снимает ограничение, накладываемое реляционной теорией - атомарность". Шеф опирался на то, что "реляционная теория доказана математически, а значит надёжна и безотказна", я на то, что array идеально подходил под наши задачи. Насчет array. Я тоже не рискнул использовать этот и другие "продвинутые" типы данных (Informix). Черт его знает, как там оптимизировано относительно быстродействия :). Ну и еще были некоторые осложнения, связанный с принятой технологией. Хотя заманчиво например с таблице документов иметь поле "товарный состав" на базе типов ROW и COLLECTION. Надо будет на досуге поэкспериментировать. Опять же вопрос с передачей этих типов на клиента открытый... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 14:34 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
FrankieВы всё время пишете "в сауну стандарты, если они неудобны". Точно так. FrankieЭто весьма животрепещущая для меня тема! Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты? Приведу пример. На позапрошлой работе я спорил с начальником по следущему вопросу: стоит ли пользоваться типом данных столбца array (мы использовали PostgreSQL)? В доках прямо написано, что данная возможность "снимает ограничение, накладываемое реляционной теорией - атомарность". Шеф опирался на то, что "реляционная теория доказана математически, а значит надёжна и безотказна", я на то, что array идеально подходил под наши задачи. Что касается Вашего примера, то с моей точки зрения Вы скорее всего правы, хотя я недостаточно знаю Postgres, чтобы утверждать это категорически. Почему: потому что ограничение атомарности в реляционной теории обусловлено вполне определенными известными причинами и должно быть понято определенным образом. Требование атомарности вызвано тем, что "SQL сам по себе", реляционная теория в том виде, в котором она вводилась, не обладает адекватными средствами работы с неатомарными данными. Скажем, если у Вас в символьном поле хранится список значений через запятую, у Вас нет возможности сделать join со смыслом "те строки, в списках которых есть общие значения". Не знаю Postgre; в том, что касается Oracle, его расширения SQL позволяют выполнить все необходимые операции с nested tables, а потому "нарушение ими атомарности" представляется мне не разрушающим теорию. Точнее, я бы сказал, атомарность следует рассматривать именно в этом смысле - "данные, для работы с которыми есть адекватные встроенные средства". Ну и здесь еще следует помнить про потребности задачи - скажем, возможно, Вы не можете наложить на массив ограничение уникальности. Но если Вам не нужно его накладывать - какая разница, можете или нет? Другой момент, также относящийся к Вашему примеру - реляционная теория не учитывает один тип полей, имеющий довольно широкое распространение. Это memo, lob, xml и прочие подобные поля - не участвующие в реляционных операциях, поля, единственный смысл которых - храниться в базе и предоставляться по запросу, поля, возникающие только в select-списках запросов. Теория этого прямо не оговаривает, но добавление таких полей не приводит ни к каким теоретическим неприятностям, если ваши массивы отвечают этому ограничению - ну и почему бы нет? BLOBы в противном случае тоже противоречат реляционной теории, однако почему-то повсеместно применяются. Скажем, jpeg обычно хранят в базе в виде файла, а не в виде таблицы координат и цветов точек :) Что же до заданного Вами вопроса в общем виде - думаю, совсем точного ответа на него нет. Каждый раз, когда принимается решение (в том числе - решение некоторых людей назвать нечто стандартом) может быть так, что придет другой человек и покажет либо докажет ошибочность этого решения. Имхо, нужно: 1) Стараться глубоко разобраться, пока не будет достигнута уверенность в детальном понимании "что как и зачем". Делать что-то потому, что "авторитет написал" - плохо, даже преступно для мыслящего разработчика. Делать нужно потому, что "твердо знаешь, чем это лучше альтернатив, которые тоже обдумывал". 2) Одна голова - хорошо, но и другие могут подсказать полезные мысли. Подчеркиваю, именно подсказать. Обдумывать все равно нужно самостоятельно. Да, безусловно есть риск старательного идиота, который все прочитал, долго думал и придумал бред. Это риск руководителя проекта или заказчика, который поручил работу идиоту. Но риск тупого расшибания лба - имхо более весом. У меня, кстати, был случай, что очень не хотелось делать одно решение. Другого не было, а то что было - выглядело очень кривым. Долго думал, спрашивал на форумах, дошел до автора разработки соответствующего направления. Долго с ним обсуждали, в конце концов он сказал "знаешь, может быть в следующей версии, которую мы выпустим, мы придумаем что-нибудь для этой проблемы, а пока - действуй как ты нарисовал, тем самым кривым вариантом". Пришлось так и делать. 3) Надо помнить, что принятые ранее решения могут быть ошибочными. Надо не бояться сменить точку зрения, в том числе перепроектировать или переписать что-то реализованное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 14:55 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarerВы всегда приплетаете нечто, имеющее косвенное отношения к обсуждаемому вопросу? Сначала к обсуждению сервера приплели клиента, теперь к замечанию о клиенте - пользователя. Следующим, видимо, будет стул, на котором пользователь сидит. Мы обсуждали NULL. Если я напрасно ушёл в сторону, обратив внимание на NULL в языках программирования - другой вопрос. С удовольствием можно обсуждать NULL не выходя из сервера, но хотелось бы практической стороны дела... softwarerКлиент работает с null, но из этого никак не следует, что пользователь работает с null и должен знать, что это такое. А зачем клиенту работать с null, если можно не выносить это понятие за пределы сервера и ограничиться правильным приведением? Тем более, что Вы сами указали, что путать программный nil и sql-NULL никак нельзя. softwarer"Должна быть" - может быть. Из всех возможных трактовок есть более и менее удобные. Более удобную - я назвал. Возможно Ваш авторитет даёт Вам право говорить "удобную", не уточняя "мне удобную", но удобство - субъективная вещь, согласитесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 15:00 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр ФедоренкоОтносительно же уникального индекса: два неопределенных значения вполне могут "оказаться" двумя одинаковыми.Можно расшифровать ? Если правильно помню, Дейт, в своей критике понятия NULL, подчеркивает, что трактовка NULL, как неопределенного значения, неверна. NULL - это отсутствие всякого значения, поэтому считать, что 2 NULL "могут "оказаться" двумя одинаковыми" принципиально неверно. Сравнивать ничто невозможно, IMHO. У него же, кстати, было предложение к производителям РСУБД изменить такую ситуацию способом, аналогичным защищаемому softwarer-ом. NULL должен быть эээ... доменнопривязанным, т.е., тот самый "спецсимвол" в словаре, имеющий особое значение. P.S. Насколько помню, в том же Informix, по крайней мере - версии 7.3x, столкнулся с ситуацией, когда 2хбайтное целое со знаком, не помню по давности название типа, не могло принимать значение -32768, под ним "прятался" NULL для полей данного типа. Хотя это совсем не то, что предлагал Дейт :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 15:07 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
FrankieВозможно Ваш авторитет даёт Вам право говорить "удобную", не уточняя "мне удобную", но удобство - субъективная вещь, согласитесь. Читайте оригинал: softwarerС точки зрения клиента мне представляется наилучшим , если клиент имеет адекватный инструмент, клиентский null. Повторять это имхо во всех последующих ссылках на эту цитату мне представляется излишним. Я надеюсь на собеседников, помнящих про контекст беседы и соблюдающих его. В противном случае беседовать практически невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 15:08 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfКаждая деталь из таблицы Детали должна ссылаться на изделие, которому она принадлежит. Но, само изделие - это тоже деталь, нулевая сборка, которая также как и все остальные детали обладает такими параметрами как Обозначение, Наименование и т.д., а значит должна находиться в таблице деталей. Как быть ? Букофф много , не хватило сил, дочитать до конца (там какие-то теоретичиские споры начались). Но по первому вопросу топика есть мысля Код: plaintext 1. Делаем ОДНУ таблицу , для наглядности можно добавить поле , в котором можно указать какого уровня элемент - деталь, сборочная единица, изделие и тд. Фторая таблица - это тупо таблица связей Код: plaintext 1. Данное творчество потом легко развернуть в виде дерева, просмотреть входимость деталей.Причем одна типовая деталь может участвовать в нескольких изделиях. Нечто подобное пришлось делать на старой работе , но там было посмешнее - требовалось отношение многие ко многим (база присоединений электростанции - электрики меня поймут) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 15:13 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer У Вас в изделии присутствовали атрибуты, кажется, заказчик и дата заказа или нечто подобное. Так вот: я бы не стал так делать, потому что по моему мнению, с высокой вероятностью бизнес-правила здесь рано или поздно изменятся так, что этот фрагмент потребуется переделать, и эта переделка окажется сравнительно трудоемкой. Поэтому я бы скорее всего сразу выделил бы сущность "заказы", чтобы потом сравнительно легко перейти к любым другим вариантам (скажем: заказ может включать несколько изделий, каждое изделие может заказываться несколько раз). Хм, эти бизнес-правила, если не ошибаюсь, действуют у нас уже лет 50, и я не вижу признаков их надвигающегося изменения. Кстати заказ и так включает в себя несколько изделий. А одно изделие не окажется в нескольких заказах, т.к. я говорил уже что изделие считается уникальным не только для нашей системы, но и для бухгалтерии и пр. Если-же вынести это хозяйство в отдельную таблицу, то появиться очевидное усложнение системы без очевидных преимуществ, за исключением какой-то гипотетической возможности ;) softwarer Не очень понял. "Сделать и включить вместо старой" - это две стандартных операции. Во-первых, "сделать по образцу" (создание новой - копирование - ожидание ввода изменений пользователем - сохранение) и собственно "замена в сборке одной детали на другую". Это относится как к атомарным деталям, так и к... полуфабрикатам, не знаю как вы их называете - сборки итп. Что-то я тоже не очень понял ваш ответ. Заменить деталь новой будет означать: 1) Создаем новую деталь 2) Ищем в нескольких таблица ссылки на старую деталь и update’им их на новую softwarer Ээ.... дерева я там точно не припомню. Сколь помнится, первым же ответом Вам был как раз "используйте дерево". У меня пока что ощущение, что структура плоская, или я вообще не понял изначальной схемы. Есть дерево структуры изделия – какие сборки куда входят. Или вы про что-то другое ? softwarer Насчет "дублирования нет"..... не уверен. Скажем, вы делаете катапульту. Через месяц вы будете делать модифицированную версию этой катапульты. Не знаю ваших пропорций, но допустим половина узлов останутся без изменений. Однако, судя по схеме, вы их будете вынуждены старательно откопировать в новое изделие, вплоть до самого последнего винтика. Тут, кстати, вылезает интересный и непростой вопрос версионности. … Так или иначе, у вас при этом используется определенная элементная база. И рано или поздно, но случатся глобальные операции, скажем, "заменить все диоды серии 12345 диодами серии 12346, такими же по основным характеристикам, но, скажем, на 0.05г более легкими". … Так вот, как я упомянул выше, я не верю в то, что у вас каждый используемый винтик абсолютно уникален. "Так не бывает". А раз не бывает - значит, потребуется пройти по всему изделию и исправить ошибку человека, который материалом для винтика М3-18/1 указал дерево. Это другая операция, не та же, что "в конкретном месте использовать вместо него M3-18/2". Погодите, каждый винтик уникален внутри одного изделия. Т.е. изменив атрибут винтика в изделии, это изменение коснется всех вхождений винтика по изделию, т.к. все вхождения ссылаются на одну и ту-же запись в БД. Однако случай “заменить все диоды серии 12345 диодами серии 12346 для всех изделий” маловероятен. Т.е. конечно такое может произойти, но это лишь частный случай общего бизнес-правила, говорящего что изменения могут касаться произвольного числа первоначально идентичных изделий. Таким образом я не вижу выгоды от варианта с винтиками для всех изделий. 1 вариант) Если винтик не уникален для изделия (как вы советуете), то для случая замены винтика “везде” потребуется изменить только одну строку, а для замены винтика “в половине изделий” потребуется создание новых винтиков для половины изделий и проводки соответствующих изменений. 2 вариант) Если винтик уникален для изделия (как сделано у меня сейчас), то для случая замены винтика “везде” потребуется апдейт одной строчки для каждого изделия, а для замены винтика “в половине изделий” потребуется соответственно апдейт одной строчки для половины всех изделий. softwarer Да нет, я имел в виду "вполне решается". Просто пока неизвестно, куда присобачивать сборку, присобачивать к корню. Скажем, карбюратор не бывает сам по себе - поэтому когда вводят его сборку, уже введен (или нетрудно ввести) "автомобиль". К нему и привязать. Когда позже будет введен двигатель - перепривязать к нему. Но повторюсь, мне это немного странно. Все ж таки и разработка, и прочие процессы обычно идут сверху вниз, от общего к деталям. Во первых в этом нет ничего странного. Ведь тут речь идет не о разработке изделия, а о составлении дерева входимости этого изделия. Сборки могут приносить в любой последовательности, это нормально. По поводу “присобачить к корню”. Это уже будет некая разновидность изменения бизнес-правил программы. Ведь карбюратор, привязанный к корпусу автомобиля будет сбивать людей с толку. Конкретно в нашем случае мы можем вообще-то изменять бизнес-правила системы на таком уровне, но у меня нет никакого желания так поступать. Гораздо логичнее видеть то, что должно быть в изделии, и если карбюратор еще не привязан к корню “как положено”, то и нечего на него там смотреть. Если уж так хочется посмотреть именно на сборку карбюратора, так можно выбрать одну из “голов” входимости и загрузить ее (у нас в планах есть реализация такой функции). softwarer Хм. "В операции нужно учитывать" и "нужно учитывать то, что появилось в результате операции" - существенно разные по смыслу высказывания, не находите ли? Подчеркну, "в операциях" - взято из Вашего перевода. softwarer, вы меня удивляете. Очевидно, что вы ошиблись в переводе цитаты на русский язык, поспешили обозвать ее чушью, а теперь упорно не желаете признавать свою ошибку. Вы начинаете ставить себя в глупое положение. После своего перевода, я-же указал на всякий случай о чем конкретно там идет речь (а речь позвольте напомнить и идет как раз о тех null, что появились в результате outer join) softwarer Что касается выводов... в "наверняка" Вы промахнулись. Микрософт довольно активно продвигал идею "программировать без программистов", типа того, что специалист сможет решать свои задачи самостоятельно, программируя в Access, чуть позже - в Офисе (тогда Access не входил в состав офиса). Для этого делалось довольно много всего, в частности в тот же акцес включался набор заранее разработанных типовых БД, какие-то визарды вида "отметьте, какие поля в стандартных сущностях вам нужны и получите готовую БД" итп. … В этом направлении воз и ныне там, и несколько позже Микрософт пошел по другому пути, довольно явно ориентируясь на массу малограмотных разработчиков как на основную движущую силу индустрии. Как типовой пример, сошлюсь на пару раз обсуждавшийся в Сравнении СУБД механизм работы MSSQL с параметрами; если позволите краткий вывод, этот механизм микширует последствия неудачно на писанного кода ценой повышенной вероятности замедления удачно написанного. Имхо, упрощенное создание несложных БД в аксессе как раз неплохая идея, я знаю людей, которые практически не имея представления о БД делают с его помощью несложные вещи и вполне довольны. С какой стати звать профессионалов, или самому разбираться в этом, если все что нужно – это пара-тройка таблиц для решения какой-нибудь мелочной проблемы ? Однако это имеет слабое отношение к профессионалам, вряд-ли визард поможет в создании крупномасштабной системы уровня предприятия, и вряд-ли в Microsoft на это рассчитывали. По поводу удачно/неудачно написанного кода для mssql - тут имхо надо ставить вопрос шире. Не зная подробностей, могу предположить, что чуть более медленный автомат лучше, чем чуть более быстрый но зато более сложный “ручник”. Весовые отношения “быстрота/сложность” зависят от ситуации, и если был выбран такой путь – значит сложность, по мнению разработчиков, перевесила. Оракл (и вы это знаете) часто критикуют за излишнюю сложность, и говорить, что сложнее всегда лучше – довольно смело. Я никогда не поверю, что даже вы, при солидном опыте работы с сервером (и к тому-же обладая на редкость умной головой) знаете все подробности работы, и вы вполне можете спотыкнуться где-то, написав неоптимальный код, чем сильнее тормознете сервер, чем бы если-бы он принимал эти решения за вас. softwarer Аналогично, я не вижу смысла брать в команду программистов.... интеллектуальных недомерков, прошу присутствующих не принимать на свой счет. Есть отличный инструмент SQL, и если данный конкретный Вася Пупкин не дотягивает - значит, не бывать ему SQL-программистом в серьезной команде. Всего лишь. Вы напрасно смешиваете понятия “принимать в команду недомерков” и “писать понятный код”. Это разные вещи. Увеличивая относительную сложность кода вы в любом случае повышаете вероятность ошибок, даже если набрали команду Эйнштейнов. softwarer Не "как можно проще и понятнее", а "по возможности проще и понятнее". Не вижу особой разницы, конечно, если другого пути нет, то надо делать “сложно”. Я с этим и не спорил :) softwarer Знаете, это на уровне личного мнения, но я совершенно не ощущаю необходимости о них "помнить", … Типично" в данном случае - по моему опыту, включающему в себя работу с изрядным количеством разных БД, спроектированных разными людьми. … "Уверен" - да. Поскольку уверенность статистическая, передать ее трудно - почему я и ограничился примером и "утверждением на правах мнения" что именно такая пропорция сложности типична. Я не могу спорить с такими аргументами как ваш опыт. Он больше и вам виднее. Конечно, для меня немного неожиданно, что сложность null, по статистике и вашему опыту меньше, чем ряд способов обойтись без него. Просто литература по mssql пестрит предупреждениями про null, и люди которые пишут это тоже не являются теоретиками. Возможно это как-то связано с различиями в работе с null в разных серверах БД. softwarer Она и без null не может быть проверена. Допустим, вынесли дату смерти в другую таблицу, null-ы исчезли. Однако корректность наличия в таблице даты смерти такой-то для человека такого-то от этого проверить ну совершенно не легче. … Как мы пару раз видели выше, вынесение столбца само по себе совершенно не спасает от ошибок Все-таки мне кажется, что есть некая разница. Для того, что-бы появилась неверная дата смерти человека, в случае выделения “смертельного” столбца в отдельную таблицу – должен произойти insert. В случае null – вероятность появления этой даты может быть выше, так как к этому может привести неверное задание условий where в операторе update. softwarer В этом случае никакое число "случайно не появится", и проблемы не будет. Если Вы не обеспечили проверку заложенного в систему бизнес-правила - виноваты в этом Вы, никак не null. … И вот теперь давайте посмотрим с другой стороны: как Вы собираетесь обеспечить проверку аналогичного правила, если Вы вынесли атрибуты в отдельные таблицы? Есть ли у Вас простой способ сказать СУБД, что "расширением к ЛА должны быть либо атрибуты самолетов, либо атрибуты вертолетов, но не те и другие сразу"? … На самом деле есть. Если у Вас ЛА ссылается на детали, а не наоборот, то Вы будете должны сделать поля ссылок на каждую из детализаций и связать эти поля в точности таким же check-ом, как приведен выше (он называется arc, "дуга"). То есть никакой разницы. Если Вы этого не сделаете, будут ровно те же проблемы, в частности будет возможно существование ЛА не являющихся ни самолетом, ни вертолетом, равно как и существование ЛА, являющихся тем и другим одновременно. Ну и естественно, следующие из этого проблемы. Вообще-то мне казалось, что реализация тип/подтип будет проще и понятнее, чем куча check’ов. Представляете, если подтипов ЛА штук 50 ? Замучаетесь эти чеки писать и сопровождать. С другой стороны, подтип более понятен. Помимо этого, все-таки добавляются проблемы null (с теми-же агрегатными функциями например), хоть даже и незначительные по вашему опыту, но тем не менее. softwarer Не обязана абстракция быть понятной. Она обязана быть "удобной и при этом по возможности понятной". Предлагаю закончить про абстракции, а то мы можем выяснять их отличия довольно долго, а смысла в этом все-таки довольно мало :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 16:28 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfПросто литература по mssql пестрит предупреждениями про null, и люди которые пишут это тоже не являются теоретиками. Возможно это как-то связано с различиями в работе с null в разных серверах БД.Вряд ли. IMHO, количество появлений NULL в данных с большой степенью вероятности может говорить о несоответствии модели данных предметной области, а может даже и о степени понимания самой предметной области. Теоретически, база данных должна содержать факты, но NULL - суть отсутствие факта, хотя отсутствие оного и пытаются часто трактовать тоже как факт. Типа, отсутствие ответа - тоже ответ. Возможно с теоретической точки зрения, само существование NULL не есть хорошо, но на практическом уровне это допустимо, так как трактуется обычно исходя из контекста, где он появляется или используется. В некотором смысле, это как нормализация и денормализация. В некоторых случаях использование второй может сильно облегчить жизнь. Так что, IMHO, не стоит бежать от NULL, как черт от ладана, но надо четко понимать, почему вы его позволяете, используете или трактуете в данном конкретном случае, и не допускать их появления как результата неграмотного проектирования или степень своего незнания или непонимания предметной области. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 17:14 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenf Таким образом я не вижу выгоды от варианта с винтиками для всех изделий. 1 вариант) Если винтик не уникален для изделия (как вы советуете), то для случая замены винтика “везде” потребуется изменить только одну строку, а для замены винтика “в половине изделий” потребуется создание новых винтиков для половины изделий и проводки соответствующих изменений. 2 вариант) Если винтик уникален для изделия (как сделано у меня сейчас), то для случая замены винтика “везде” потребуется апдейт одной строчки для каждого изделия, а для замены винтика “в половине изделий” потребуется соответственно апдейт одной строчки для половины всех изделий. Много теории ,заодно NULL-ы обсудили, я только не понял в чем загвоздка? Где-то далеко назад в топике уже подсказывали - делайте что-то наподобие рецептов (там про резину было). Какая проблемма-то? По моему глупому мнению, пока шло обсуждение темы, уже можно было задачу сдать в эксплуатацию. Сделать иерархию, чуть выше с каринкой я писал. Верхом иерархии будет Ваша сборка ,в таблице связи её (IDВернейДетали=0) по ней мы узнаем что это предел совершенства и выше искать не нада , в этой же таблице добавим поле ЗАКАЗ. Есть какая-то новая разработка забили его в эту структуру. Пришло время производить что-то загодя создали табличку ЗАКАЗЫ_НА_ПРОИЗВОДСТВО , создаем в ней новый заказик на основе сборки (например CБ001), и по нажатию волшебной кнопки, в таблице связи все записи касающие этой сборки тупо копируются ,только в поле ЗАКАЗ проставляеся ID из таблицы ЗАКАЗЫ_НА_ПРОИЗВОДСТВО . Захотели что-то поменять создали новый заказ на базе хоть сборки, хоть другого заказа и уже в ЭТОЙ сборке можете резвиться как хотите - менять детали хоть партиями , хоть штучно.Можете просматривать как менялись версии изделия, короче простор мысли. PS Я извинясь , что не цитирую тут классикоф, а так по деревенски объясняю. PPS То stenf - ничего личного, но как постановщик задач, вы слабоваты. Да MS SQL (или Акцесс) Вас похоже подпортил свими конструкторами запросов (постоянные попытки вынести однотипные данные в отдельные таблицы и любовь к Join-ам до добра не доведут) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 18:19 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer ModelRПлз подробнее. null в outer join - всего лишь дефолт, подставляемый в определенных случаях. Достаточно дополнить синтаксис выражений в селекте конструкцией default тра-ля-ля чтобы получить outer join, не испытывающий никаких проблем от отсутствия концепции null. Хотел ответить, но уже отвечено: softwarerВ рассуждениях и трактовках мне не нравится один момент: сквозит несформулированный, но явно видимый постулат "null рассматривается как такое же значение, как и любое другое". Особенно ярко это видно во фразе "Один приемлемый метод для избежания использования NULL-значений — применение фиктивных значений для обозначения отсутствующих данных. Например, вместо NULL в символьных столбцах можно применить строки «N/A» или «NV»." - с моей точки зрения, за такие советы надо отрывать голову, и постулат в целом представляется мне неверным и опасным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 18:48 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfХм, эти бизнес-правила, если не ошибаюсь, действуют у нас уже лет 50, и я не вижу признаков их надвигающегося изменения. В данном случае у Вас бесспорно лучшая позиция для обзора. Скажу так: мне с моей колокольни оно подозрительно, допускаю, что будучи на Вашем месте и обладая Вашей информацией я думал бы как Вы, предлагаю эту тему остановить. stenfЧто-то я тоже не очень понял ваш ответ. Заменить деталь новой будет означать: 1) Создаем новую деталь 2) Ищем в нескольких таблица ссылки на старую деталь и update’им их на новую Почему в нескольких? Если замена идет в одном месте, в одной сборке, значит update-им одну строку одной таблицы. Если замена идет в "нескольких из многих" - меняем несколько строк, скорее всего в одной таблице. stenfЕсть дерево структуры изделия – какие сборки куда входят. Или вы про что-то другое ? Про это. Возможно и есть, но в первом посте темы оно... как минимум не очевидно. Можно предположить, что у Вас IDСборки есть ссылка на таблицу деталей, если так, дерево становится видным, но это повод пересмотреть стандарты именования :) stenfПогодите, каждый винтик уникален внутри одного изделия. Вот уж простите, не верю я в это. Не бывает так. В изделии и в какой-то его подсборке запросто может быть "четыре таких винтика и два вот таких", но вот чтобы шесть уникальных были типовым случаем..... stenfТ.е. изменив атрибут винтика в изделии, это изменение коснется всех вхождений винтика по изделию, т.к. все вхождения ссылаются на одну и ту-же запись в БД. Не понял. Это "то есть" прямо противоречит предыдущей Вашей фразе. Если они уникальны, значит изменение касается только одного вхождения. Чтобы поменять все вхождения, надо много ссылок из сборки на один винтик. stenfОднако случай “заменить все диоды серии 12345 диодами серии 12346 для всех изделий” маловероятен. Т.е. конечно такое может произойти, но это лишь частный случай общего бизнес-правила, говорящего что изменения могут касаться произвольного числа первоначально идентичных изделий. Это более простой частный случай, но Ok, давайте сосредоточимся на описанном Вами более сложном. Итак, непомнюкакому заводу были заказаны 20 самолетов Ту-4 - опытная партия. Сделали первые три, облетали, по первоначальным результатам решили сразу внести в остальные некоторые изменения. Имхо вполне обычная ситуация, которая должна закончиться тем, что в базе лежит заказ на три самолета конструкции 1 и на семнадцать самолетов конструкции 2. Далее, изменения, сами понимаете, были не очень велики, поэтому обе версии конструкции допустим, отличаются в 5% мест. Имхо вполне естественно иметь в базе 95% общего и дважды по 5% - различий. Ситуация, когда изначально в базу введено двадцать раз по не помню уж сколько cотен тысяч деталей в каждом, а потом оператор меняет одно и то же в семнадцати местах, оптимальной имхо не выглядит. stenf1 вариант) Если винтик не уникален для изделия (как вы советуете), то для случая замены винтика “везде” потребуется изменить только одну строку, а для замены винтика “в половине изделий” потребуется создание новых винтиков для половины изделий и проводки соответствующих изменений. Нет. Потребуется создать один новый винтик и проапдейтить по строчке в половине изделий. stenfВо первых в этом нет ничего странного. Ведь тут речь идет не о разработке изделия, а о составлении дерева входимости этого изделия. Так то же самое. К моменту детализации хотя бы одной сборки общая схема изделия уже известна, а следовательно ввести ее несложно. stenfСборки могут приносить в любой последовательности, это нормально. Безусловно. Давайте на пальцах: Вы не знаете, что принесут раньше - карбюратор или коробку передач. Но еще на этапе ввода общей информации по автомобилю Вы уже знаете, что в нем есть салон, есть коробка передач, есть двигатель, в котором есть карбюратор... знаете принципиальную схему изделия и можете ее ввести. А дальнейшее наполнение - спокойно пройдет в любом порядке. stenfПо поводу “присобачить к корню”. Это неудачная мысль, пожалуй не стоит ее обсуждать. stenfsoftwarer, вы меня удивляете. Очевидно, что вы ошиблись в переводе цитаты на русский язык, поспешили обозвать ее чушью, а теперь упорно не желаете признавать свою ошибку. Хм. Я могу еще раз напомнить Вам про Ваши "очевидно" и прочие выводы. Я перевел эту фразу ровно так же, как и Вы. Я сказал, что меня в ней не устраивает. Если Вы с этим не согласны - было бы разумно это обсудить. Вместо этого Вы полагаете, что я неправильно перевел. Подозреваю, связано с тем, что Вы придерживаетесь точки зрения "если бы перевел как я, то и думал бы как я". Печально..... не вижу правда, почему в результате именно я в глупом положении, но давайте считать, что Вам виднее. stenfИмхо, упрощенное создание несложных БД в аксессе как раз неплохая идея, ....... Давайте не уходить еще и в сторону обсуждения "плохая идея или нет". С тем, что микрософт такую идею продвигает, Вы готовы согласиться? stenfОднако это имеет слабое отношение к профессионалам, вряд-ли визард поможет в создании крупномасштабной системы уровня предприятия, и вряд-ли в Microsoft на это рассчитывали. Cоответствующие заявления бытовали лет десять-двенадцать назад. После того как стало очевидно, что прорыва не будет, перешли на ориентацию на неграмотных программистов. Точнее, ту стратегию маркетинга, которую применили на пользователях, применили и на программистах. И снова сработало неплохо, популярности среди программистов добились. stenfПо поводу удачно/неудачно написанного кода для mssql - тут имхо надо ставить вопрос шире. Не зная подробностей, могу предположить, что чуть более медленный автомат лучше, чем чуть более быстрый но зато более сложный “ручник”. Я не ставлю вопрос, я отослал к подробно обсуждаемому примеру. Если посмотрите, увидите, что разницы в сложности никакой. Что же до лучше-хуже, вопрос в количестве применений. Для запроса, который в течение жизни системы применяется, например, 100.000 раз, требования к оптимальности одни; для запроса, который выполняется, например, 40.000.000 раз в неделю, требования к оптимальности другие. stenfВесовые отношения “быстрота/сложность” зависят от ситуации, и если был выбран такой путь – значит сложность, по мнению разработчиков, перевесила. Ошибаетесь. Не "сложность", а "вероятность прихода программиста, который будет писать криво". stenfОракл (и вы это знаете) часто критикуют за излишнюю сложность, stenf, простите, знаете ли Вы Oracle достаточно, чтобы от своего имени критиковать его за излишнюю сложность? Если так - если хотите, давайте создадим отдельный топик в "Сравнении СУБД" и поговорим. Если нет - простите, но говорить со "слышал звон" бессмысленно. Вы взяли одно сомнительное утверждение, и не глядя на пример, развили из него теорию "что в этом примере находится". stenfЯ никогда не поверю, что даже вы, при солидном опыте работы с сервером (и к тому-же обладая на редкость умной головой) знаете все подробности работы, и вы вполне можете спотыкнуться где-то, написав неоптимальный код, чем сильнее тормознете сервер, чем бы если-бы он принимал эти решения за вас. Для того, чтобы сервер не тормозил, нужно в том числе тестирование, которое выявит допущенные неоптимальности. А вот ситуация "сервер не дает применить эффективное решение, поскольку решает за меня слишком грубо" меня, если честно, напрягает и эффективным я такой подход не считаю. stenfВы напрасно смешиваете понятия “принимать в команду недомерков” и “писать понятный код”. Вы напрасно не понимаете приведенной аналогии. Код, понятный Вам, будет непонятен человеку, позавчера впервые открывшему учебник по программированию. А код, понятный тому, не будет понятен пятилетнему ребенку. Говоря "писать понятный код" Вы на самом деле не говорите ровно ничего, бросаете бессмысленный лозунг, поскольку не даете ответа на ключевой вопрос - "понятный для кого". Для любой задачи, для любой команды, есть некий оптимальный минимальный уровень ее членов, равно как и оптимальный максимальный. Есть задачи, куда просто нельзя привлекать студентов, есть задачи, куда однозначно не следует привлекать гуру. Код должен быть понятен членам команды. Говорить "код хорош только если его без малейших усилий поймет каждый придурок" - неоптимально с точки зрения решаемой задачи. Далее, писать "слишком сложный код" безусловно плохо. В то же самое время команде полезно, если ее члены подтягивают свой уровень, члены "минимально допустимого уровня" должны быть временным явлением. Пример хорошего, правильного подхода: вопрос, ответ, результат. Хотя я почему-то подозреваю, что Вы этот пример не воспримете. stenfЭто разные вещи. Увеличивая относительную сложность кода вы в любом случае повышаете вероятность ошибок, даже если набрали команду Эйнштейнов. Вы забываете про одну мелкую, но важную деталь: "относительная сложность кода" - вещь субъективная. Сейчас уже не найду, но здесь же, в проектировании некоторое время назад был совершенно замечательный пример - там человек хотел нагромоздить целый механизм, что-то типа асинхронной обработки путем цепляния на cron батника, выполняющего какие-то скрипты, и все из-за совершеннейшего с моей точки зрения пустяка, уровня нежелания написать сложный с его точки зрения sql-запрос. Для него "запрос" было сложно, а "вот эта неустойчивая механизьма" - просто. Я - так совершенно уверен, что его решение куда более ненадежно, чем даже им же написанный запрос. stenf softwarerНе "как можно проще и понятнее", а "по возможности проще и понятнее". Не вижу особой разницы, конечно, если другого пути нет, то надо делать “сложно”. Я с этим и не спорил :) Вы зря думаете, что хоть в одной ситуации "другого пути нет". Люди регулярно придумывают такие другие пути, что у меня уши дыбом встают. Помнится, давным-давно, году в 90-м, делали мы с другом одну программу, где среди прочего надо было читать из конфига и интерпретировать хоткеи. И вот, я обнаружил, что друг сидел, набивая примерно следующий код: Код: plaintext Скажете, этот код сложнее? Нет, ему так было проще. if - более простое понятие, чем например "массив". Так вот: совершенно незачем ориентировать технологию на тех, кто будет писать такой код и из-за этого будет лишен необходимости изучать такие сложные концепции как массивы, не говоря уже о таких дико сложных, как например ассоциативные массивы. stenfЯ не могу спорить с такими аргументами как ваш опыт. Он больше и вам виднее. Понимаю. В силу субъективности этого опыта я стараюсь его не выпячивать, как-то разъяснить, из-за чего получается именно так. stenfВсе-таки мне кажется, что есть некая разница. Для того, что-бы появилась неверная дата смерти человека, в случае выделения “смертельного” столбца в отдельную таблицу – должен произойти insert. В случае null – вероятность появления этой даты может быть выше, так как к этому может привести неверное задание условий where в операторе update. Неправильное значение может появиться из-за неверного where в update. Неправильная строка может появиться из-за неправильного on в merge или where в insert..select. В чем разница? Кстати, вот еще merge. Снова "дополнительные сложности, которые надо изучать" там, где вполне можно обойтись if - exists - update - insert. stenfВообще-то мне казалось, что реализация тип/подтип будет проще и понятнее, чем куча check’ов. Представляете, если подтипов ЛА штук 50 ? Замучаетесь эти чеки писать и сопровождать. С другой стороны, подтип более понятен. Я не очень понимаю, с какой стати я замучаюсь писать и сопровождать check-и, если это забота CASE-средства. Моя забота - нарисовать дугу в ER-диаграмме. Впрочем, даже если и надо будет писать руками - .... Вы всерьез полагаете, что аргумент "замучаешься писать foreign key-и" достаточен, чтобы не делать в БД никаких foreign key-ев? А ведь ситуация та же. Далее, я не очень понимаю, как количество подтипов влияет на количество чеков. В той схеме, которая приведена, один чек обслужит любое количество подтипов. Наконец, я обрисовал альтернативу. Если Вы такого не сделаете, контроль целостности на уровне СУБД вызовет еще большие вопросы. И тогда начнутся такие "проще", как например триггер на таблице ЛА, делающий пятьдесят запросов к таблицам подтипов. stenfПомимо этого, все-таки добавляются проблемы null (с теми-же агрегатными функциями например), хоть даже и незначительные по вашему опыту, но тем не менее. Проблемы есть в любом случае. На эту тему есть хорошая, очень правильная фраза в книге Йодана, позволю себе вольный пересказ: "Допустим, нам нужно написать некую программу, назовем ее MONEY. Для нас было бы идеально, если бы в списке реализованных компилятором команд уже присутствовала команда MONEY - тогда мы написали бы программу из одной строки и решили задачу. Но поскольку чаще всего такой команды нет, то приходится думать и напрягаться". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 18:52 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelRХотел ответить, но уже отвечено: Не согласен принять такой ответ без уточнений. Чем, по-Вашему, код Код: plaintext 1. 2. 3. лучше, нежели Код: plaintext 1. 2. 3. ? Второй, однако, спокойно обойдется без null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 19:02 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34261968&tid=1544780]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 445ms |

| 0 / 0 |
