powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ловушка 22
170 сообщений из 170, показаны все 7 страниц
Ловушка 22
    #34216898
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
create table Детали(IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), Покупная bit, БезЧертежка bit, IDИзделия int)

create table изделия(IDИзделия int, Заказчик varchar( 100 ), IDДетали int, СрокСдачи datetime, Примечание varchar( 100 ))

create table Входимость(IDДетали int, IDСборки int, Количество int)

Каждая деталь из таблицы Детали должна ссылаться на изделие, которому она принадлежит.
Но, само изделие - это тоже деталь, нулевая сборка, которая также как и все остальные детали обладает такими параметрами как Обозначение, Наименование и т.д., а значит должна находиться в таблице деталей.

Когда создается новое изделие, то при такой схеме нельзя добавить записи, так как при внесении записи в таблицу Изделия у нас еще нет IDДетали (нулевой сборки), а если вначале пытаться внести запись в таблицу Детали - то мы не знаем IDИзделия.

Как быть ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34216923
дерево тебе поможет!
изделие или деталь:
идизделия, идродителяизделия, ... все остальное
...
Рейтинг: 0 / 0
Ловушка 22
    #34217162
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не понял, какое дерево ? Дерево Сборка-деталь и так есть
...
Рейтинг: 0 / 0
Ловушка 22
    #34217298
Фотография smeh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дерево - это одна таблица.
В твоем случае надо таблицы Детали и Изделия объединить в одну.

Код: plaintext
1.
2.
3.
create table Детали(IDДетали int, IDГруппы int, Обозначение varchar( 100 ), Наименование varchar( 100 ), Покупная bit, БезЧертежка bit, Заказчик varchar( 100 ), СрокСдачи datetime, Примечание varchar( 100 ))

IDГруппы -- это ссылка на поле IDДетали, которая является изделием

Вот это дерево, а у тебя просто три таблицы со связями....
...
Рейтинг: 0 / 0
Ловушка 22
    #34217470
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfКак быть ?
Я могу назвать как минимум три варианта.

1. Совместить таблицы деталей и изделий.
2. Воспользоваться deferred constraints.
3. Пробивать информацию в два приема: insert в изделия - insert в детали - update изделий с установкой id детали.
...
Рейтинг: 0 / 0
Ловушка 22
    #34217877
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В "изделия" одно из IDИзделия int , IDДетали int - лишнее.
Все изделия зарегистрированы как детали.
Изделия - подтип Детали.

Еще у вас возможно проблема в данных входимости.
Деталь может входить в несколько изделий. Что у вас в Детали.IDИзделия - первичная применяемость?
...
Рейтинг: 0 / 0
Ловушка 22
    #34217983
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
1. Совместить таблицы деталей и изделий.

получиться избыточность
softwarer
2. Воспользоваться deferred constraints.
3. Пробивать информацию в два приема: insert в изделия - insert в детали - update изделий с установкой id детали.

хотелось-бы все-таки обеспечить ссылочную целостность структурой базы, а не хитрыми финтами ушей
ModelR
В "изделия" одно из IDИзделия int , IDДетали int - лишнее.
Все изделия зарегистрированы как детали.
Изделия - подтип Детали.

да, но изделие (нулевая сборка) - это хитрая разновидность деталей, она обладает доп. параметрами, которых нет у рядовых деталей
ModelR
Еще у вас возможно проблема в данных входимости.
Деталь может входить в несколько изделий. Что у вас в Детали.IDИзделия - первичная применяемость?

где там проблема ? деталь может входить куда угодно. С Входимость как раз проблем нет :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34219487
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfда, но изделие (нулевая сборка) - это хитрая разновидность деталей, она обладает доп. параметрами, которых нет у рядовых деталейДык и на здровье.
В таблице Деталей - все ДСЕ с общими для всех типов ДСЕ характеристики.
В таблице изделий - только ДСЕ типа изделий с их особенными характеристиками.
Обе в качестве ключа имеют один и тот же ДСE_Id.
Получается связь тип/подтип.
stenf
где там проблема ? деталь может входить куда угодно. С Входимость как раз проблем нет :)Кроме таблицы входимости (спецификация) у вас еще какая-то входимость в самой таблице деталей.
...
Рейтинг: 0 / 0
Ловушка 22
    #34220107
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelR
В таблице Деталей - все ДСЕ с общими для всех типов ДСЕ характеристики.
В таблице изделий - только ДСЕ типа изделий с их особенными характеристиками.
Обе в качестве ключа имеют один и тот же ДСE_Id.
Получается связь тип/подтип.

т.е. имеете ввиду, вставив новую деталь, применить получившийся ID в таблице Изделия для идентификации ? Т.е. если новый IDДетали=34, то вставляем в Изделия запись с IDИзделия=34 ? Но как в этом случае занести запись в Детали, ведь там должна быть ссылка на изделие, т.е. в случае нулевой сборки на то-же ID, что имеет сама деталь, а в момент вноса он еще неизвестен.
ModelR
Кроме таблицы входимости (спецификация) у вас еще какая-то входимость в самой таблице деталей

В таблице Деталь ? Где ? что-то не вижу там ничего предосудительного
...
Рейтинг: 0 / 0
Ловушка 22
    #34221812
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfcreate table Детали(IDДетали int, Обозначение varchar(100), Наименование varchar(100), Покупная bit, БезЧертежка bit, IDИзделия int )
[...]
Но как в этом случае занести запись в Детали, ведь там должна быть ссылка на изделие, т.е. в случае нулевой сборки на то-же ID, что имеет сама деталь, а в момент вноса он еще неизвестен.
[...]
В таблице Деталь ? Где ? что-то не вижу там ничего предосудительного
деталь входит два изделия. Что в Детали.IDИзделия ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34221832
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfполучиться избыточность
Не получится. Точнее, если Вы полагаете избыточностью любое поле, допускающее null, Вам придется чуть ли не для каждого поля заводить отдельную таблицу.

stenfхотелось-бы все-таки обеспечить ссылочную целостность структурой базы, а не хитрыми финтами ушей
Хм. Интересно, Вы вообще думаете, о чем говорите?
...
Рейтинг: 0 / 0
Ловушка 22
    #34221849
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала прочитай статьи про деревья на ibase.ru, там достаточно для начала, оттуда же поймешь, что можно задавать новые записи в древесной тоблице в виде ссылок на ранее созданные. Сама природа развивается от простого к сложному, та шта...сначала набиваются справочники всевозможных простых элементов, а потом вводятся более сложные, ссылаясь на уже набитые более простые.
...
Рейтинг: 0 / 0
Ловушка 22
    #34221913
Фотография proposed amendment
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ловушка 22
    #34223562
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelR
деталь входит два изделия. Что в Детали.IDИзделия?

Виноват. Непреднамеренно ввел вас в заблуждение. Прошу прощения. Деталь может входит только в одно изделие (IDИзделия + IDДетали уникально). Это связано с тем, что деталь с одним и тем-же шифром может иметь разные наименования в разных изделиях. Вообще, подумав, я пришел к выводу, что в IDИзделия нулевой сборки можно вставить null. Первоначально я не хотел так делать, но вообще-то в этом нет ничего страшного. Так что ваше предложение об использовании IDДетали в качестве IDИзделия в таблице изделий вполне работает. Это позволит избавиться от ссылки на деталь в таблице Изделия, так как теперь IDИзделия и является собственно ссылкой на деталь. Thanks
softwarer
Хм. Интересно, Вы вообще думаете, о чем говорите?

Неужели обиделись ? Вот уж не думал.
Избыточность в первом случае есть, так как каждая деталь будет обладать параметрами, присущими только изделиям, что имхо неверно.
Update после вставки не даст установить внешний ключ на это поле (а он тут нужен), deffered constraints не знаю есть-ли в mssql, но в любом случае даже временный "обход" ограничений не есть идеальное решение
...
Рейтинг: 0 / 0
Ловушка 22
    #34223592
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfНеужели обиделись ? Вот уж не думал.
Да нет, просто удивляюсь.

stenfИзбыточность в первом случае есть
Избыточность, точнее "логическая избыточность в Вашем смысле этого слова" есть в случае любого поля, допускающего null-значения. Рассмотрите, скажем, позиции товарных документов, ряд полей которых (отпускная цена, кладовщик, серийный номер) заполняются только при отгрузке. В принципе их можно было бы так же распилить - на "позицию" и "данные по отгрузке позиции". Технически любую схему можно преобразовать в эквивалентную без подобной избыточности, это будет даже давать некоторые преимущества, скажем возможность легко реализовать ограчинения вида "если введено A, должны быть также введены B, C и D". Но на практике это будет зверски неудобно.

stenfUpdate после вставки не даст установить внешний ключ на это поле (а он тут нужен),
Ччего, простите?

stenfdeffered constraints не знаю есть-ли в mssql
Были какие-то. Но это лучше смотреть на месте.

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

Представьте себе любую транзакцию, состоящую более чем из одного элементарного SQL-оператора. Можно быть почти уверенным в том, что в момент "между операторами" данные не являются целостными (скажем, с одного счета списали, на другой еще не записали). И что же, все, капут рыбке, решение неидеальное?
...
Рейтинг: 0 / 0
Ловушка 22
    #34224399
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfДеталь может входит только в одно изделие (IDИзделия + IDДетали уникально). Это связано с тем, что деталь с одним и тем-же шифром может иметь разные наименования в разных изделияхНе совсем понял. "IDИзделия + IDДетали уникально" означает лишь что одна деталь входит в одно изделие однократно но не запрещает вхождений в разные изделия.
А "Деталь может входит только в одно изделие" моделируется как функциональная зависимость IDДетали -> IDИзделия. Откуда следует, что если в ключе таблицы присутствует IDДетали , то IDИзделия уже не часть этого ключа.
Короче уникальность не проясняет ситуацию, важен ключ.
...
Рейтинг: 0 / 0
Ловушка 22
    #34225461
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Но на практике это будет зверски неудобно.

Я могу вам привести цитату Джо Селко: "В целой схеме БД, разработанной профессионалом часто бывает меньше полей допускающих null, чем в одной таблице, разработаной новичком." Так что я стараюсь избавляться от null'ов, и имхо с этой точки зрения ввод в таблицу сразу нескольких полей с null нецелесообразно.
softwarer
Ччего, простите?

ваши слова "insert в изделия - insert в детали - update изделий с установкой id детали.". При инсерте в Изделия деталь неизвестна, что вы там будете вставлять в поле IDДетали, если там стоит внешний ключ на Детали ? Подозреваю, что вы мне сейчас предложите null.
Однако давать разрешение столбцу иметь null, хотя там ни один null не должен будет появляться (за исключением короткого момента между двумя вышеуказанными операторами) является логическим кошмаром.
Кроме того, как известно ружье висящее на стене рано или поздно выстрелит, а в столбце допускающим null'ы рано или поздно этот null появиться, что приведет к сбою клиентского приложения, причем неприменно в момент демонстрации его заказчикам.
softwarer
Представьте себе любую транзакцию, состоящую более чем из одного элементарного SQL-оператора

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

вообще-то да, IDДетали действительно уникально, (оно вообще identity). Я не могу допустить появления одного и того-же IDДетали в разных изделиях, даже если их параметры полностью идеинтичны, так как через некоторое время конструктор захочет переименовать деталь (пометить как покупную и прочее), и это изменение не должно повлиять сразу на два и более изделия.
Собственно этим identity заодно обеспечиться и уникальность детали внутри одного изделия
...
Рейтинг: 0 / 0
Ловушка 22
    #34225561
ййййййй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 stenf:
гы, мля! улыбнул!
до чего мудро, глубоко излагаешь! разбомбил softwarer-а, камня от камня не оставил ....
читай, пиши еще ....

смари - у тебя пылесос - это изделие ? состоит из деталей? - все хорошо. а есть супир пылесосно втягивающая машина, которая состоит из тысчи пылесософф, мост приэтом взорван, ваши дейстия?
...
Рейтинг: 0 / 0
Ловушка 22
    #34226207
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf softwarerНо на практике это будет зверски неудобно.
Я могу вам привести цитату Джо Селко:
Селко, при всех его многочисленных достоинствах, не совсем практик. Кроме своих достоинств он обладает также одним из моих, а именно склонностью к экстремальным точкам зрения. Это и приводит к этой цитате, порожденной, как я слегка подозреваю, рефлексами работы в dbf-овские времена.

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

stenfваши слова "insert в изделия - insert в детали - update изделий с установкой id детали.".
Мои. Внешние ключи при этом нормально работают.

stenfПри инсерте в Изделия деталь неизвестна, что вы там будете вставлять в поле IDДетали, если там стоит внешний ключ на Детали ? Подозреваю, что вы мне сейчас предложите null.
Однако давать разрешение столбцу иметь null, хотя там ни один null не должен будет появляться (за исключением короткого момента между двумя вышеуказанными операторами) является логическим кошмаром.
Из двух ссылок хотя бы одна должна допускать null по той простой причине, что иначе неизбежно потребутся пары, закольцованные друг на друга, либо циклы [не советую пытаться опровергать - это тривиально доказывается строго математически]. В Вашем случае это будет означать "изделие является собственной деталью", что есть даже не логический кошмар, а просто объективный бред. С этой стороны и начинайте вставлять записи с null.

stenfКроме того, как известно ружье висящее на стене рано или поздно выстрелит, а в столбце допускающим null'ы рано или поздно этот null появиться, что приведет к сбою клиентского приложения, причем неприменно в момент демонстрации его заказчикам.
То есть Вы предпочитаете циклы в иерархии компоновки? Ну... удачи Вашим заказчикам, и главное терпения.

Впрочем, даже в такой - имхо, не то чтобы удачной - постановке задачи она запросто решается теми же deferred constraint-ами. Получаете два id, вставляете записи в базу в любом порядке.

stenf softwarer
Представьте себе любую транзакцию, состоящую более чем из одного элементарного SQL-оператора

Вы утрируете.
Чего, простите? По-вашему, транзакция из нескольких операций - это утрирование, в жизни такого не бывает?

stenfВ случае транзакций вам некуда деваться.
Ой, да что Вы говорите :)

Кстати, а что за "в случае транзакций"? В приличных СУБД случаев без транзакций не бывает.

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

Код: plaintext
1.
2.
create table Детали (id_детали, id_изделия.....) ;
create table Изделия (id_изделия, ....... ) ;
create table ВхожденияИзделийВДетали (id_изделия, id_детали) ;

stenfЯ не могу допустить появления одного и того-же IDДетали в разных изделиях, даже если их параметры полностью идеинтичны,
Вот как раз тут стоило бы думать о хорошей структуре базы.
...
Рейтинг: 0 / 0
Ловушка 22
    #34226321
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ййййййй
гы, мля! улыбнул!
до чего мудро, глубоко излагаешь! разбомбил softwarer-а, камня от камня не оставил ....
читай, пиши еще ....

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

вах маладэц, какой информативный речь сказал ! Твои познания в программировании такого-же уровня, как в русском языке ?

Подними глаза и прочти еще раз мой ответ ModeleR'у. Никаких "изделий внутри изделия" в моей системе быть не может по указанной там причине.

А потом на прием к врачу сходи, а то "супир пылесосно втягивающая машина из тысчи пылесософф" с приплетенным "взорванным мостом" наводит на подозрения... Буйная фантазия это конечно хорошо, пока она не перерастает некоторые границы и не оказывается в компетенции соответствующего медперсонала
...
Рейтинг: 0 / 0
Ловушка 22
    #34226324
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Селко, при всех его многочисленных достоинствах, не совсем практик. Кроме своих достоинств он обладает также одним из моих, а именно склонностью к экстремальным точкам зрения. Это и приводит к этой цитате, порожденной, как я слегка подозреваю, рефлексами работы в dbf-овские времена.

Хорошо, открываем Кена Хендерсона и читаем там, что null это "противные маленькие чудовища" и "необходимое зло в некоторых случаях". Он тоже теоретик ? :) Хотя конечно может быть. Видимо у меня неудачная подборка книг
softwarer
С этой точки зрения предлагаемая Вами структура.... настораживает, и имхо больше нуждается во внимании, нежели формальные критерии.

Вы возможно не совсем верно поняли цель моего первого поста - указанная там структура лишь показывает, что я примерно хочу добиться, и выложил я ее сюда как раз что-бы найти что-то лучшее.
На данный момент мне нравиться предложение ModelR - я убираю IDДетали из Изделия, а в качестве IDИзделия в таблице Изделия применяю IDДетали, сгенерированный при вставке в Детали. В поле IDИзделия таблицы Детали для нулевой сборки вставляю null. Если у вас есть конструктивная критика данного подхода - буду очень рад услышать.
softwarer
В Вашем случае это будет означать "изделие является собственной деталью", что есть даже не логический кошмар, а просто объективный бред.

Это еще почему ? Заместо null для нулевой сборки я могу вставить IDДетали и никакого объективного бреда не получиться. Нулевая сборка тоже является частью изделия, просто в данном конкретном случае она еще и обладает рядом дополнительных свойств.
Возможно вы путаете отношение деталь/сборка и изделие/деталь. Все детали (включая нулевую сборку) имеют изделие, в рамках которого изготовляются.
softwarer
Чего, простите? По-вашему, транзакция из нескольких операций - это утрирование, в жизни такого не бывает?

Утрирование в данном случае - это применение нерелевантного сравнения. Это как если-бы я в качестве доказательства опасности велосипедистов на улицах привел-бы статистику погибших пешеходов под колесами Кразов. Ведь и то, и другое - средство передвижения.
Зачем приводить в пример нарушение логической целостности базы внутри транзакции и нарушение целостности, при котором в таблицу вставляются значения, которых там по бизнес правилам быть не должно, а вы просто договорились с сервером, что "ща погоди, следующий оператор все поставит на свои места" ? Есть принципиальная разница между "списали с одного счета, а на другой зачислим следующим оператором" и "вставляем в поле ссылку на отсутствующий объект"
Вообще я тут не критикую deffered constraints, просто применение этого "маленького чудовища" тоже бы неплохо ограничить действительно необходимыми случаями, а данный случай имхо не является таковым.
softwarer
Вот как раз тут стоило бы думать о хорошей структуре базы.

Любая критика - welcome.
...
Рейтинг: 0 / 0
Ловушка 22
    #34226468
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf
Вы возможно не совсем верно поняли цель моего первого поста - указанная там структура лишь показывает, что я примерно хочу добиться, и выложил я ее сюда как раз что-бы найти что-то лучшее.

Вы лучше по русски опишите то, чего Вы пытаетесь добиться. Разбираться в чужих мыслях для решения обычных задач, думаю, мало кому интересно. Отсюда и поток флейма.
...
Рейтинг: 0 / 0
Ловушка 22
    #34227005
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafm
Вы лучше по русски опишите то, чего Вы пытаетесь добиться

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

Уж больше и не знаю, как можно еще более понятно описать проблему, сорри
...
Рейтинг: 0 / 0
Ловушка 22
    #34227253
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf
Вы опять, без таблиц правда, описали Ваше решение какой-то задачи, а не саму задачу. Хочется понять, почему типовые варианты BOM Вас не устраивают, но для этого нужно знать хотя-бы образ задачи, а не Ваше решение.
...
Рейтинг: 0 / 0
Ловушка 22
    #34227322
ййййййй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дядя, похоже ты недавно оттуда ?! :)) я погорячился, не читай! особенно страшных книжек про null и чертиков :(

а вот так вот:
create table Детали(IDДетали int, характеристики ...)
create table Изделия(IDИзделия int, характеристики ...)
create table ИзделиеДеталь(IDИзделия int, IDДетали int)
create table ДетальДеталь(IDДетали int, IDРодительскойДетали)
чертикофф будет поменьше ?

автор
Есть набор деталей/сборок. Из них сформирована входимость.

create table Детали(IDДетали int, характеристики ...)
create table ДетальДеталь(IDДетали int, IDРодительскойДетали)

автор
Каждая деталь/сборка должна обладать аттрибутом Изделие, которое описывает общие для изделия параметры.

create table Изделия(IDИзделия int, характеристики ...)
create table ИзделиеДеталь(IDИзделия int, IDДетали int)

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

запросы ты будешь написывать или ты только теоретик/архитектор?

дядя, не обижайся! тебе рассказывают, рассказывают а ты цитируешь гегеля ...
...
Рейтинг: 0 / 0
Ловушка 22
    #34228395
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafm
Хочется понять, почему типовые варианты BOM Вас не устраивают

что такое ВОМ и что там за типовые решения ?
iscrafm
описали Ваше решение какой-то задачи, а не саму задачу

опять не слава богу. Как мне надо описать задачу, что-бы все всем стало понятно ? Мне непонятно, что может быть непонятного в деревянной структуре изделия, где все детали должны быть связаны с изделием, а само изделие - с нулевой сборкой. Это и есть постановка, а никак не решение задачи.
ййййййй
create table Детали(IDДетали int, характеристики ...)
create table Изделия(IDИзделия int, характеристики ...)
create table ИзделиеДеталь(IDИзделия int, IDДетали int)
create table ДетальДеталь(IDДетали int, IDРодительскойДетали)

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

в следующий раз тебя могу начать цитировать, правда вытянуть что-то ценное из туманных тирад про пылесосновтягивающие машины, чертиков и гегеля будет сложновато...
...
Рейтинг: 0 / 0
Ловушка 22
    #34228790
Фотография !!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В терминах предметной области, IMHO, надо представить нечто, очень похожее на спецификации.
Изделие кол-воСборочние единицыСБ 010 1СБ 020 1СБ 030 1Детали...Материалы...

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

Все это незамысловато описывается структурой вида
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
-- Это конструкторская документация
create table ДеталиИСборочныеЕдиницы (id, ...) ;
create table Вхождения(id, id_parent, количество) ;
alter table Вхождения add (foreign key (id)  references ДеталиИСборочныеЕдиницы (id));
alter table Вхождения add (foreign key (id_parent)  references ДеталиИСборочныеЕдиницы (id));
-- Это экземпляры изделий
create table Изделия (id_изделия, id_СБ000, ...);
alter table Изделия add (foreign key (id_СБ000)  references ДеталиИСборочныеЕдиницы (id));
stenfЯ не могу допустить появления одного и того-же IDДетали в разных изделиях, даже если их параметры полностью идеинтичны, так как через некоторое время конструктор захочет переименовать деталь (пометить как покупную и прочее), и это изменение не должно повлиять сразу на два и более изделия Эта операция называется "внесение изменений в КД", стало быть в таблицах ДеталиИСборочныеЕдиницы и Вхождения возникают новые записи, а старые помечаются как недействительные.
Разумеется, что следует также предусмотреть понятия Исполнение и Вариант в виде атрибутов либо сущностей, также описывающих КД.

stenf iscrafm
Хочется понять, почему типовые варианты BOM Вас не устраивают

что такое ВОМ и что там за типовые решения ?Bill Of Materials - спецификация
...
Рейтинг: 0 / 0
Ловушка 22
    #34229087
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 !!!

Дело в том, что наша система имеет направленность на производство изделий, а не на конструкторскую разработку, управлением конструкторской документацией занимаются PDM системы, например у Solid Works есть нечто подобное, в любом случае к нашей системе это не имеет отношения. Поэтому такие понятия как сохранение истории изменений входимости и варианты нас не волнуют, материалы учитываются, но на более поздней стадии (на основе входимости составляются так называемые производственные партии деталей, которые идут в запуск, на такую партию пишется технология и только на этом этапе прицепляется материал). В остальном ваша схема не отличается от моей.

>>Bill Of Materials - спецификация

и что там за типовые решения ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34229569
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf
>>Bill Of Materials - спецификация
и что там за типовые решения ?
Типовой BOM - это только ДВЕ таблицы:
1. Предметы (изделия, сборки, детали, материалы, комплектующие и т.д.)
2. Состав предметов (что, куда, скока)
Почему так и никак иначе долго объяснять.
...
Рейтинг: 0 / 0
Ловушка 22
    #34229659
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мод stenf
>>Bill Of Materials - спецификация
и что там за типовые решения ?
Типовой BOM - это только ДВЕ таблицы:
1. Предметы (изделия, сборки, детали, материалы, комплектующие и т.д.)
2. Состав предметов (что, куда, скока)
Почему так и никак иначе долго объяснять.
в таком случае любые решения на такой основе не подойдут, хотя-бы потому, что материал в нашей системе не может цепляться на деталь/сборку из входимости, так как номенклатурный номер материала зависит от числа деталей запускаемых в производство, а это число может отличаться от того, что написано во входимости
...
Рейтинг: 0 / 0
Ловушка 22
    #34231795
stenf мод stenf
>>Bill Of Materials - спецификация
и что там за типовые решения ?
Типовой BOM - это только ДВЕ таблицы:
1. Предметы (изделия, сборки, детали, материалы, комплектующие и т.д.)
2. Состав предметов (что, куда, скока)
Почему так и никак иначе долго объяснять.
в таком случае любые решения на такой основе не подойдут, хотя-бы потому, что материал в нашей системе не может цепляться на деталь/сборку из входимости, так как номенклатурный номер материала зависит от числа деталей запускаемых в производство, а это число может отличаться от того, что написано во входимости
Это вы сами себе вырыли яму... Получается, как в комедии "Недоросль":"...если дверь стоит, то она - имя существительное, а если лежит - то прилагательное..."
По нормальному было бы обеспечить в системе:

ID материала/полуфабриката/детали = номенклатурный № = ID (в конструкторской документации) = const
...
Рейтинг: 0 / 0
Ловушка 22
    #34232037
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfноменклатурный номер материала зависит от числа деталей запускаемых в производство
При таком дезайне вам уже ничего не поможет, извините.
...
Рейтинг: 0 / 0
Ловушка 22
    #34232184
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfв таком случае любые решения на такой основе не подойдут, хотя-бы потому, что материал в нашей системе не может цепляться на деталь/сборку из входимости, так как номенклатурный номер материала зависит от числа деталей запускаемых в производство, а это число может отличаться от того, что написано во входимостиИмеется ввиду, что типа если запускаемых деталей мало, то следует их нарезать из короткого прутка, а если много, то дОлжно брать длинный? Тогда одним BOMом не отделаешся, имеем уже варианты технологий, и варианты технологических норм.
...
Рейтинг: 0 / 0
Ловушка 22
    #34232544
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
варианты технологий в нашей системе есть
...
Рейтинг: 0 / 0
Ловушка 22
    #34232622
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfХорошо, открываем Кена Хендерсона
Если честно, не в курсе кто это, а характеристика на основании быстрого поиска по гуглю вряд ли будет объективной.

stenfВ поле IDИзделия таблицы Детали для нулевой сборки вставляю null.
Oops. Мы же с этого начали - Вы начали отказываться от null, я начал показывать, что последствия будут хуже. Как только Вы решаетесь таки использовать null, все становится легко и просто.

stenfУтрирование в данном случае - это применение нерелевантного сравнения.
Вполне релевантное в рамках того, что я хочу объяснить.

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

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

stenfЕсть принципиальная разница между "списали с одного счета, а на другой зачислим следующим оператором" и "вставляем в поле ссылку на отсутствующий объект"
Нет, ничуть, если "следующим оператором вставим объект, на который ссылаемся".

stenfВообще я тут не критикую deffered constraints, просто применение этого "маленького чудовища" тоже бы неплохо ограничить действительно необходимыми случаями, а данный случай имхо не является таковым.
deferred constraints - это действительно не то чтобы хорошая штука. Но лучше, чем их отсутствие :) В условиях задачи "без null" без них было не обойтись; с null они не нужны.
...
Рейтинг: 0 / 0
Ловушка 22
    #34233800
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С
Это вы сами себе вырыли яму... Получается, как в комедии "Недоросль":"...если дверь стоит, то она - имя существительное, а если лежит - то прилагательное..."
По нормальному было бы обеспечить в системе:

ID материала/полуфабриката/детали = номенклатурный № = ID (в конструкторской документации) = const

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

вы путаете архитектуру и бизнес-правила :)
softwarer
Если честно, не в курсе кто это, а характеристика на основании быстрого поиска по гуглю вряд ли будет объективной.

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

По поводу всего остального - да, идея с null в поле IDИЗделия тоже не фонтан, но тем не менее лучше, чем null сразу в нескольких полях таблицы, или null в одной, с условием обязательного update, т.е. когда есть поле null, которое никогда не должно содержать null вне транзакции.

Вообще, тут возможно лучше как раз "извращенный" способ с третьей таблицей, содержащей связи IDИзделия-IDНулевойСборки, но тут я готов пойти на компромис с совестью :)
softwarer
Потому что то и другое - нарушение целостности. Целостность не есть атрибут конкретного оператора, конкретной записи итп. Это атрибут базы в целом. В ходе транзакции допускается нарушение "целостности снапшота" с условием, что к концу транзакции целостность будет восстановлена.

Да они похожи, как и велосипед похож на грузовик тем, что оба сделаны из металла, имеют колеса, служат для перевозки людей и грузов и управляются одним человеком.
Разница (важная) в том, что нарушение внешнего ключа - это такое нарушение структурной целостности базы, при котором нарушается сама ее основа, заданная архитектором, в то время как временное несоответствие кредита/дебита - это проблема не структуры базы, а программ, которые с ней работают. Самой базе будет глубоко фиолетово, если на счет не поступят деньги, списанные с другого счета.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234029
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfНоменклатурный номер - это совокупность материала и сортамента. Поэтому, если например требуется изготовить 1000 шайб, то конструктор не может выбрать номенклатурный номер, потому-что если вся тысяча пойдет на запуск, то потребуется (условно) полоса 100х200, а если запуск пойдет двумя партиями по 500 шт. - то их нарубят из листа 100х100. Конструктор не может обладать такой информацией.

Вы связываете ном. номер с партией. Не делайте этого и тогда не нужно будет его менять по каждому чиху. Конструктор может выбрать нн всегда, потому как это характеристика класса, а не его экземпляра. У Вас, похоже все наоборот реализовано, или хотите реализовать. Такую тактику предлагает BAAN, например, что не есть хорошо. Определитесь, что у Вас действительно является номенклатурой, а что конкретной партией, со своим размером, датой выпуска-запуска и т.п. Если у Вас все под заказ делается, то тогда вообще непонятно в чем проблема. Набирайте спецификацию из уникальных деталей (сборок), каждая из которых имеет свою уникальную спецификацию и т.д. и т.п. Опять же, двух таблиц достаточно.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234061
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfоднако вы уже впадаете в крайность, когда столько (известных) человек твердят о плохом влиянии null, то ваш опыт (говорящий о пользе null) в любом случае не может перевесить их.
Хм. Видите ли в чем дело, я выдвигаю заведомо "умеренную" точку зрения (применять null там, где он нужен) против процитированных Вами заведомо "экстремальных".

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

stenfоднако очевидно, что такие случаи надо сводить к минимуму, а не плодить их
stenf, Вас никто не призывает их плодить. Вы сами пришли к тому, что null здесь нужен, так нафига теперь придумывать за меня наивные концепции?

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

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

Каждое из этих правил может контролироваться различными способами. Скажем, первое я могу контролировать триггером, писать код, а второе - через materialized view, без всякого кода.

Внешний ключ - это механизм проверки бизнес-правил. Стандартное, удобное решение. Ничего более, никаких "структурной целостности основ". С практической точки зрения нарушение баланса может быть во всех отношениях гаже, нежели нарушение внешнего ключа, это зависит только от бизнеса, а не от того, какие проверки авторы СУБД предусмотрели, а какие нужно реализовывать руками.

Сугубо технически я даже могу организовать ситуацию, при которой существует и активен внешний ключ, но в таблицах лежат нарушающие его данные. Хотя именно для внешних ключей смысла в этом пожалуй нет, это удобно для check и notnull constraint-ов.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234096
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafm
Вы связываете ном. номер с партией. Не делайте этого и тогда не нужно будет его менять по каждому чиху

Либо я не понял вас, либо вы не поняли меня.
Номенклатурный номер - это не наше изобретение, он существует испокон веков и не нам менять эту концепцию. Этим номером является например "Труба 60 x 5 ГОСТ 8734-75 / В10 ГОСТ 8733-87" и "Уголок 75 x 50 x 8-В ГОСТ 8509-86 / Ст3 - сп2-св ГОСТ 535-88". С этими номерами работает отдел снабжения, бухгалтерия и пр. Т.е. он нужен, и именно в таком виде.
Партию и ном.номер нельзя не связать, потому-что именно размеры партии определяют, какой номер выбрать.
Возможно вы подумали, что номеклатурный номер как-то завязан на номенклатуру производимых товаров, это не так, этот номер лишь определяет материал и вид заготовки, которую отдел снабжения должен закупить для производства изделий.
Т.е. например (условно) для производства шайб они должны будут закупить "Пластина 50 x 500 x 500 Ф-4, с.2 ТУ 6-05-810-88". Этот номенклатурный номер был выбран технологом, когда он писал технологию на партию шайб.
softwarer
против процитированных Вами заведомо "экстремальных".

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

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

хм, несколько null-полей в таблице это называется не плодить ? Или это каким-то образом способно оградить меня от более серьезных ошибок ?
softwarer
А вот это, простите, глубочайшее и принципиальное заблуждение.

Вы изо всех сил выпячиваете те их свойства, которые их обьединяют. Да, это все методы для проверки бизнес-правил.
Тем не менее имхо разница есть.
Вот смотрите. Есть положим система учета платежей за телефон. Она содержит данные о пользователе и данные о платежах и расходах.
Очевидно, что данные о средствах должны быть связаны с конкретным человеком. Также мы должны позаботиться о том, что-бы не дать ему разговаривать забесплатно.
Ни при каких условиях счет не может оказаться "подвешенным" в воздухе, т.е. не содержать ссылки на человека, которому он принадлежит. Это обеспечивается внешним ключом.
Однако вполне может так оказаться, что являясь нашим лучшим клиентом, мы хотим подарить ему бесплатные минуты. Если при проектировании системы вы включили в систему проверку на соответствие прихода/расхода - то БД просто не даст нам совершить этот великодушный поступок.
Уверен, что сейчас скажите, что тут всего-навсего имеет место быть промах в проектировании.
Однако широко известно, что бизнес-правила могут (и будут) изменяться с ходом времени. Однако никакое бизнес-правило не может измениться так, что-бы счет оказался "в воздухе", так как это противоречит физической реальности. Грубо говоря, вы можете быть уверенным, что физическая реальность не является изменчивым бизнес-правилом и будет неизменна сколь угодно долго.
Именно такие явления я называл "самой основой схемы БД". То, что не может изменяться. Никогда. Следовательно, разрешать даже временное отступление от этих правил по определению нехорошо, и заставит будущих программистов, которые будут сопровождать вашу систему, совершать лишние шевеления извилинами, пытаясь осознать почему ваша система так устроена.


-----------------------------------------------------
Поздравляю всех с Новым Годом, желаю всего !
-----------------------------------------------------
...
Рейтинг: 0 / 0
Ловушка 22
    #34234128
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfесли например требуется изготовить 1000 шайб, то конструктор не может выбрать номенклатурный номер, потому-что если вся тысяча пойдет на запуск, то потребуется (условно) полоса 100х200, а если запуск пойдет двумя партиями по 500 шт. - то их нарубят из листа 100х100. Конструктор не может обладать такой информацией.
нет у меня под рукой сейчас базы из металообработки, но на примере пищевки думаю тоже будет понятно о чем речь. Технолог использует в рецептуре Сметану, что из себя представляет Сметана - отчетливо видно на картинке ниже. У Вас ничем не отличается. Технолог использует в спецификации заготовку, к примеру толщиной 5 мм. Размер же листа не должен его волновать. Это уже атрибут партии материала, которая подбирается для изготовления детали.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234137
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfхех, я-же ваши примеры цитировал 8)
Really? :)

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

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

Подумайте вот о чем. Я сходу нарисую Вам алгоритм "как от структуры с null перейти к эквивалентной без null". Такой же простой и строгий как алгоритмы нормализации. Но названные Вами джентльмены почему-то не обессмертили свое имя, публикуя этот алгоритм и позволяя обойтись вообще без единого null в базе. Как Вы думаете, почему?

stenfВы, как человек обладающий хорошими знаниями и опытом в этой области, совершите меньше ошибок и без null, я и с null могу навносить туда жуков.
Ээ... эта фраза наверное несколько неожиданно для Вас оказалась истинной. Она аналогична примерно следующему: "опытный гонщик и на запорожце опередит ламера на субару". :)

stenfхм, несколько null-полей в таблице это называется не плодить ? Или это каким-то образом способно оградить меня от более серьезных ошибок ?
Хм. Прежде всего, "несколько" - это довольно бессмысленная категория. С точки зрения
"возможной опасности null" поля можно разделить на три категории:

Участвующие во внешних ключах. "Неожиданный" null способен привести к пропаданию нужных строк из выборки.


Участвующие в расчетах. "Неожиданный" null способен испортить результат какого-нибудь вычисления.


Просто хранимые поля. null совершенно не страшен (до тех пор, пока на клиенте не применяется какой-нибудь тупой ORM, не решивший корректно вопрос работы с null-полями).

Практически первая названная ситуация, пожалуй, наиболее тяжелая с точки зрения встречающихся последствий. Вторая выглядит куда гаже, но тут я позволю себе сослаться просто на свой опыт - такое встречается крайне редко, я пару раз встречал рассказы о таких ситуациях, а в личном опыте так по-моему ни разу. Скорее всего, дело в том, что такие ситуации в 99.9% случаев приводят к null-результату вычисления и ошибке cannot insert null into not-null field, то есть отлавливаются сразу и не приводя к существенным проблемам.

stenfВы изо всех сил выпячиваете те их свойства, которые их обьединяют.
Да, именно так.

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

stenfОднако вполне может так оказаться, что являясь нашим лучшим клиентом, мы хотим подарить ему бесплатные минуты.
Если мы хотим подарить бесплатные минуты, это должно быть учтено в структуре БД. Если мы начинаем корежить данные с целью добиться нужного результата, это не "безобидная шалость", а "одна из самых больших проблем, какие только можно создать".

stenfОднако никакое бизнес-правило не может измениться так, что-бы счет оказался "в воздухе", так как это противоречит физической реальности.
Смотря что Вы называете "в воздухе". Если "ссылающийся на отсутствующую запись", это конечно плохо, потому что правильнее сделать ссылку на null. Счет "неизвестно для кого" не есть хорошо, но может потребоваться, когда выставляется он таки действительно неизвестно на кого. Зачем такой? Cкажем, для того, чтобы бухгалтерия принимала по нему решение, в то время как система не попыталась выставить счет на те же услуги в следующий раз.

stenfГрубо говоря, вы можете быть уверенным, что физическая реальность не является изменчивым бизнес-правилом и будет неизменна сколь угодно долго.
Cуществование "физической реальности" - это тоже заблужение :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34234220
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Как быть ?

Классический BOL. Нужна дополнительная типизация - ну так и заведите типы и маски. Вообще, судя по "create table изделия(IDИзделия int, Заказчик varchar(100), IDДетали int, СрокСдачи datetime, Примечание varchar(100))", Вы занимаетесь не своей работой: изделие не может быть связано с заказчиком описанным образом. Это грубейшая ошибка.

Hint: не читайте Celco. Вообще. Забудьте.
Hint 2: Дейта мало пересказывать, его нужно понимать. Null плох тогда и только тогда, когда он может быть интерпретирован не однозначно. Во всех остальных случаях - это абсолютно нормальное значение.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234221
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тьфу, блин. BOM, конечно. Сорри, уже начали праздновать.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234398
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafm
Размер же листа не должен его волновать

еще как волнует. Выбор листа полностью на совести технолога, потому-что иначе кто собственно будет этот лист выбирать ?
softwarer
Really? :)

really-really :)
softwarer
Другой вопрос, что как и реляционная теория вообще, для удачного применения она требует некоторого особенного понимания, взгляда на мир, некоего особого винтика в мозгу, который, к сожалению, некоторым просто не дан.

Вы так увлеклись рытьем ямы для меня, что сами в нее и свалились.
Любая концепция, требующая особых винтиков в голове не должна применяться в программировании, потому-что это усложняет сопровождение программ и является потенциальным источником ошибок. Это как множественное наследование в ООП, может и хорошее изобретение, расширяющее возможности программиста, только вот например Steve McConnell (не дай бог скажите что теоретик) советует держаться подальше от такого счастья, ибо это неоправданно усложняет программы и напоминает "старинную цепную пилу с барахлящим мотором и не имеющей предохранителей".
softwarer
Но названные Вами джентльмены почему-то не обессмертили свое имя, публикуя этот алгоритм и позволяя обойтись вообще без единого null в базе. Как Вы думаете, почему?

Откуда-же я знаю, наверно это их и стоит спросить. Собственно, может где-то это уже и опубликовано, если это является таким ценным алгоритмом
softwarer
Практически первая названная ситуация, пожалуй, наиболее тяжелая с точки зрения встречающихся последствий. Вторая выглядит куда гаже, но тут я позволю себе сослаться просто на свой опыт - такое встречается крайне редко, я пару раз встречал рассказы о таких ситуациях, а в личном опыте так по-моему ни разу. Скорее всего, дело в том, что такие ситуации в 99.9% случаев приводят к null-результату вычисления и ошибке cannot insert null into not-null field, то есть отлавливаются сразу и не приводя к существенным проблемам.

Может это какой-то хитрый логический ход, но мне кажется странным агитирование за null при помощи демонстрации его недостатков.
То, что проблемы появляются "крайне редко" и не приводят к "существенным проблемам" никак не может служит стимулом к их использованию.
softwarer
Как раз в той "системе без null", с которой пришлось возиться, я в какой-то момент обнаружил около 50.000 записей "банковских счетов", не привязанных к банкам. Как потом выяснилось, с этими данными была какая-то проблема при импорте, их криво затянули, в итоге они были привязаны к "неизвестному банку"

Вот. Представляете теперь, какой кошмар мог-бы произойти, если-бы там еще и null были ?
softwarer
и как ни странно, никаких проблем это не доставляло

Действительно странно. 500000 банковских счетов в воздухе и никаких проблем. Назовите пожалуйста имя банка, что-бы я не нес туда свои деньги :)
softwarer
Если мы хотим подарить бесплатные минуты, это должно быть учтено в структуре БД

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

не понял, как корежить ?
softwarer
Счет "неизвестно для кого" не есть хорошо, но может потребоваться, когда выставляется он таки действительно неизвестно на кого.

Я не знаком с разработкой систем для банков, но со стороны такое решение напоминает удаление гландов через задницу. Такие "хитрожопые" решения опять-таки усложняют сопровождение, что плохо по определению.
В моей системе я не собираюсь допускать существование детали "подвешенной в воздухе".
softwarer
Cуществование "физической реальности" - это тоже заблужение :)

ну надо-же во что-то верить, я предпочитаю верить в обьективную реальность вокруг меня :)
guest_20040621
Вы занимаетесь не своей работой: изделие не может быть связано с заказчиком описанным образом

у нас внутренний заказчик - само предприятие, так что поле заказчика скорее является некоторой разновидностью примечания. Ничего страшного в наличии такого атрибута у изделия нет
...
Рейтинг: 0 / 0
Ловушка 22
    #34234413
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfreally-really :)
Hmm.... Can you make тынц?

stenfВы так увлеклись рытьем ямы для меня, что сами в нее и свалились.
Любая концепция, требующая особых винтиков в голове не должна применяться в программировании,
Значит, RDBMS и SQL не должны применяться в программировании. Сказанное мной - не моя придумка, а широко известный факт. Есть люди, которые просто не понимают декларативного подхода, которые способны, например, написать примерно следующий код и считать его правильным:

Код: plaintext
1.
2.
for crData1 in ( select * from Data1 ) loop
  update Data2 set Value = Value + crData1.Value where id = crData1.id ;
end loop ;

stenfпотому-что это усложняет сопровождение программ и является потенциальным источником ошибок. Это как множественное наследование в ООП, может и хорошее изобретение, расширяющее возможности программиста, только вот например Steve McConnell (не дай бог скажите что теоретик) советует держаться подальше от такого счастья,
Ага. Стандартный подход программиста на Visual Basic.

Но лично мне ближе мнение Джоэля. Куда проще проверить, способен ли человек работать с указателями (тоже одна из концепций, требующих винтиков в голове) и не брать тех, кто не способен.

stenfОткуда-же я знаю, наверно это их и стоит спросить. Собственно, может где-то это уже и опубликовано, если это является таким ценным алгоритмом
Ну спросите. Я же почему-то думаю, что ценным алгоритмом это не является :)

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

stenfВот. Представляете теперь, какой кошмар мог-бы произойти, если-бы там еще и null были ?
Наоборот. Если бы там были null, этих 50.000 левых записей просто не было бы. Они висели исключительно для того, чтобы внешние ключи куда-то ссылались.

stenf softwarer
Если мы хотим подарить бесплатные минуты, это должно быть учтено в структуре БД

Вы не поняли мой пойнт. В первоначальных требованиях никаких бесплатных минут могло и не быть.
Это Вы не поняли, что я Вам сказал. Если в первоначальных требованиях бесплатных минут нет, а теперь они появляются, их надо адекватным образом встроить в структуру БД. В том числе в бизнес-правила. А любого, кто попробует как предлагаете Вы, "вот здесь хакнем данные, и ничего страшного не случится" следует распять на двери отдела тестирования.

stenf softwarer
Если мы начинаем корежить данные с целью добиться нужного результата, это не "безобидная шалость", а "одна из самых больших проблем, какие только можно создать".

не понял, как корежить ?
Так, как Вы предлагаете. Вольный пересказ Вашего предложения: "есть система, где дебет сходится с кредитом и нет бесплатных минут. Мы хакаем данные, добавляя бесплатные минуты, а то что дебит при этом разойдется с кредитом так нестрашно".

stenfЯ не знаком с разработкой систем для банков,
При чем тут банки?

Счет в данном контексте - это такой документ, который выставляется покупателю товаров или услуг.

stenfно со стороны такое решение напоминает удаление гландов через задницу. Такие "хитрожопые" решения опять-таки усложняют сопровождение, что плохо по определению.
В моей системе я не собираюсь допускать существование детали "подвешенной в воздухе".
Безусловно, плохо. И я упомянул это только для того, чтобы объяснить: даже в плохих ситуациях система при этом выживает.

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

stenf softwarerCуществование "физической реальности" - это тоже заблужение :)
ну надо-же во что-то верить, я предпочитаю верить в обьективную реальность вокруг меня :)
Видите ли в чем фокус, объективная реальность вокруг Вас не то чтобы однозначно связана с тем, что Вы проектируете. Вы проектируете виртуальный мир, и как он отображается на реальный и наоборот - вопрос Вашего выбора, ничего более.

Как я люблю говорить, если с точки зрения предметной области удобно пользоваться абстракцией "пьяный розовый слон" - надо ввести соответствующую сущность, хотя в реальном мире такие особо не встречаются.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234475
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Ничего страшного в наличии такого атрибута у изделия нет

Я Вам русским по белому написал: это ошибка. У изделия нет и не может быть такого атрибута. Ни в виде примечания, ни в каком-либо другом виде, ни для "внутреннего" заказчика, ни для какого-то еще.

В общем, резюме: воспользуйтесь разделом "работа" и наймите нормального архитектора. Он разжует Вам, что такое BOM и как он реализовывается.
...
Рейтинг: 0 / 0
Ловушка 22
    #34234656
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621
Я Вам русским по белому написал: это ошибка. У изделия нет и не может быть такого атрибута.

в таком случае для начала напишите что вы понимаете под заказчиком и где он должен находиться
softwarer
Can you make тынц?

похоже под "цитированием" вы имели ввиду Дейта&Co., в том абзаце помимо Дейта были также цитаты ваших предложений
softwarer
Значит, RDBMS и SQL не должны применяться в программировании. Сказанное мной - не моя придумка, а широко известный факт. Есть люди, которые просто не понимают декларативного подхода

смешно, но вы сейчас чуть не слово в слово цитируете так не любимого вами Джо Селко. Обвинения программистов в попытках, при программировании на SQL, мыслить в процедурных или объектно-ориентированных терминах вместо декларативных является его любимой фишкой.
Однако мой пост был направлен на вашу идею о спецвинтиках в голове для использования null
softwarer
Ага. Стандартный подход программиста на Visual Basic.

Но лично мне ближе мнение Джоэля. Куда проще проверить, способен ли человек работать с указателями (тоже одна из концепций, требующих винтиков в голове) и не брать тех, кто не способен.

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

пока что, вы четко указали только их недостатки, а про достоинства написали какие-то туманные мысли, что "на практике без них жутко неудобно".
softwarer
Вольный пересказ Вашего предложения: "есть система, где дебет сходится с кредитом и нет бесплатных минут. Мы хакаем данные, добавляя бесплатные минуты, а то что дебит при этом разойдется с кредитом так нестрашно

Can you make тынц? (C) на подобные мои высказывания ? Особливо про "хакнуть данные" please.
Даже в страшном сне мне не могла приснится такая интерпретация моих постов
softwarer
Вы изначально хотели вещь куда хуже. Зацикливание.

нэправда. Ничего подобного я не хотел. Я показал проблему спросил, как именно с ней лучше поступить.
softwarer
Видите ли в чем фокус, объективная реальность вокруг Вас не то чтобы однозначно связана с тем, что Вы проектируете. Вы проектируете виртуальный мир, и как он отображается на реальный и наоборот - вопрос Вашего выбора, ничего более.

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

тут есть важная оговорка, в связи с тем, что сопровождать пьяного розового слона придется другим программистам, необходимо что-бы всем остальным такая абстракция тоже казалась очевидной, иначе вы достигаете прямо противоположного эффекта.
А так как такие слоны в реальном мире не водяться, то у разных людей будет свое представление о розовых слонах и их повадках, и следовательно в первом приближении такая абстракция не то, что-бы хорошая идея.
Хотя теоретически любая метафора способна помочь, надо все-таки... поаккуратнее что-ли быть
...
Рейтинг: 0 / 0
Ловушка 22
    #34235124
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf iscrafm
Размер же листа не должен его волновать

еще как волнует. Выбор листа полностью на совести технолога, потому-что иначе кто собственно будет этот лист выбирать ?

технолог. только не на этом этапе. Вы про уникальное производство что-ли говорите, когда каждый заказ уникальный?
...
Рейтинг: 0 / 0
Ловушка 22
    #34235310
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafm
технолог. только не на этом этапе.

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

iscrafm
Вы про уникальное производство что-ли говорите, когда каждый заказ уникальный?

да, каждый заказ уникален, опытное производство. Т.е. конечно вполне может быть, что в запуск идет сразу несколько экземпляров изделия, но они все равно в системе должны считаться уникальными, потому-что в любой момент у одного из изделий могут провести изменения, и это не должно касаться остальных.
...
Рейтинг: 0 / 0
Ловушка 22
    #34235537
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, ища материал для тынца, нашел у Вас замечательную фразу, ранее несправедливо пропущенную:

stenfСамой базе будет глубоко фиолетово, если на счет не поступят деньги, списанные с другого счета.
Вот! Это страшная, недопустимая точка зрения, и именно поэтому Вы думаете, что foreign key - основа.

Поймите, данные - не просто "самое ценное, что есть в базе". Это на самом деле единственная ценность, которая там есть. Неверные данные - куда хуже неверной структуры. Смотря с точки зрения "самой базы", Вы выступаете с точки зрения небезызвестного персонажа Райкина, вопрошавшего: "к пуговицам претензии есть?".

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

stenfсмешно, но вы сейчас чуть не слово в слово цитируете так не любимого вами Джо Селко.
Вы переоцениваете мое к нему внимание.

Я цитирую общеизвестный факт, чуть менее общеизвестный, нежели "солнце встает на востоке". То, что его цитирует еще и некто Селко, мало что меняет.

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

stenfпоздравляю, вы движитесь против основных течений в современном программировании.
Есть одна старая и довольно известная фраза:

Hе иди по течению, не иди против течения, иди поперек него, если хочешь достичь берега.

Лично я полагаю еще более правильной следующую концепцию:

Hе иди по течению, не иди против течения, иди туда, куда тебе надо.

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

Пытаться обходиться без null можно по-разному. Например, наиболее корректным путем будет введение дополнительных сущностей; "необязательность" будет выражаться отсутствием строки в этой дополнительной таблице. Подход плох несколькими вещами: во-первых, большим количеством ненужных join-ов, во-вторых, тем, что надо постоянно помнить о необходимости использовать с этой таблицей outer join, наконец, в лишних тратах на эти дополнительные таблицы.

stenfCan you make тынц? (C)
Странно Вы как-то поступаете. Мою просьбу не выполняете, но сами тут же просите то же самое.

stenfна подобные мои высказывания ? Особливо про "хакнуть данные" please.
Даже в страшном сне мне не могла приснится такая интерпретация моих постов
Давайте смотреть. Ваши слова, в контексте обсуждения бизнес-правила соответствия дебета кредиту:

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

Это я и называю "хакнуть". В противовес нормальному подходу: учесть новое требование и доработать под него систему.

stenfнэправда. Ничего подобного я не хотел.
"Сознательно не хотели". Комплекс выдвинутых Вами требований не оставлял другой возможности, строго математически.

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

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

stenfА так как такие слоны в реальном мире не водяться, то у разных людей будет свое представление о розовых слонах и их повадках, и следовательно в первом приближении такая абстракция не то, что-бы хорошая идея.
Ох, а уж какая не то чтобы хорошая идея, например, "аналитического счета".....
...
Рейтинг: 0 / 0
Ловушка 22
    #34235899
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 stenf
Вспоминаются времена, когда ссылка на В.И.Ленина была истиной в последней
инстанции.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ловушка 22
    #34236019
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mv
2 stenf
Вспоминаются времена, когда ссылка на В.И.Ленина была истиной в последней
инстанции.
Эти времена для некоторых и поныне продолжаются, даже здесь, на форумах sql.ru :(
Вот здесь , например, на предложение проверить необоснованное утверждение, человек отвечает "Желаете проверить - я предложил вам алгоритм, а лично я доверяю Хендерсону." или "Кто не доверяет, тот пусть и проверяет. И результат в студию доставляет"...
stenfЕсли вы вдруг не в курсе, программы в общем случае не должны содержать нестандартных ходов и решений, а концепция любимых вами указателей как таковых и вообще убрана к примеру из .NET, ибо они привносит массу проблем.
...а в версию 2.0 добавлены нелюбимые вами nullable-типы, наверное из вредности (дескать, маловато проблем осталось ;)

5 копеек по теме:
проблемы наподобие этих - " хотелось-бы все-таки обеспечить ссылочную целостность структурой базы, а не хитрыми финтами ушей " (в ответ на " Пробивать информацию в два приема: insert в изделия - insert в детали - update изделий с установкой id детали .")
или
" Но как в этом случае занести запись в Детали, ведь там должна быть ссылка на изделие, т.е. в случае нулевой сборки на то-же ID, что имеет сама деталь, а в момент вноса он еще неизвестен ."
и т.п. могут быть
1) техническими, т.е. "...а в момент вноса он еще неизвестен" только потому, что используется такой механизм identity, значит, решение может быть в использовании другого механизма получения значений ИД...; "...ссылочную целостность структурой базы..." - использовать nulls, и т.д.
2) логическими, т.е. "...а в момент вноса он еще неизвестен." потому как бизнес-процесс таков, т.е. целостность достигается "в два такта", значит, нужно "легализовать" состояние между тактами, например, добавить соответствующее значение для статуса записи - "недовведенная/неправильная/неинициированная/неактуальная", ну и соответствующее отношение к записям с таким статусом...
...
Рейтинг: 0 / 0
Ловушка 22
    #34236020
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> в таком случае для начала напишите что вы понимаете под заказчиком
> и где он должен находиться

Дружище, все, что я хотел написать, я написал: форум "работа" - максимум, что можно порекомендовать в Вашей ситуации. Вы занимаетесь не своим делом.
...
Рейтинг: 0 / 0
Ловушка 22
    #34237574
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621
Дружище, все, что я хотел написать, я написал

ага, написать что такое заказчик вы не можете, зато можете давать советы космического масштаба и космического-же идиотизма (С)
mv
Вспоминаются времена, когда ссылка на В.И.Ленина была истиной в последней инстанции.

есть два варианта появления данного поста
1) Вам просто так вдруг вспомнился Ленин
2) Вы намекаете, что не всегда можно верить публикациям.

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

softwarer
Я такой идеи не выдвигал, с чего Вы ее взяли - не знаю

читаем:
softwarer
Концепция null не "неверна", она "гениальна". Другой вопрос, что как и реляционная теория вообще, для удачного применения она требует некоторого особенного понимания, взгляда на мир, некоего особого винтика в мозгу, который, к сожалению, некоторым просто не дан.

хотите поупражняться в лексическом разборе предложения? Вопрос из четвертого-пятого класса общеобразовательной школы - к какому существительному относиться выделенное слово "она" ?
softwarer
Лично я полагаю еще более правильной следующую концепцию:

Hе иди по течению, не иди против течения, иди туда, куда тебе надо.

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

Блин. Дело-то не в процессе описания, а процессе сопровождения этого описалова.
softwarer
доставляющее уйму проблем при попытке описать его каким-либо другим образом

про уйму проблем пожалуйста поподробнее.
softwarer
Подход плох несколькими вещами: во-первых, большим количеством ненужных join-ов, во-вторых, тем, что надо постоянно помнить о необходимости использовать с этой таблицей outer join, наконец, в лишних тратах на эти дополнительные таблицы

softwarer, при всем к вам уважении это - детские аргументы. Вам что, join'ны не нравяться ? Они - основа всей теории. Может тогда и нормализацию не производить, она знаете тоже к join'нам приводит ?
У вас какая-то избирательная любовь к теории - тут люблю, тут не люблю. Join'ы при нормализации это нормально, а вот при null - нет.
Null между прочим тоже не бесплатный, серверу приходиться тратить на сопровождение столбца null определенное количество ресурсов.
softwarer
То есть, Вы строите ситуацию: есть бизнес-правило, мы хотим "подарить бесплатные минуты", бизнес-правило этому препятствует. И общий контекст - это бизнес-правило нестрашно нарушить, вот один из примеров, когда нарушить его можно и нужно.

Это я и называю "хакнуть". В противовес нормальному подходу: учесть новое требование и доработать под него систему.

в том примере было лишь показана разница между бизнес-правилами: те, которые вероятно в будущем изменяться, и те, которые железно будут действовать, ибо того требует логика реальности, а не бизнес заказчика ;)
softwarer
Вот! Это страшная, недопустимая точка зрения, и именно поэтому Вы думаете, что foreign key - основа.

Поймите, данные - не просто "самое ценное, что есть в базе". Это на самом деле единственная ценность, которая там есть. Неверные данные - куда хуже неверной структуры. Смотря с точки зрения "самой базы", Вы выступаете с точки зрения небезызвестного персонажа Райкина, вопрошавшего: "к пуговицам претензии есть?".

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

Вы говорите парадоксами.
То отвергаете теоретически верные аргументы на той-лишь основе, что высказаны они Селко/Хендерсоном/Дейтом etc, а они вовсе и не авторитеты для вас, то показываете пальцем на неверные (по вашему) метафоры и говорите - видите там гланды через задницу удаляют ? Значит и я так поступать имею право - все из окна прыгают, и я туда-же
...
Рейтинг: 0 / 0
Ловушка 22
    #34237664
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> ага, написать что такое заказчик вы не можете

Дружище, у меня нет ни малейшего желания гадать, какой дебил что под этим подразумевал. Я не могу всем ламерам подряд читать курс проектирования: ни времени, ни желания.
...
Рейтинг: 0 / 0
Ловушка 22
    #34237846
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот один из минусов форумов как раз в том, что здесь тусуется масса людей с непролеченным комплексом неполноценности, уверенными что они являются гигантами мысли современности, однако неспособные ответить на элементарные вопросы и срывающиеся на тупые оскорбления и флейм когда им на это указывают
...
Рейтинг: 0 / 0
Ловушка 22
    #34238677
kittn2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfвот один из минусов форумов как раз в том, что здесь тусуется масса людей с непролеченным комплексом неполноценности, уверенными что они являются гигантами мысли современности, однако неспособные ответить на элементарные вопросы и срывающиеся на тупые оскорбления и флейм когда им на это указывают

Смею предположить с точностью до наоборот. "Проектирование БД" на скуль.ру - единственный форум в рунете, где буйволы, саблезубые тигры и тиранозавры БД сносят друг другу рога, копыта и прочие части тела.

Ну, я же конечно, мелкий домашний кот, которому непонятны слова "датамологическая модель", "Селко".

Однако мне плевать. По сабжу выходит, что естественной для для представления заданых данных является сетевая модель. Сетевая модель - это даже не дерево. Это сильно запутаный симбиоз деревьев. Можно реализовать это в РМД, если известно, что число поколений потомков будет фиксировано. Можно - если даже не будет фиксировано. Но это такой геморой! Честно говоря, я не вижу приемлемого решения в рамках РМД. Есть там нул, нет там нул - неважно.
И я честно об этом говорю, а не перевожу дискуссию в сравнение знаний друг друга.
Одно радует. В рамках задачи вроде нет агрегатных функций, Тогда, действительно можно написать сетевую базу. Однако надо помнить, что в свое время они померли из-за своей уникальности и непереносимости на другие предприятия, от того, что их поддержка требовала слишком большого на тот момент труда большого количества высококвалифицированных специалистов.

Время идет и написать это уже можно. Работать будет медленнее, чем РБД, но будет адекватно отражать состояние.
Впрочем, вроде Оракл умеет делать рекурсивные запросы и на нем можно будет реализовать сетевую модель? Не знаю, не пробовал.
...
Рейтинг: 0 / 0
Ловушка 22
    #34238751
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дружище stenf, поверьте на слово, я дал лучший совет из возможных. Во-первых, Вы будете избавлены от решения задач, в которых ровным счетом ничего не понимаете. Во-вторых, нормальный архитектор заработает на решении Вашей задачи немного денег. В-третьих, Вы будете иметь возможность внимательно изучить его работу и не задавать более идиотских вопросов. Ы?
...
Рейтинг: 0 / 0
Ловушка 22
    #34238760
kittn2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621. Гм. Я считаю себя архитектором и тоже вижу пугру в первоначальной постановке задачи stenf'ом, но на то и ахитектор и/или системный аналитик, что бы вытрясти из заказчика, что ему надо на самом деле. Но я бы рискнул проектировать это только за очень большие бабки. И только с авансом. И никак не на форуме.
...
Рейтинг: 0 / 0
Ловушка 22
    #34238761
kittn2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf. Извини. Я не теоретик. Просто я пургу нутром чую.
...
Рейтинг: 0 / 0
Ловушка 22
    #34238937
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Я считаю себя архитектором

Смелое заявление. Хотите пару-тройку простеньких вопросов, чтобы хм... чуть поколебать Вашу самооценку? ;)

Я не могу назвать архитектором ни одного из авторов, пишущего в разделе "проектирование" на sql.ru (по крайней мере, пишущего последние пару лет). Человек пять - семь имеют подготовку на приемлемом уровне, остальные - коматозное ламо, в лучшем случае выросшее из dba. Архитектор - это как маркер универсальной квалификации; как правило, обычный разработчик специализируется на определенных задачах (причем, большинство - на тупых задачах типа учетных; не потому, что разработчики глупые, а потому, что за решение этих задач в России стабильно платят). Я не встречал здесь ни одного теоретического обсуждения, связанного с проектированием. Хм... хотя нет, одно все-таки было. С абсолютно тупым тезисом, что теория множеств решает все проблемы нормализации (или что-то в этом роде). В общем, туго в России с проектированием. Так что к позиционированию "Я считаю себя архитектором" я склонен относиться подозрительно. ;)

> я бы рискнул проектировать это только за очень большие бабки

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

> И никак не на форуме.

Напрасно. Видите ли, в чем дело: проектированию баз данных в принципе нигде не учат. Хорошее, качественное проектирование - оно где-то на стыке кучи дисциплин. Есть фундаментальная вещь - "Введение в системы..." Дейта, но она - об основах проектирования. Практически ни слова о наиболее важных приемах и методах. Так вот форум - универсальное средство для контактов.
...
Рейтинг: 0 / 0
Ловушка 22
    #34239159
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621
Дружище stenf, поверьте на слово, я дал лучший совет из возможных

давай давай, дружище профессиональный архитектор, идите к доктору. Он вам обьяснит причины появления столь настойчивого желания помогать.
...
Рейтинг: 0 / 0
Ловушка 22
    #34239354
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> профессиональный архитектор

Я - не профессиональный архитектор, Вас кто-то обманул.

А вот Вы, к сожалению, просто обычный хам. Куча амбиций и ноль знаний. Ничего личного.
...
Рейтинг: 0 / 0
Ловушка 22
    #34239500
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тоже ничего личного, но я по крайней мере здесь никого дебилами не обзывал, так что кто здесь хам - это еще посмотреть надо.
И вообще, ну не хотите постить по теме - ну так вообще не постите, поверьте, у меня нет никакого желания тут с вами переругиваться
...
Рейтинг: 0 / 0
Ловушка 22
    #34240221
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfчитаем:
Виноват, очень неудачно сформулировал, и Вы вполне правы, восприняв это утверждение именно так, как сказали выше. Прошу далее не учитывать эту цитату, попробую объяснить поудачнее.

null требуют того же самого винтика, что и sql вообще. Они упрощают работу в "sql-стиле" и усложняют работу в алгоритмическом стиле.

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

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

stenfБлин. Дело-то не в процессе описания, а процессе сопровождения этого описалова.
В том числе. Простую и естественную модель сопровождать куда проще и удобнее, нежели искусственную и сложную.

stenfпро уйму проблем пожалуйста поподробнее.
Хм. Видите ли, способов обойтись без null можно придумать много, проблемы соответственно в разных случаях разные. Перечислить все - пожалуй, черезчур много текста. Так что пожалуйста выделите тот путь, который нравится Вам, обсудим его.

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

stenfsoftwarer, при всем к вам уважении это - детские аргументы. Вам что, join'ны не нравяться ? Они - основа всей теории. Может тогда и нормализацию не производить, она знаете тоже к join'нам приводит ? У вас какая-то избирательная любовь к теории - тут люблю, тут не люблю.
Видите ли в чем дело, если смотреть на теорию фрагментарно, чужие взгляды заведомо покажутся фрагментарными.

Нормализация - часть теории. Денормализация - другая часть. Истина - посередине. Мне нравятся "правильные join-ы на своем месте" и не нравятся "неправильные join-ы там, где они вредны". Лично мне этот подход кажется вполне целостным.

Join - механизм с определенными потенциальными возможностями и определенной стоимостью. Его следует применять там, где он дешевле альтернатив, и не следует применять там, где траты на него неоправданны.

stenfJoin'ы при нормализации это нормально, а вот при null - нет.
В целом так. Нормализация дает серьезные преимущества, и цена join-а в большинстве случаев является более чем адекватной платой за них. Отказ от null-ов в данном варианте не дает преимуществ, сравнимых с ценой.

stenfNull между прочим тоже не бесплатный, серверу приходиться тратить на сопровождение столбца null определенное количество ресурсов.
Охх. Вот это уже детский аргумент.

Цена null, если говорим о серверных ресурсах - один байт (иногда ноль, но не будем углубляться), и соответственное время на чтение-анализ. Цена лишнего join-а - как минимум лишний full index scan, далее зависит от плана запроса, но в любом случае траты просто несравнимы.

stenfв том примере было лишь показана разница между бизнес-правилами: те, которые вероятно в будущем изменяться, и те, которые железно будут действовать, ибо того требует логика реальности, а не бизнес заказчика ;)
Как я Вам показал (на примере счетов, оторванных от банков) таких вот "железно будут действовать" не существует.

Но вопрос не в этом. Вероятность изменения того или иного бизнес-правила никак не связана с тяжестью при его нарушении, а напомню, обсуждаем мы именно последнее.

stenfпо сути, вышеприведенный ответ годиться и тут. Если бизнес-правило это позволяет, то неверными эти данные нельзя считать.
Еще раз, медленно и печально: бизнес-правило этого не позволяет. И Ваши фантазии на тему "в будущем бизнес-правила могут измениться так, чтобы позволять" не имеют отношения к сегодняшним проблемам, к проблеме разрушенных, бесполезных и даже вредных данных.

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

Вы говорите парадоксами.
То отвергаете теоретически верные аргументы на той-лишь основе, что высказаны они Селко/Хендерсоном/Дейтом etc, а они вовсе и не авторитеты для вас, то показываете пальцем на неверные (по вашему) метафоры и говорите - видите там гланды через задницу удаляют ?
Парадоксами?

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

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

Да, лучше. Но не всегда возможно. И подобное... примитивное восприятие теории, к сожалению, оказывается слишком уж непрактичным.

stenfЗначит и я так поступать имею право - все из окна прыгают, и я туда-же
Cтоп-стоп-стоп. Это Вы, пардон, все время апеллируете к "современным течениям в программировании" и прочим "все из окна прыгают". Я сказал строго наоборот - "иди туда, куда тебе надо". Будет нужно для задачи - прыгну из окна, не будет нужно - не прыгну.
...
Рейтинг: 0 / 0
Ловушка 22
    #34240930
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfЛюбая концепция, требующая особых винтиков в голове не должна применяться в программировании, потому-что это усложняет сопровождение программ и является потенциальным источником ошибок.
Категорически несогласен. Программирование требует не то, что особых винтиков - требует особый взгляд на вещи вообще. И если ты не понимаешь какую-то технологию, это не повод на неё плевать и идти восторгаться дотнетом. Я не понимаю указателей, я не понимаю ООП, но нутром чую, что это круто и стараюсь понять. Я много писал на php, которое вообще ничего не требует и меня тошнило.

ОФФ:
softwarer"опытный гонщик и на запорожце опередит ламера на субару". :)
Не опередит, конечно же!
...
Рейтинг: 0 / 0
Ловушка 22
    #34241576
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Frankie
И если ты не понимаешь какую-то технологию, это не повод на неё плевать и идти восторгаться дотнетом. Я не понимаю указателей, я не понимаю ООП, но нутром чую, что это круто и стараюсь понять. Я много писал на php, которое вообще ничего не требует и меня тошнило.

дело не в технологии, а в относительной сложности применяемых технологий.

softwarer
Они упрощают работу в "sql-стиле"

ну как-же упрощают, когда наоборот усложняют ? Для разнообразия, могу привести цитату другого "столпового" автора данной тематики - Кален Дилейни:
"As you know, I strongly recommend that you minimize the use of NULL... introducing NULL will be a source of bugs just waiting to happen"
softwarer
Дружище, рассказывать банальности так, чтобы они приходились к месту - большое искусство, и в нем у Вас еще есть, куда расти.

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

странные вы вещи говорите, гражданин softwarer. Хорошо, давайте проследим источник последней "банальности".

softwarer: Другой вопрос, что как и реляционная теория вообще, для удачного применения она требует некоторого особенного понимания, взгляда на мир, некоего особого винтика в мозгу, который, к сожалению, некоторым просто не дан.
->Вы правда сказали, что здесь неправильно сформулировали свою мысль, однако в данном контексте это пока неважно

stenf: Любая концепция, требующая особых винтиков в голове не должна применяться в программировании, потому-что это усложняет сопровождение программ и является потенциальным источником ошибок. Это как множественное наследование в ООП, может и хорошее изобретение, расширяющее возможности программиста, только вот например Steve McConnell (не дай бог скажите что теоретик) советует держаться подальше от такого счастья (stenf)

softwarer: Ага. Стандартный подход программиста на Visual Basic.
Но лично мне ближе мнение Джоэля. Куда проще проверить, способен ли человек работать с указателями (тоже одна из концепций, требующих винтиков в голове) и не брать тех, кто не способен.


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

softwarer: Hе иди по течению, не иди против течения, иди туда, куда тебе надо.

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

softwarer
stenf
softwarer
Прежде всего я сказал, что они позволяют легко и естественно описать взаимоотношение "необязательности"

Блин. Дело-то не в процессе описания, а процессе сопровождения этого описалова.

Простую и естественную модель сопровождать куда проще и удобнее, нежели искусственную и сложную.

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

почему-же не будем углубляться, раз аргумент трата ресурсов на лишние join'ы является козырем вашей аргументации, так давайте копнем туда.
Копать будем в SQL Server 2000. В данной реализации, количество израсходованных байт под битовую маску, описывающую какие столбцы позволяют null, действительно не зависят от того, какие столбцы позволяют null - она есть всегда, для любой таблицы, в независимости есть-ли там nullable столбцы.
Зато если столбец позволяет null, то для каждой обрабатываемой строки столбца сервер должен декодировать маску, что-бы определить, есть-ли там null. Делается это не за счет доброго дяди, а за счет ресурсов компьютера. Хотя безусловно, для одной строки это является каплей в море.
Дальше в качестве примера я возьму тему данного топика, к счастью она хорошо тут подходит:
Предположим, что вместо null я применил "извращенный" вариант с еще одной таблицей, и теперь для получения данных об изделии требуется лишний join.
В нашей системе таблица Детали является одной из ключевых, с ней работают буквально все модули системы (производственный, технологический и т.п.). Пользователи этих модулей постоянно делают запросы к базе вида "покажи все детали изделия", "покажи входимость деталей изделия" и т.п.
Однако при этом их не интересуют параметры изделия как такового, эти параметры запрашиваются приложением автоматически при его запуске, что происходит обычно один раз в день . Таким образом, лишний join к промежуточной таблице будет происходить 1 раз в противовес бесчисленным запросам к таблице Детали на протяжении 8 часов рабочего дня. (в реальности это реализовано не совсем так, но для иллюстрации сгодиться).
Возможно, эти затраты все равно не перекроют этот join, однако говорить об несравнимых затратах я бы уже не стал.

Грубо говоря, ваша идея не учитывает случаи, когда количество лишних join'ов много меньше общих обращений к таблице.

Что еще более плохо, запрос на получение всех деталей изделия теперь вместо простого select * from Детали where IDИзделия = 21 может быть составлен как select * from Детали where coalesce(IDИзделия, IDДетали) = 21 из-за необходимости учета нулевой сборки, и помимо усложнения его синтаксиса мы еще и можем получить index scan вместо index seek
softwarer
Цена лишнего join-а - как минимум лишний full index scan

тут не понял, почему обязательно scan, а не seek ?

И еще по null'ам: я уже говорил, что согласен с тем, что полное избавление то null - это крайний случай. Например мне кажется логичным высказываение одного из "столпов" (не помню какого), что если-уж применять их, то в случаях, когда в текущий момент времени значение поля неизвестно, но обязательно появиться в будущем. Например у меня в системе каждая производственная партия деталей рождается с null в поле IDТехнологии (ссылки на технологию производства данной партии). Но это лишь потому, что через несколько дней/недель эта ссылка там появиться. Перманентное-же существование null мне не кажется оправданным.
softwarer
Как я Вам показал (на примере счетов, оторванных от банков) таких вот "железно будут действовать" не существует.

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

Раз уж цитируете, то цитируйте до конца - "необходимо, чтобы абстракция казалась очевидной и другим людям "

;) Откуда у вас такая уверенность, кто из нас вляпался ?
Приведу еще одну цитату: "Метафоры имеют одно неоспоримое достоинство - описываемое ими поведение предсказуемо и понятно всем людям. Это сокращает объем ненужной коммуникации, способствует достижению взаимопонимания ..." (Fernando J. Corbaty, процитирован С. Макконнеллом).
Ваш розовый слон в общем случае не обладает предсказуемым (с точки зрения других людей) поведением, и не сокращает объем коммуникации. Прямо скажем, все как раз наоборот.
Даже с очевидными и ясными метафорами возникают проблемы, потому-что метафора по определению описывает лишь часть свойств объекта, и надо четко представлять себе, какие из свойств реального объекта не следует принимать во внимание. Когда-же метафора ничуть не яснее чем описываемый логический обьект - то она только мешает. К примеру, я могу думать, что розовый слон розовый, потому-что чем-то болеет и его надо отвести к ветеринару, а кто-то другой подумает, что розовый цвет объясняется розовыми цветами, на которых этот слон пасется. Реальная-же причина запрятана у вас в голове и может означать что-то совсем другое.
softwarer
Если Вы считаете, что проводки - это "удалять гланды через задницу", я уверен, тысячи присутствующих здесь с громадным удовольствием выслушают рассказ о превосходящих альтернативных решениях

ну и напрасно вы тут так злорадничаете, я понятия не имею что такое проводка. Вы сами сказали, что эта абстракция неочевидна. Однако если вы хотите этим оправдать появление на свет вашего еще менее очевидного слона - то вы на неверном пути
...
Рейтинг: 0 / 0
Ловушка 22
    #34243516
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf softwarerОни упрощают работу в "sql-стиле"
ну как-же упрощают, когда наоборот усложняют ?
Так. Упрощают.

stenfДля разнообразия, могу привести цитату другого "столпового" автора данной тематики - Кален Дилейни:
Хм. Скажите, а Вас не затруднит приводить кого-нибудь кроме MSSQL-щиков? Во-первых, я мало знаком с ними, во-вторых, безоговорочно доверять им я готов исключительно в вопросах внутренней архитектуры MSSQL.

stenf "As you know, I strongly recommend that you minimize the use of NULL... introducing NULL will be a source of bugs just waiting to happen"
Я не готов оценивать фразу, не зная подразумеваемого для нее контекста. Скажем, ее вполне можно сопоставить известной привычке MSSQL-щиков писать несколько простых запросов вместо одного сложного, связывая их процедурным кодом.

stenf softwarerДружище, рассказывать банальности так, чтобы они приходились к месту - большое искусство, и в нем у Вас еще есть, куда расти.
хм, вы по совместительству литературный критик ? Не люблю, когда меня критикуют люди, заведомо ничего не понимающие в предмете своей критики.
Помилуйте, откуда же "литературный"? Вы пересказали банальность из книги, пересказали ее совершенно не в кассу; чтобы "критиковать" Вас за это, незачем быть Виссарионом Григорьевичем, достаточно понимать суть предмета обсуждения.

stenfКакой вывод напрашивается из данных цитат ?
Эту тему я даже специально упомянул в своем FAQ: http://softwarer.ru/about.html#Derivations

stenfА такой, что вы предпочитаете действовать по принципу "зачем делать просто, когда можно сложно.
Дружище, если из всего многообразия "иди куда нужно" Вы видите одно-единственное направление движения - это шоры Вашего мышления, ничего более. И в строгом соответствии с предыдущей ссылкой выдаете это как "мне сказали именно это".

stenfАналогия с футбольной командой вполне к месту.
Аналогия с футбольной командой вполне к месту в почти любом обсуждении командной работы. Само обсуждение командной работы здесь абсолютно не к месту. Кроме того, уж простите, слушать пересказ из книг того, что Вы сами не пробовали, мне не очень интересно.

stenfвообще-то, если легко и естественно описать не обязательно получиться простая и естественная модель .
Вы хотите поспорить о формальной логике? Можно в принципе, хотя лениво. А если неформально, то "практически обязательно". Чтобы получилась "непростая и неестественная", надо описывать не "легко и естественно", а "тупо и формально", что отнюдь не синонимы.

stenfКопать будем в SQL Server 2000.
/me борется с желанием произнести что-нибудь типа "брось бяку" ;-)

stenfЗато если столбец позволяет null, то для каждой обрабатываемой строки столбца сервер должен декодировать маску, что-бы определить, есть-ли там null. Делается это не за счет доброго дяди, а за счет ресурсов компьютера. Хотя безусловно, для одной строки это является каплей в море.
Это для любого количества строк является каплей в море. "Декодирование маски" делается парой ассемблерных команд; поверьте, трудно найти задачу, которую компьютер решает эффективнее. Разница лишь в том, что для некоего "разумного количества строк", например до 10.000.000, это будет "капля в море вообще, в абсолютных числах", а для большего количества - "капля в море относительно других операций, которые придется провести с теми же данными".

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

Впрочем, это лирика в сторону.

stenfТаким образом, лишний join к промежуточной таблице будет происходить 1 раз в противовес бесчисленным запросам к таблице Детали на протяжении 8 часов рабочего дня. (в реальности это реализовано не совсем так, но для иллюстрации сгодиться). Возможно, эти затраты все равно не перекроют этот join, однако говорить об несравнимых затратах я бы уже не стал.
Хм. О "несравнимых затратах в данном конкретном случае".

Оптимизация - такая вещь, что для любого случая можно сконструировать обратный. Скажем, несложно построить пример, в котором для запроса вида SELECT * FROM TABLE WHERE ID = :ID предпочтительным методом доступа будет FULL TABLE SCAN, а индекс пойдет нервно курить в сторонке.

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

stenfГрубо говоря, ваша идея не учитывает случаи, когда количество лишних join'ов много меньше общих обращений к таблице.
В первую очередь: я не знаю MSSQL и могу ошибиться, но мне кажется, Вы в своем рассуждении проглядели одну маленькую подробность. Если типичный запрос не пользуется данными пристыковочной таблицы, в случае одной таблицы он также не будет лезть "декодировать маску" для этих данных и соответственно не будет тратить на это ресурсы. Таким образом, Ваш пример сводится к противопоставлению в запросе "один раз в сутки", где join скорее всего также проиграет.

Хм. "Моя идея" относится к статистически значимой выборке. Скажем, "что будет, если взять случайную систему, и в ней во всех местах - а не в одном-единственном, как в Вашем примере - заменить null поля введением дополнительных таблиц". Я - так уверен, что с малоотличимой от единицы вероятностью система замедлится.

stenfЧто еще более плохо, запрос на получение всех деталей изделия теперь вместо простого select * from Детали where IDИзделия = 21 может быть составлен как select * from Детали where coalesce(IDИзделия, IDДетали) = 21 из-за необходимости учета нулевой сборки, и помимо усложнения его синтаксиса мы еще и можем получить index scan вместо index seek
Этого, пардон, я совершенно не понял. Собственно, сама по себе фраза coalesce(IDИзделия, IDДетали) говорит о кривой структуре данных (несравнимые вещи сводятся под одной крышей). О какой структуре данных идет речь? К сожалению, я не имею представления, что такое "нулевая сборка", но в любом случае прежде всего - нарисуйте, пожалуйста, какую структуру Вы сравниваете, и с какой.

Ну а в целом - ответ тот же, что и про оптимизацию. В любом случае, можно подобрать структуру БД и профиль запросов, отвратительно соответствующие друг другу. Но из этого ничего особенного не следует.

stenfтут не понял, почему обязательно scan, а не seek ?
Не то чтобы "обязательно", подразумевался запрос ко всем данным таблицы. Запросы к одной записи всегда отрабатывают быстро, если их не слишком много, говорить об эффективности подхода применительно к таковым смысла мало.

Соглашусь, к сожалению я небрежен в нашем разговоре. Прощу простить за это, к сожалению много отвлекающих факторов.

stenfНапример мне кажется логичным высказываение одного из "столпов" (не помню какого), что если-уж применять их, то в случаях, когда в текущий момент времени значение поля неизвестно, но обязательно появиться в будущем.
Cтранный подход, признаться. Не знаю, как и в каком контексте было сформулировано в оригинале, но в таком изложении - не вижу цимеса. Скажем, как провести границу обязательного появления - через две недели, или допустим через двадцать лет?

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

Итого: как Вы предполагаете правильным хранить эти данные? Скажем, задача: хранить ФИО физ. лица, дату рождения и ИНН (прочие атрибуты для экономии времени опустим). Вопрос: как правильно хранить?

stenfПерманентное-же существование null мне не кажется оправданным.
Хм. Прежде всего мне в этом случае очень странно, что считанные письма назад Вы резко нападали на "временный null", срок жизни которого исчислялся микросекундами между выполнением нескольких операторов одной транзакции, а никто другой эти данные увидеть не мог (надеюсь, у вас в системе нет грязного чтения?) Сейчас же Вы уже примиряетесь с существованием временного null со сроком жизни в несколько недель, которым успеют воспользоваться все кому не лень.

Честно говоря, это воззрение имхо показывает слабость Вашей идеологии. Почему: потому что все проблемы, которые только может доставить null, в случае "временных null" ничуть не менее страшны, нежели в случае "перманентных null". Разница между ними в лучшем случае количественная (количество бизнес-функций, работающих с "данными во временном состоянии" несколько меньше, нежели полное количество бизнес-функций системы, мест для ошибки соответственно меньше). Таким образом, получим, что есть некоторое количество временных null допустимо для системы объема X, такое же количество перманентных null вполне допустимо для системы объемом, скажем, 3*X ("вполне допустимо" означает в данном случае "доставляет не больше проблем, чем").

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

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

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

stenfНапример я, если какой-нибудь умник при сопровождении моей системы, для обхода логической проблемы оторвет детали от ссылок на изделия и напортачит с данными - сначала заставлю вернуть все на свои места, а уж затем исправлять проблемы
Правильно. А вот почему-то "умником, который хочет для обхода логической проблемы разрушить баланс и напортачить с данными" - Вы готовы выступить, во всяком случае, привели такой пример и считаете его правильным.

stenf softwarer
Вы, пардон, сказали не самую разумную вещь - "необходимо, чтобы абстракция казалась очевидной". Я привел Вам пример общеизвестной и общеиспользуемой абстракции, очевидной не являющейся. Если это для Вас парадокс - хорошо. Теперь следует правильно его оценить и уточнить теорию, на основании которой Вы в этот парадокс вляпались

Раз уж цитируете, то цитируйте до конца - "необходимо, чтобы абстракция казалась очевидной и другим людям "
Хм. Раз уж упрекайте, включайте логику. Кто у нас есть из "не других людей"? Автору абстракции - она как правило очевидна, или во всяком случае хорошо понятна, о нем речь не идет. Есть другие люди. Еще есть бог, марсиане и морские свинки; когда мы говорим о проектировании БД, эти категории "прочих" неинтересны и не обсуждаются. Кто еще есть кроме "других людей", кому "должно быть очевидно"?

Таким образом, я не убрал из Вашей цитаты ничего значимого.

stenf;) Откуда у вас такая уверенность, кто из нас вляпался ?
Вкратце уже объяснено в том, на что Вы отвечаете. Ваше утверждение противоречит практике, причем не довольно абстрактным рассуждениям о глобальных тенденциях, но практике, существовавшей задолго до программирования и процветающей до сих пор. Таким образом, чтобы обосновать свое утверждение, Вам придется пояснить, чем эта практика не верна, и самое главное - как сделать лучше.

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

stenfПриведу еще одну цитату: "Метафоры имеют одно неоспоримое достоинство - описываемое ими поведение предсказуемо и понятно всем людям.
Ха-ха-ха. Это далеко не всегда верно даже в случае таких очевидных и проработанных метафор, как элементы пользовательского интерфейса.

Это идеальная ситуация, к которой нужно стремиться, но которую в случае "всех людей" совершенно невозможно достичь.

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

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

Когда Вы придете работать с проводками - Вам потребуется обучение. Собственно, вполне стандартная практика, реализуемая в разных местах по-разному, начиная с простого рассказа "что у нас и как", через проработанную документацию и вплоть до специальных тренингов. Кстати, потребовалось бы и без розовых слонов - объем "входной информации" достаточно велик в любом случае.

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

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

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

stenfВы сами сказали, что эта абстракция неочевидна. Однако если вы хотите этим оправдать появление на свет вашего еще менее очевидного слона - то вы на неверном пути
Хм. Еще раз, медленно и печально: "проводка", "нулевая сборка", "аналитический счет", "поле комплексных чисел" и мириады других неочевидных абстракций - примеры "розовых слонов", которые появляются потому, что удобны для решения той или иной задачи.
...
Рейтинг: 0 / 0
Ловушка 22
    #34246743
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Так. Упрощают.

Я не готов оценивать фразу, не зная подразумеваемого для нее контекста.


К. Дилейни
The issue of whether to allow NULL has become an almost religious one for many in the industry, and no doubt the discussion here will outrage a few people. However, my intention isn't to engage in a philosophical debate. Pragmatically, dealing with NULL brings added complexity to the storage engine because SQL Server keeps a special bitmap in every row to indicate which nullable columns actually are NULL. If NULLs are allowed, SQL Server must decode this bitmap for every row accessed. Allowing NULL also adds complexity in application code, which can often lead to bugs. You must always add special logic to account for the case of NULL.

As you know, I strongly recommend that you minimize the use of NULL. In outer-join operations, you should carefully account for NULL values that are generated to preserve rows that don't have a match in the table being joined. And even if you're comfortable with three-valued logic, your developers and anyone querying the data using the SQL language typically won't be; therefore, introducing NULL will be a source of bugs just waiting to happen.



softwarer
Хм. Скажите, а Вас не затруднит приводить кого-нибудь кроме MSSQL-щиков?

Дейт не MSSQL-щик. Хотя нет, я забыл, он-же тоже не годиться так как. теоретик. Какая досада.
Какой барьер для цититат вы выставите в следующий раз ? Что-бы автор имел московскую прописку ?

softwarer
Вы пересказали банальность из книги

8-/ Какой книги, вы о чем вообще ? Бред какой-то. Я попросил-бы вас не бросаться высосанными из пальца догадками, да еще таким тоном. Когда я кого-то цитирую, я это явно указываю.

softwarer
Дружище, если из всего многообразия "иди куда нужно" Вы видите одно-единственное направление движения - это шоры Вашего мышления, ничего более. И в строгом соответствии с предыдущей ссылкой выдаете это как "мне сказали именно это".

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

softwarer
Это для любого количества строк является каплей в море

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

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

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

softwarer
То есть, если я Вас правильно понял, ваше приложение чихает на понятие "согласованность данных"? И если вдруг меняются параметры изделия, Вы подходите к мегафону и громко-громко-громко говорите "Всем пользователям системы перевойти в нее"?

Чихаем на согласованность ? Это почему интересно ? Судя по реплике про мегафон, вы хотели сказать что-то про неактуальность данных. Никто (кроме здравого смысла) вообще-то и не мешает добавить кнопку refresh на список изделий, только поверьте, необходимости в этом нет. Список изделий редактируется от силы раз в месяц. Да и то это будет иметь значение только для добавления/удаления изделий, а никак не при редактировании их свойств.

softwarer
Оптимизация - такая вещь, что …

Вообще-то при проектировании структуры базы мысль об оптимизации не должна находиться на первом месте (правда и не на последнем). Та-же денормализация не производиться заранее, а только при неудовлетворительной пропускной способности системы (и то не всегда), а решение использовать/неиспользовать null в общем случае относиться в первую очередь к структурным вопросам, а не к оптимизационным.
Это кстати является аргументом против применения null “потому-что это быстрее”. Уж лучше иметь менее быстродействующую систему, чем систему более склонную к ошибкам. (вернее сказать - выискивать другие методы оптимизации)

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

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

softwarer
Этого, пардон, я совершенно не понял. Собственно, сама по себе фраза coalesce(IDИзделия, IDДетали) говорит о кривой структуре данных (несравнимые вещи сводятся под одной крышей). О какой структуре данных идет речь? К сожалению, я не имею представления, что такое "нулевая сборка", но в любом случае прежде всего - нарисуйте, пожалуйста, какую структуру Вы сравниваете, и с какой.

я-же написал, что речь идет о моем примере в данном топике. “Кривой “ структурой данных является предложение ModelR’a, которое я кстати предлагал вам критиковать еще на первой странице топика.

Код: plaintext
1.
2.
create table Детали(IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), IDИзделия int)

create table Изделия(IDИзделия int, Заказчик varchar( 100 ), Примечание varchar( 100 ))

В данном случае предлагается в таблице Изделия в качестве IDИзделия применить значение IDДетали нулевой сборки (то есть такой сборки, которая и представляет собой собственно само изделие). А в таблице Детали для этой сборки в поле IDИзделия проставить null, так как IDДетали и будет являться ссылкой на изделие. Теперь, при запросе всех деталей изделия необходимо применение например coalesce, что-бы получить резалтсет с нулевой сборкой (т.е. при IDИзделия is null необходимо брать IDДетали).

softwarer
Cтранный подход, признаться. Не знаю, как и в каком контексте было сформулировано в оригинале, но в таком изложении - не вижу цимеса. Скажем, как провести границу обязательного появления - через две недели, или допустим через двадцать лет?

Что-же в этом странного, обязательное появление означает что запись рано или поздно там появиться, и не важно, через 1 день или 20 лет.

softwarer
Скажем, задача: хранить ФИО физ. лица, дату рождения и ИНН (прочие атрибуты для экономии времени опустим). Вопрос: как правильно хранить?

В связи с тем, что по условию задачи есть люди, которые по определению не могут иметь ИНН, я-бы разнес их в разные таблицы, что-бы не допустить появления младенца, обладающего ИНН.
Хотя уверен, что в реальности они все в одной таблице, потому-что так “проще” ;)

softwarer
Хм. Прежде всего мне в этом случае очень странно, что считанные письма назад Вы резко нападали на "временный null", срок жизни которого исчислялся микросекундами между выполнением нескольких операторов одной транзакции, а никто другой эти данные увидеть не мог (надеюсь, у вас в системе нет грязного чтения?) Сейчас же Вы уже примиряетесь с существованием временного null со сроком жизни в несколько недель, которым успеют воспользоваться все кому не лень.

Неужели не догадываетесь, что принципиальная разница между “null которого никто не видит” и “null доступный для всех” в том, что в первом случае sql-код для работы с базой должен учитывать возможность появления null в данных, а во втором – нет ?

softwarer
Почему: потому что все проблемы, которые только может доставить null, в случае "временных null" ничуть не менее страшны, нежели в случае "перманентных null".

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

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

Согласен, это было всего лишь мое предположение, хотя и вполне логичное

softwarer
А вот почему-то "умником, который хочет для обхода логической проблемы разрушить баланс и напортачить с данными" - Вы готовы выступить

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

softwarer
Хм. Раз уж упрекайте, включайте логику. Кто у нас есть из "не других людей"?

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

softwarer
Еще раз, медленно и печально: "проводка", "нулевая сборка", "аналитический счет", "поле комплексных чисел" и мириады других неочевидных абстракций

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

С другой стороны я допускаю, что понятия "термин" и "метафора" могут иногда пересекаться, что облегчает понимание.

энциклопедия
МЕТАФОРА (от греч. metaphora перенесение), троп, перенесение свойств одного предмета (явления) на другой на основании признака, общего или сходного для обоих сопоставляемых членов («говор волн», «бронза мускулов»).

ТЕРМИН (от лат. terminus граница, предел), слово или сочетание слов, обозначающее специальное понятие, употребляемое в науке, технике, искусстве.
...
Рейтинг: 0 / 0
Ловушка 22
    #34246784
трудАголик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня складывается ощущение, что автор топика не имеет представления о предметной области, для которой он пытается разрабатывать систему учета.

2 stenf:
Вы уж разберитесь, что такое деталь, сборочная единица, сборка СБ000 и чем она отличается от изделия, что такое технология изготовления и как она соотносится с конструкторской документацией, заодно почитайте что-нибудь на предмет организации складского учета, что такое готовая продукция и сопроводительные документы на партию изделий и т.п.

А самое правильное - прислушайтесь к совету от guest_20040621 или обратитесь к компаниям, которые профессионально занимаются разработкой информационных систем
...
Рейтинг: 0 / 0
Ловушка 22
    #34246824
Мишка
Зина внесла индейку. Борменталь налил Филиппу Филипповичу красного вина
и предложил Шарикову.
- Я не хочу. Я лучше водочки выпью. - Лицо его замаслилось, на лбу
проступил пот, он повеселел. И Филипп Филиппович несколько подобрел после
вина. Его глаза прояснились, он благосклоннее поглядывал на Шарикова, черная
голова которого в салфетке сияла, как муха в сметане.
Борменталь же, подкрепившись, обнаружил склонность к деятельности.
- Ну-с, что же мы с вами предпримем сегодня вечером? - Осведомился он у
Шарикова.
Тот поморгал глазами, ответил:
- В цирк пойдем, лучше всего.
- Каждый день в цирк, - благодушно заметил Филипп Филиппович, - это
довольно скучно, по-моему. Я бы на вашем месте хоть раз в театр сходил.
- В театр я не пойду, - неприязненно отозвался Шариков и перекосил рот.
- Икание за столом отбивает у других аппетит, - машинально сообщил
Борменталь. - Вы меня извините... Почему, собственно, вам не нравится театр?

Шариков посмотрел в пустую рюмку как в бинокль, подумал и оттопырил губы.
- Да дурака валяние... Разговаривают, разговаривают... Контрреволюция
одна.
Филипп Филиппович откинулся на готическую спинку и захохотал так, что
во рту у него засверкал золотой частокол. Борменталь только повертел
головою.
- Вы бы почитали что-нибудь, - предложил он, - а то, знаете ли...
- Уж и так читаю, читаю... - Ответил Шариков и вдруг хищно и быстро
налил себе пол стакана водки.
- Зина, - тревожно закричал Филипп Филиппович, - убирайте, детка,
водку, больше уже не нужна. Что же вы читаете?
В голове у него вдруг мелькнула картина: необитаемый остров, пальма,
человек в звериной шкуре и колпаке. "Надо будет Робинзона"...
- Эту... Как ее... Переписку Энгельса с этим... Как его - дьявола - с
Каутским.
Борменталь остановил на полдороге вилку с куском белого мяса, а Филипп
Филиппович расплескал вино. Шариков в это время изловчился и проглотил
водку.

Филипп Филиппович локти положил на стол, вгляделся в Шарикова и
спросил:
- Позвольте узнать, что вы можете сказать по поводу прочитанного.
Шариков пожал плечами.
- Да не согласен я.
- С кем? С Энгельсом или с Каутским?
- С обоими, - ответил Шариков.
- Это замечательно, клянусь богом. "Всех, кто скажет, что другая..." А
что бы вы со своей стороны могли предложить?
- Да что тут предлагать?.. А то пишут, пишут... Конгресс, немцы
какие-то... Голова пухнет. Взять все, да и поделить...
...
Рейтинг: 0 / 0
Ловушка 22
    #34246830
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУ меня складывается ощущение, что автор топика не имеет представления о предметной области, для которой он пытается разрабатывать систему учета.
более отчетливое ощущение, что автор начитался книжек, и с разбегу начал практиковаться. Вот и все. Т.е. просто перегрузился теорией, вместо того чтобы плавно теорию с практикой чередовать.

Конечно, если прочитать на ночь Дейта, главу Отсутствующая информация, то оно, может быть, ночью приснится null, грызущий ноги. Однако, практика как раз говорит о том, что не надо возводить теорию в догму.
...
Рейтинг: 0 / 0
Ловушка 22
    #34246837
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfя-же написал, что речь идет о моем примере в данном топике. “Кривой “ структурой данных является предложение ModelR’a, которое я кстати предлагал вам критиковать еще на первой странице топика.

Код: plaintext
1.
2.
create table Детали(IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), IDИзделия int)

create table Изделия(IDИзделия int, Заказчик varchar( 100 ), Примечание varchar( 100 ))

В данном случае предлагается в таблице Изделия в качестве IDИзделия применить значение IDДетали нулевой сборки (то есть такой сборки, которая и представляет собой собственно само изделие). А в таблице Детали для этой сборки в поле IDИзделия проставить null, так как IDДетали и будет являться ссылкой на изделие. Теперь, при запросе всех деталей изделия необходимо применение например coalesce, что-бы получить резалтсет с нулевой сборкой (т.е. при IDИзделия is null необходимо брать IDДетали). Однако 3 (три) раза пытался обратить ваше внимание на непонятный атрибут Детали.IDИзделия. Лишний он однако.
З.Ы. Вместо перебранки с softwarer привели бы пример данных.
З.З.Ы. Согласно традициям sql.ru для флейма отведен Сравнение СУБД :).
...
Рейтинг: 0 / 0
Ловушка 22
    #34247735
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv
Конечно, если прочитать на ночь Дейта, главу Отсутствующая информация, то оно, может быть, ночью приснится null, грызущий ноги. Однако, практика как раз говорит о том, что не надо возводить теорию в догму.

если-бы я был экспертом в теории и практике, то не сидел-бы тут на форуме спрашивая возможно глупые вопросы. Однако вместо того чтобы критиковать меня, лучше-бы критиковали мои мысли, а просто растекание мысли по дереву о том какой я дурак имеет мало смысла, и может подтолкнуть к мысли, что вы и сами не сильно глубоко разбираетесь в этом вопросе
ModelR
Однако 3 (три) раза пытался обратить ваше внимание на непонятный атрибут Детали.IDИзделия. Лишний он однако.

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

каких данных ? Да и не перебранка это ни какая :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34247897
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfтогда скажите, каким образом надо выстроить схему по-другому, но так, что-бы я мог запросом отобрать только детали определенного изделия.
Вот видите, даже в самом Вашем вопросе ошибка. Деталь не принадлежит изделию. Она может использоваться в его сборке, и не более. А может использоваться и при сборке более чем одного изделия.

Вообще, запомните, сейчас для Вас деталь и изделие - это одно и то же. Никаких параметров, связанных с поставщиками и наличием чертежей самой делтали, в BOM не бывает (а у Вас классический BOM), это свойство изделия/детали, а не сборки, а Вам надо описать именно сборку .

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

А получение перечня деталей, требующихся для сборки - отдельная тема. Потому что одна и та же деталь может как производиться (причем разными способами, из разных полуфабрикатов и т.п.), так и покупаться. Потому видимо все, что Вы сможете сделать при такой постановке вопроса - это максимально развернуть BOM-ы рекурсивно.
...
Рейтинг: 0 / 0
Ловушка 22
    #34247981
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfзапросом отобрать только детали определенного изделия.
ORACLE : CONNECT BY.
MS SQL 2005 : появилась аналогичная фича.
...
Рейтинг: 0 / 0
Ловушка 22
    #34248792
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfPragmatically, dealing with NULL brings added complexity to the storage engine because
Это верно, но в данном случае не наша задача и не предмет нашей дискуссии. Написать хорошую программу вообще сложно; если разработчик СУБД хочет дать мне хороший продукт - он справится с этой сложностью. Если хочет облегчить себе жизнь - избавится от null. А я избавлюсь от его продукта и куплю хороший.

stenfAllowing NULL also adds complexity in application code, which can often lead to bugs. You must always add special logic to account for the case of NULL.
Это очень похоже на рассуждение именно о процедурном коде. Если так, согласен. Как я уже говорил, null упрощает запросы ценой потенциального усложнения процедурного кода.

stenfIn outer-join operations, you should carefully account for NULL values that are generated to preserve rows that don't have a match in the table being joined.
Это чушь. При outer join ничего carefully account не нужно. carefully account может потребоваться при обработке полученных через outer join результатов, начиная от coalesce в select и кончая все тем же application code. Можно построить пример, когда это ведет к дополнительным сложностям, но в реальности null как правило упрощает такие ситуации. Скажем, простейший пример "контрагент может быть физическим либо юридическим лицом":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
-- при использовании null

select 
  c.contractor_id, 
  c.person_id,
  c.organization_id,
  coalesce (p.person_name, o.org_full_name) contractor_name
from 
  contractors c, 
  persons p, 
  organizations o
where 
  c.person_id = p.person_id (+) and 
  c.organization_id = o.organization_id (+)

-- без null

select 
  c.contractor_id, 
  c.person_id,
  null,
  p.person_name contractor_name
from 
  contractors c, 
  persons p
where 
  c.person_id = o.person_id

union all

select 
  c.contractor_id, 
  null,
  c.organization_id,
  o.organization_name contractor_name
from 
  contractors c, 
  organizations o
where 
  c.organization_id = o.organization_id

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

stenfAnd even if you're comfortable with three-valued logic, your developers and anyone querying the data using the SQL language typically won't be;
typically - это явная ложь. Впрочем, типичная для микрософта идея о ламерах, которые будут писать хорошие программы, оставаясь при этом ламерами. Впервые она была выдвинута ими примерно пятнадцать лет назад, пока никаких результатов не дала. Думаю, и дальше не даст.

stenftherefore, introducing NULL will be a source of bugs just waiting to happen.
Итого, в лучшем случае это половина правды. Другая половина правды - bugs, которые waiting to happen из-за усложнений структуры данных и прочих недостатков "схем без null".

stenfДейт не MSSQL-щик. Хотя нет, я забыл, он-же тоже не годиться так как. теоретик. Какая досада. Какой барьер для цититат вы выставите в следующий раз ? Что-бы автор имел московскую прописку ?
Зависит от ситуации. Идеальным цитируемым был бы Кайт. У него тоже есть недостатки, но это уже из серии "жемчуг мелок".

Видите ли, ситуации бывают разные. Например, в MSSQL некоторые проблемы доставляет различие null и пустой строки, другие проблемы доставляет специфическая работа c null unique constraint-ов. Я того и другого лишен, поэтому, вполне вероятно, смотрю на null оптимистичнее гуру MSSQL.

stenf softwarerВы пересказали банальность из книги
8-/ Какой книги, вы о чем вообще ? Бред какой-то. Я попросил-бы вас не бросаться высосанными из пальца догадками, да еще таким тоном. Когда я кого-то цитирую, я это явно указываю.
Вы знаете разницу между "цитировать" и "пересказать"? Или просто не замечаете?

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

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

stenf softwarerДружище, если из всего многообразия "иди куда нужно" Вы видите одно-единственное направление движения - это шоры Вашего мышления, ничего более. И в строгом соответствии с предыдущей ссылкой выдаете это как "мне сказали именно это".

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

stenfТут пока не готов дискутировать. Выяснение того, какой реальный процент ресурсов потребляет отслеживание null требует некоторого исследования.
Лично я перед тем как писать, проверил на MSSQL2000. На 10.000.000 строк на своей рабочей станции разницы не зафиксировал.

stenfВсе-таки движок сервера написан не на ассемблере (хотя возможно имеются значительные ассемблерные вставки), и операция проверки на null не обязательно сведется буквально к 2 ассемблерным операциям (не зная внутренностей никогда ничего нельзя гарантировать).
Хм. Тут есть два отдельных момента. Первое, что к сожалению очень часто нарушается неопытными программистами: надо очень четко понимать приоритеты различных идей, понимать, что фундамент, что следствие. В частности, если в конкретном движке SQL поддержка NULL реализована плохо, это не значит, что NULL теоретически плох - это значит, что программистам конкретного движка надо надавать пенделей, чтобы сделали хорошо. Впрочем, я уверен, что во всех серьезных продуктах такие аспекты проработаны на достойном уровне.

Второе, насчет ассемблерных вставок и не зная внутренностей. Все профессиональные компиляторы давным-давно умеют правильно оптимизировать такие фрагменты кода. "Сугубо теоретически" Вы правы, но практически существуют очень хорошие шансы на то, что этот фрагмент кода сервера выглядит примерно так:

Код: plaintext
bool isNull = (nullMask [colIndex/ 32 ] && ( 1  << colIndex% 32 ));

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

stenfВы не находите, что есть некоторая разница между каплей любого размера и нулем ?
Сугубо философски, безусловно есть, и громадная. Практически - нет. Это старая тема разницы понятий "математический ноль" и "физический ноль".

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

stenfтолько поверьте, необходимости в этом нет. Список изделий редактируется от силы раз в месяц.
Вопрос не в том, как часто он редактируется. Вопрос в том, что будет, если:

- пользователь 1 загрузился и работает
- пользователь 2 изменил список изделий
- пользователь 3 загрузился и сделал операцию с участием нового/измененного изделия, например определил ему детали
- пользователь 1, не перезагружаясь, выполнил операцию с данными, которые только что подготовил пользователь 3.

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

stenf softwarer
Оптимизация - такая вещь, что …

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

stenfа решение использовать/неиспользовать null в общем случае относиться в первую очередь к структурным вопросам, а не к оптимизационным.
Правильно.

stenfЭто кстати является аргументом против применения null “потому-что это быстрее”.
Эк Вы загнули и еще веселее загибаете дальше. Напомню, как развивалась тема:

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

stenfУж лучше иметь менее быстродействующую систему, чем систему более склонную к ошибкам.
И вот здесь Вы окончательно перегнули. Потому что "без null" Вы имеете все шансы получить более склонную к ошибкам систему, заодно еще и менее быстродействующую. Я обосновываю именно это, и не стоит плавно выделять второстепенный фактор в ущерб основному.

stenfПодробности об изделии закачиваются один раз и на это требуется join. Другие запросы обходяться без join’а, но все равно потребляют столбец, который будет иметь null в случае отказа от третьей таблицы.
Похоже, мы не понимаем друг друга. Постараюсь объяснить еще раз, что имею в виду.

Допустим, у нас есть столбцы A, B, C, D, которые в обсуждаемых вариантах могут быть разнесены по разным таблицам либо сведены в одну. Скажем, A и B - в одной таблице, C и D - кандидаты на вынос в другую либо на null. Набор данных у нас объективен, определяется задачей; меняться может только набор технических полей типа ключей.

Итак, у нас будут запросы вида

Код: plaintext
1.
2.
3.
4.
 1 ) select a, b from table where ...
 2 ) select a, b, c, d from table where ...

 3 ) select a, b from table where ...
 4 ) select a, b, c, d from table join ext_table where ...

Мне представляется очевидным, что запросы 1) и 3) одинаковы и при прочих равных будут выполняться одинаково, несмотря на наличие либо отсутствие null-колонок c и d в таблице. Потому что c и d не участвуют в запросе, серверу нафиг не интересны их значения и "тратить заметные ресурсы на анализ маски" он не будет. Просто потому, что хорошо написан, что разработчики всячески вылизывают производительность.

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

stenf“Кривой “ структурой данных является предложение ModelR’a, которое я кстати предлагал вам критиковать еще на первой странице топика.
Хм. Согласитесь, я не обязан отзываться на все предложения. В частности, чтобы всерьез рассуждать об оптимальной структуре данных, надо знать либо четкую постановку задачи, либо предметную область. У меня такого знания нет, поэтому я воздержался от рекомендаций. Изначально я показал лишь возможные пути решения конкретной технической проблемы, далее мы спорим о концепцуальных и общих вещах.

stenfВ данном случае предлагается в таблице Изделия в качестве IDИзделия применить значение IDДетали нулевой сборки ... А в таблице Детали для этой сборки в поле IDИзделия проставить null, так как IDДетали и будет являться ссылкой на изделие.
Понятно. Тогда названный Вами запрос действительно будет.. непрямым, и в целом такое соглашение кажется мне неудачным.

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table Изделия (ид_изделия integer not null primary key, .... ) ;

create table Детали (ид_детали integer not null primary key, ид_изделия integer, нулевая_сборка char( 1 ), ... ) ;

alter table Детали add constraint Детали_Изделия_fk foreign key (ид_изделия) references Изделия (ид_изделия) ;

alter table Детали add constraint Детали_Нулевая_Сборка_ck check (нулевая_сборка in ( 'Y', 'N' )) ;

create unique index Детали_Нулевая_Сборка_ui on Детали (ид_изделия, case when нулевая_сборка = 'Y' then 'Y' else null end) ;

Что хотел бы подчеркнуть: ид_иделия в деталях может быть null, если это нужно по условиям задачи (допускаются детали без изделий, скажем в рамках допускаемых Вами "временных null"), и проблем в указанном запросе это не доставит, ровно наоборот: наличие там null при inner join Изделия уберет ненужные Вам записи, в то время как в схеме "без null" пришлось бы рисовать специальный фильтр. Для Вашей задачи, где как я понимаю, детали строго привязаны к изделиям, там конечно следует поставить not null - опять же, не потому что это избавляет от проблем, но исключительно для соответствия бизнес-требованиям конкретной задачи.

stenfЧто-же в этом странного, обязательное появление означает что запись рано или поздно там появиться, и не важно, через 1 день или 20 лет.
Странен критерий. Не вижу цимеса, не вижу, что хорошего мы получаем таким путем и что плохого не получаем. Я не вижу значимых отличий этого подхода от "допускать перманентный null".

Что есть "рано или поздно"? Скажем, как Вы расцените ситуацию, в которой прогнозируемое "поздно" будет больше предполагаемого срока вывода этой системы из эксплуатации?

В качестве примера - возьмем поле "дата смерти" для тех же физ.лиц, ну и информационную систему, например, ЗАГСа. Вполне очевидно, что значение в этом поле "рано или поздно появится", но точно так же очевидно, что для большинства свежевведенных записей к моменту вывода этой системы из эксплуатации там будет null. Как это расценивать - как постоянный null или как временный? Стоит ли класть в ту же таблицу?

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

stenfя-бы разнес их в разные таблицы, что-бы не допустить появления младенца, обладающего ИНН.
Совершенно не понял смысла фразы. Нельзя ли поконкретнее, может быть со структурой: каким образом разнесение по таблицам убережет от "появления младенца с ИНН"? Единственная версия, которую я вижу - сделать таблицы "Люди с ИНН" и "Люди без ИНН". Но это очевидно неудачно с точки зрения других аспектов функционирования.

stenfХотя уверен, что в реальности они все в одной таблице, потому-что так “проще” ;)
В реальности они как правило в одной таблице потому, что так лучше.

stenf softwarer
Хм. Прежде всего мне в этом случае очень странно, что считанные письма назад Вы резко нападали на "временный null", срок жизни которого исчислялся микросекундами между выполнением нескольких операторов одной транзакции, а никто другой эти данные увидеть не мог (надеюсь, у вас в системе нет грязного чтения?) Сейчас же Вы уже примиряетесь с существованием временного null со сроком жизни в несколько недель, которым успеют воспользоваться все кому не лень.

Неужели не догадываетесь, что принципиальная разница между “null которого никто не видит” и “null доступный для всех” в том, что в первом случае sql-код для работы с базой должен учитывать возможность появления null в данных, а во втором – нет ?
Вот я как раз и не понимаю, почему Вы ожесточенно критиковали "null который никто не видит", но при этом допускаете существование "null доступный для всех". Обратную логику я бы вполне понял, в такой же постановке - смысла не вижу.

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

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

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

Ситуация "если там вдруг случайно появилось значение" подразделяется на две ситуации: появилось правильное значение, которое там и должно быть либо появилось значение, которого там быть не должно. Первая ситуация очевидно нормальна, вторая - явная ошибка в реализации бизнес-логики. Как и любая другая подобная ошибка, может повлечь за собой тяжелые последствия. Скажем, что будет, если у холостяка "случайно появится" жена? А если у работника "случайно появится" дата смерти?

На практике - в одной конторе, где я работал, в таблицу сотрудников среди прочих был занесен господин Сервер. Решение, примерно аналогичное вашей нулевой сборке - таким образом технические задачи под служебным аккаунтом могли входить в систему и работать. Дык вот, представляете, какое было веселье, когда начальник отдела кадров нашел непонятного сотрудника, написал ему письмо, не дождался ответа, пять раз проверил, что такого по бумагам не значится, да и нажал кнопку "уволить"?

stenf softwarerА вот почему-то "умником, который хочет для обхода логической проблемы разрушить баланс и напортачить с данными" - Вы готовы выступить
Я вам уже не раз повторял, что там был пример, демонстрирующий разницу между разными видами бизнес-правил: реальности и бизнеса. Никаким хакерством я не собирался там заниматься.
Я вам уже не раз повторял: нет такой разницы, и пытаясь ее продемонстрировать, Вы фактически говорите: "вот здесь хакнуть допустимо, а вот здесь - ни-ни".

stenf softwarerХм. Раз уж упрекайте, включайте логику. Кто у нас есть из "не других людей"?
А вы иногда отключайте логику и включайте здравый смысл. Абстракция может быть очевидной для вас, но не для других людей.
Я предпочитаю держать включенными и логику, и здравый смысл. Так я вижу, что например Ваша фраза "Абстракция может быть очевидной для вас, но не для других людей" в первую очередь возражает на Вашу же "абстракция должна быть очевидной" (или, если угодно, уточняет ее), во вторую очередь совершенно не относится к тому, что я говорил (Ваше уточнение насчет "других людей" является тавтологией), и делаю вывод, что Вы возражаете, не особо обдумывая сказанное, "абы возразить". Кстати, опять банальщиной.

stenfага, я кажется начинаю понимать причины ваших ответов. Вы смешиваете понятия "метафора/абстракция" и "термин предметной области". Нулевая сборка не является метафорой - это термин. Как и аналитический счет. Метафорой для нулевой сборки будет например "девушка на выданье" (прошу ее не критиковать, метафора идиотская и не совсем к месту, но я не могу так вот сразу придумать что-то получше, но зато она демонстрирует идею). Такая метафора (кстати понятная всем) вызывает в сознании определенные образы нечто такого, что долго взращивали и можно наконец отдать в чужие руки.

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

Абстракция - в общем случае не является метафорой понятия предметной области. Если в предметной области есть понятия "молоток", "станок", "рабочий", "директор" и так далее, нам может оказаться удобным выделить такие абстракции как "инструмент" и/или "сотрудник". Мало того, такие абстракции, оказавшись удобными, со временем врастают и становятся новыми "понятиями предметной области" - как, скажем, "аналитический счет". Вы не сможете прийти на завод и показать мне железяку или иной предмет, являющийся аналитическим счетом, да и счетом (в учетном смысле) вообще. Это абстракция.

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

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

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

Что есть нулевая сборкаНе знаю как там, у «государственных оружейников», а у меня лично «аванпроект» это то, что я нацарапал на бумажке без размеров. С размерами у меня это называется «нулевая сборка», поскольку я из авиации пришел. У нас так назывался сборочный чертеж

1) Mandriva - это логическое продожение Mandriva linux. Стоят самые последние (ну или почти) пакеты. Мне нравится. Правда бывают висяки из-за того что это нулевая сборка за датой 2 января


Итого, как "термин предметной области" в том смысле, который Вы говорите, нулевая сборка не найдена. Можно предположить, что если Вы придете к директору соседнего завода, окажется, что он про такую никогда не слышал. Тогда что это?
...
Рейтинг: 0 / 0
Ловушка 22
    #34248870
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, при редактировании выпала пара абзацев, повторю фрагмент с ее добавлением.

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

.........

Так вот, если предположить, что проблема в том, что "в поле вдруг появилось неправильное значение", значение которого там не должно было появляться, давайте подумаем, в чем разница между перманентными и временными null в этом случае? Лично я разницы не вижу.

В случае перманентных null это неправильное значение будет висеть и доставлять непредсказуемые проблемы все время своего существования. То есть либо пока его не найдут и не исправят, либо пока не удалят запись, либо пока туда по бизнесу не окажется пробитым правильное значение. Что же будет в случае временных null? Собственно.... это неправильное значение будет висеть и доставлять непредсказуемые проблемы все время своего существования. То есть либо пока его не найдут и не исправят, либо пока не удалят запись, либо пока туда по бизнесу не окажется пробитым правильное значение.

Таким образом, качественной разницы здесь нет, ситуация эквивалентна. Различия если и есть, то количественные, в факторе "сколько эта неправильная запись проживет в базе прежде чем окажется пробитым правильное значение". Но Вы сами сказали, что неважно, один день или двадцать лет. То есть Вы допускаете даже отсутствие количественной разницы (согласитесь, последствия за двадцать лет запросто могут быть куда больше, чем последствия из-за перманентного null в записи, существующей в среднем пять лет).
...
Рейтинг: 0 / 0
Ловушка 22
    #34249152
Фотография !!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerИтого, как "термин предметной области" в том смысле, который Вы говорите, нулевая сборка не найдена. Можно предположить, что если Вы придете к директору соседнего завода, окажется, что он про такую никогда не слышал. Тогда что это?Обозначение чертежа сборочной единицы "верхнего уровня", т.е. окончательного изделия - СБ 000. Часто в разговорной речи используется не только для обозначения документа, но и самого изделия. Вполне устоявшийся термин в машиностроении.

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

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

Короче, тема не раскрыта, рекомендации игнорируются, флуд продолжается
...
Рейтинг: 0 / 0
Ловушка 22
    #34249178
gybson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create table Детали(IDДетали int, Обозначение varchar(100), Наименование varchar(100), Покупная bit, БезЧертежка bit, IDИзделия int)

create table изделия(IDИзделия int, Заказчик varchar(100), IDДетали int, СрокСдачи datetime, Примечание varchar(100))

create table Входимость(IDДетали int, IDСборки int, Количество int)


Таблички уже неправильные. IDИзделия в детали не должно быть. Заказчика не должно быть в изделиях.

На вскидку так:

Изделия : Обозначение(Код?Артикул?), Наименование
Комплектация изделий : Комплект(Ссылка на изделие), Комплектующая (Ссылка на изделие), Количество
ВидыКатегорийИзделий: Наименование (Без чертежа и т.п.)
КатегорииИзделий: Изделие, Категория - если запись есть, то считаем, что true :)
Заказчики: ИНН, ОКПО, Наименование и т.п.
ЗаказыШапка: Заказчик, СрокСдачи
ЗаказыСтроки: ЗаказШапка, Изделие, Количество.

С категориями можно и не заморачиваться конечно.
...
Рейтинг: 0 / 0
Ловушка 22
    #34249491
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!!!С точки зрения проектирования БД ничем не отличается от любой другой сборочной единицы, за исключением того, что в деревянной структуре это будет корень.
В целом, Вы укрепили мое мнение о ненужности и искусственности разделения "Деталей" и "Изделий" в терминологии автора.

2stenf: кстати, вот такая вещь. Насколько я помню, Вы собираетесь копировать детали, которые одинаковы, но входят в разные изделия. Опуская обсуждение недостатков этого подхода, давайте подумаем вот над чем: а что, если изделие состоит в том числе из других изделий? Как вы собираетесь отрабатывать этот момент? Что будет, если изделие А (заказчик АБС, срок сдачи 01.02.03) включает изделие Б (заказчик ЭЮЯ, срок сдачи 04.05.06)?
...
Рейтинг: 0 / 0
Ловушка 22
    #34250797
кхм...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторОпуская обсуждение недостатков этого подхода, давайте подумаем вот над чем: а что, если изделие состоит в том числе из других изделий? Как вы собираетесь отрабатывать этот момент? Что будет, если изделие А (заказчик АБС, срок сдачи 01.02.03) включает изделие Б (заказчик ЭЮЯ, срок сдачи 04.05.06)?
аффтор сказал что такого не может быть потому что не может быть никогда !
:))))
...
Рейтинг: 0 / 0
Ловушка 22
    #34251204
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerКак вы собираетесь отрабатывать этот момент? Что будет, если изделие А (заказчик АБС, срок сдачи 01.02.03) включает изделие Б (заказчик ЭЮЯ, срок сдачи 04.05.06)?
Пока товарищ путает изделия и производственные заказы, ничего он не сделает и никак он поступать не будет.
...
Рейтинг: 0 / 0
Ловушка 22
    #34252495
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Васкецов
Вот видите, даже в самом Вашем вопросе ошибка. Деталь не принадлежит изделию. Она может использоваться в его сборке, и не более. А может использоваться и при сборке более чем одного изделия.

Сергей Васкецов
Пока товарищ путает изделия и производственные заказы, ничего он не сделает и никак он поступать не будет.

softwarer
Насколько я помню, Вы собираетесь копировать детали, которые одинаковы, но входят в разные изделия. Опуская обсуждение недостатков этого подхода, давайте подумаем вот над чем: а что, если изделие состоит в том числе из других изделий? Как вы собираетесь отрабатывать этот момент? Что будет, если изделие А (заказчик АБС, срок сдачи 01.02.03) включает изделие Б (заказчик ЭЮЯ, срок сдачи 04.05.06)?

Уважаемые господа, прежде чем постить такие высказывания, следовало-бы более внимательно читать топик. Я уже на это отвечал.
Еще раз, медленно и печально: (С)
У нас специфическое опытное производство, что (для тех, кто не знаком с термином "опытный" ;) означает, что все изделия считаются уникальными. Даже если идет подряд несколько идентичных изделий, то для бухгалтерии и прочих служб завода они считаются разными . Внутри нашей системы среди прочего, они будут разными еще и потому, что тот факт, что на момент запуска они были идентичны, не означает, что так и будет продолжаться дальше. Например в подготовленный комплект документов на запуск 5 одинаковых изделий могут быть проведены изменения, касаящиеся только трех их них. это может произойти например потому, что эти три изделия захотят внезапно перебросить на другой заказ для другой страны, что требует некоторых коррекций в структуре. Могут возникать и другие причины уже в процессе производства, связанные с дополнениями, недочетами и пр.
Это-же обьясняет причину, почему деталь не может входить сразу в несколько изделий - если вдруг у нее внезапно меняется обозначение или любой другой аттрибут, то это не в коем случае не должно задевать сразу несколько изделий.
Для Сергея Васкецова замечу, что у нас производственный заказ содержит несколько изделий, никакой путаницы тут нет. Это вообще разные понятия.
Соответственно, не может и возникнуть ситуация "изделие в изделии". Если некоторое изделие может оказаться подсборкой другого изделия (что бывает), то оно и заноситься в систему как подсборка. Тот факт, что идентичная подсборка может где-то получить статус полноценного изделия тут неважен.
!!!
В любом случае, у автора топика, в голове каша из услышанных обрывков разговоров производственников, конструкторов, технологов и, возможно, сбытовиков. Автор не отличает документацию и конкретный экземпляр изделия

2 softwarer: Обратите внимание, сделанный вывод, базирующийся на домыслах автора. Ниже еще поговорим о логических выводах. Здесь-же примечательно то, что мое первое образование - инженер-механик машиностроитель, я не просто знаю эту предметную область, а профессионально в ней разбираюсь, и могу работать (и работал на производственных практиках) на многих должностях, автоматизируемой нашей системой.
ModelR
ORACLE : CONNECT BY.
MS SQL 2005 : появилась аналогичная фича.

;) я так и думал, что вы предложите что-то подобное. К сожалению, так не получиться. Входимость изделия никогда не забивается "по-порядку". Обычно, от конструкторов приносят отдельные сборки, никак друг с другом не связанные, кроме того, что известна информация об изделии, которому они принадлежат. Т.е. существует длительный промежуток времени, когда каждое дерево изделия содержит несколько голов, и если информация об изделии отсутствует, то по дереву нельзя определить, к какому изделию принадлежит конкретная деталь.
softwarer
Это очень похоже на рассуждение именно о процедурном коде.

ничем не обоснованная догадка
softwarer
Это чушь. При outer join ничего carefully account не нужно. carefully account может потребоваться при обработке полученных через outer join результатов

;) очевидно, ваш английский не находиться на идеальном уровне. Речь тут как раз и идет о Null в записях, сгенерированных при отсутствии совпадающих в другой таблице.
softwarer
stenf
And even if you're comfortable with three-valued logic, your developers and anyone querying the data using the SQL language typically won't be;

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

и вы безусловно можете дать ссылку на что-нибудь официальное, где говориться именно о ламерах, способных писать хорошие программы при помощи софта ?
Согласен, что про типичных девелоперов не знающих про null немного спорно, но вот про "anyone querying the data using the SQL language" вполне разумное высказывание. У нас например такие люди есть. Им нафиг не нужны подробности внутренней архитектуры сервера БД и тонкости языка, знание о sql у них ограничивается книжкой Граббера про основы SQL и этого им вполне достаточно, что-бы выцарапать из базы какие-то нужные данные.
softwarer
Идеальным цитируемым был бы Кайт.

ах да Кайт, царь и бог мира Оракл, куда-уж без него. Я только не понимаю, какой смысл мне конкретно его цитировать, если вы и так хорошо знаете его публикации.
softwarer
Например, в MSSQL некоторые проблемы доставляет различие null и пустой строки, другие проблемы доставляет специфическая работа c null unique constraint-ов. Я того и другого лишен, поэтому, вполне вероятно, смотрю на null оптимистичнее гуру MSSQL.

а что, в Оракл пустая строка и null это одно и то-же ? И вы этим, кгхм, гордитесь ?
softwarer
Поясняю еще раз: Вы высказали некую банальную мысль, высказали ее так, что... выделяется отсутствие заметного личного опыта в этом вопросе и примерно так, как ее излагают во всяких вводных главах в книгах по той или иной технологии программирования. То, что Вы взяли ее из книги - согласен, догадка; существует вероятность того, что пришли к тому же лично и что самое обидное, не прошли дальше.

еще одна "пальцемвнебо" догадка. Почему, критикуя меня за неверные догадки, вы сами сыпите их как из рога изобилия ? Из мысли про футбольную команду вы вывели отсутствие опыта работы в команде ? Потрясающая логика. Нет, я не делаю систему в одиночку по ночам, она достаточно крупная и осилить полный ее цикл довольно проблематично. Вы знаете анекдот про логику и аквариум ? Там, где, раз у тебя нет аквариума, то ты голубой ? Сильно напоминает.
softwarer
Будьте уверены, Ваше право. Как и не видеть ошибку, на которую я Вам прямо указал.

а не будете-ли вы так любезны, конечно только в качестве исключения, еще раз прямо и недвусмысленно указать мою ошибку про выводы из цитат ?
softwarer
Лично я перед тем как писать, проверил на MSSQL2000. На 10.000.000 строк на своей рабочей станции разницы не зафиксировал.

у меня нет причин вам недоверять, но вы все-таки напишите пожалуйста какие параметры вы меряли. Время там, или загрузку ЦП или что-то еще. Я хочу в свободное время поэкспериментировать
softwarer
Потому что судя по описанию, программа имеет шанс использовать несогласованные по времени снашоты связанных между собой данных. К каким последствиям это может привести - невозможно сказать на пальцах, нужно смотреть конкретику. Но потенциальная опасность есть, в первую очередь с точки зрения последующего сопровождения, когда добавлять бизнес-функции будет кто-то, не столь хорошо разбирающийся в системе

честно говоря не понял пойнта. Почему снапшоты окажутся несогласованными и как refresh кнопка в этом поможет
softwarer
Вопрос не в том, как часто он редактируется. Вопрос в том, что будет, если:

- пользователь 1 загрузился и работает
- пользователь 2 изменил список изделий
- пользователь 3 загрузился и сделал операцию с участием нового/измененного изделия, например определил ему детали
- пользователь 1, не перезагружаясь, выполнил операцию с данными, которые только что подготовил пользователь 3.

Пользователь 1 не увидит нового изделия. Он-же без него загрузился. Если-же изделие наоборот, было удалено например в архив, то при попытке доступа к деталям этого изделия он получит сообщение в духе "список изделий изменился".
softwarer
Эк Вы загнули и еще веселее загибаете дальше. Напомню, как развивалась тема:

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

а можно еще раз про "прочие" недостатки подхода с доп. таблицами ? У вас там только ресурсы и упоминание про "необходимость помнить про применение outer join". Это что, все ? Или я что-то пропустил ?
softwarer
Потому что "без null" Вы имеете все шансы получить более склонную к ошибкам систему

Обоснование этой мысли я тоже не помню. Я его пропустил, или его и небыло ?
softwarer
Похоже, мы не понимаем друг друга. Постараюсь объяснить еще раз, что имею в виду.

Допустим, у нас есть столбцы A, B, C, D, которые в обсуждаемых вариантах могут быть разнесены по разным таблицам либо сведены в одну. Скажем, A и B - в одной таблице, C и D - кандидаты на вынос в другую либо на null. Набор данных у нас объективен, определяется задачей; меняться может только набор технических полей типа ключей.
...
Мне представляется очевидным, что ...

Согласен, но я имел ввиду несколько другую ситуацию.

create table Детали(IDДетали int, Обозначение varchar(100), Наименование varchar(100), IDИзделия int)

create table Изделия(IDИзделия int, Заказчик varchar(100), Примечание varchar(100))

create table Деталь_Изделия(IDИзделия int, IDДетали int)

Здесь, для получения полной информации об изделиях мы делаем что-то типа:

select * from Детали a
join Изделия b on a.IDИзделия = b.IDИзделия
join Деталь_Изделия c on c.IDИзделия = a.IDИзделия and c.IDДетали = a.IDДетали


Теперь, у нас есть все данные об изделиях, включая их IDИзделия. Используя эти IDИзделия можно делать многочисленные запросы на получение нужных деталей, повторного join'а уже делать не надо, например

select * from Детали where IDИзделия = 56

В случае отказа от третьей таблицы и разрешения null в Детали.IDИзделия, вышеуказанный запрос на детали изделия не измениться. Однако в этом случае столбец IDИзделия nullable и значит требует расшифровки маски.
softwarer
Понятие "нулевая сборка" вообще сейчас представляется мне подозрительным, кандидатом на проверку "а нафига нужно такое чудо".

это чудо нужно затем, что-бы получить полную информацию об изделии. Напомню, что информация об изделии разделена между таблицами Изделия и Детали. Если вы не знаете, какая деталь нулевая сборка, то не получите такие данные как например обозначение и наименование изделия.
softwarer
Если Вас интересует схема, подобная приведенной, но лишенная указанного недостатка, в первую очередь приходит в голову следующее:

Спасибо, данная схема действительно представляется более удачной. Однако хотел-бы узнать, чем она лучше/хуже введения третьей таблицы. Или такие решения вообще равноправны ?
softwarer
Совершенно не понял смысла фразы. Нельзя ли поконкретнее, может быть со структурой: каким образом разнесение по таблицам убережет от "появления младенца с ИНН"? Единственная версия, которую я вижу - сделать таблицы "Люди с ИНН" и "Люди без ИНН". Но это очевидно неудачно с точки зрения других аспектов функционирования.
...
В качестве примера - возьмем поле "дата смерти" для тех же физ.лиц, ну и информационную систему, например, ЗАГСа. Вполне очевидно, что значение в этом поле "рано или поздно появится", но точно так же очевидно, что для большинства свежевведенных записей к моменту вывода этой системы из эксплуатации там будет null. Как это расценивать - как постоянный null или как временный? Стоит ли класть в ту же таблицу?
...
Под "перманентным null" я (и надеюсь, Вы) понимаю атрибут, у которого согласно бизнес-правилам может вообще никогда не появиться значения; такой атрибут, что в течение всей жизни записи в любой момент его значением будет null. Скажем, если придерживаться все тех же физ. лиц, там могут быть атрибуты "отчество", "гражданство", "номер паспорта" и так далее, отвечающие этому требованию.

В случае перманентных null это неправильное значение будет висеть и доставлять непредсказуемые проблемы все время своего существования. То есть либо пока его не найдут и не исправят, либо пока не удалят запись, либо пока туда по бизнесу не окажется пробитым правильное значение. Что же будет в случае временных null? Собственно.... это неправильное значение будет висеть и доставлять непредсказуемые проблемы все время своего существования. То есть либо пока его не найдут и не исправят, либо пока не удалят запись, либо пока туда по бизнесу не окажется пробитым правильное значение.

имхо разница в том, что если у живущего человека появиться дата смерти - то это не будет являться "логическим парадоксом". В самом деле, если появилась дата смерти, то откуда системе знать, ошибка это или человек в самом деле помер ? Да и младенец с ИНН вообще-то действительно возможен, может его в кино сняли и выплатили гонорар. В этом смысле я пожалуй поторопился там разнести их в разные таблицы.
Однако, проблема совсем другого плана появиться, если в моей схеме (где если IDИЗделия is null, то это корень) в этой ячейке IDИзделия вместо перманентного null возникнет число. В этом случае нулевая сборка станет неразличимой и изделие вообще "изчезнет". Согласитесь, это другой уровень ошибки.
Конечно, как вы говорили, возможно появление смерти у человека будет являться более проблематичной, чем изчезновение изделия, однако в общем случае это имхо не так. Оператор системы вполне в состоянии увидеть логическую ошибку живущего мертвеца, а вот изчезнувшее изделие требует вмешательства другого уровня.
softwarer
Хм. Мне не особо интересны метафоры, я бы хотел прояснить как раз смешивание Вами абстракций с понятиями (не терминами) предметной области.

Абстракция - в общем случае не является метафорой понятия предметной области. Если в предметной области есть понятия "молоток", "станок", "рабочий", "директор" и так далее, нам может оказаться удобным выделить такие абстракции как "инструмент" и/или "сотрудник". Мало того, такие абстракции, оказавшись удобными, со временем врастают и становятся новыми "понятиями предметной области" - как, скажем, "аналитический счет". Вы не сможете прийти на завод и показать мне железяку или иной предмет, являющийся аналитическим счетом, да и счетом (в учетном смысле) вообще. Это абстракция.

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

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

честно говоря, не совсем уловил ход мыслей. Сначала у нас речь шла об абстракциях/метафорах (таки да, несколько разные понятия, но я употреблял их как синонимы и вы вроде не возражали). Вы говорили, что удобная абстракция важнее, чем очевидная. Приводили пример слона - он неочевидный, но удобный.
Я говорил, что для абстракций/метафор это не годиться. Если-же по вашему все это относилось к понятиям/терминам области, то такие аргументы тут мало применимы. Почему "аналитический счет" удобный ? Чем ? Вместо него вполне могло оказаться какая-нибудь "трансверзальная окклюзия", и все равно все учили-бы это. Т.е. конечно счет все равно понятнее, но это уже не так принципиально, как в случае метафор. К примеру, слово "транзакция" мне вообще не кажется связанным с тем, что все под ней представляют. Но это не принципиально, ведь это термин (хотя что-то более ясное не помешало-бы). Короче говоря, мы разговаривали о разных вещах
...
Рейтинг: 0 / 0
Ловушка 22
    #34252651
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfУ нас специфическое опытное производство, что (для тех, кто не знаком с термином "опытный" ;) означает, что все изделия считаются уникальными. Даже если идет подряд несколько идентичных изделий, то для бухгалтерии и прочих служб завода они считаются разными .
Все умные книжки по проектированию БД написаны в предположении, что предметная облась не никогда меняется и все заранее известно. На практике это всегда не так. Вам предлагают варианты, которые спасут Вас, когда (условно) завтра придет новый начальник и скажет, что теперь будет все по-другому. Это как правила дорожного движения, за них кто-то в свое время заплатил кровью. При том, что эти варианты не сложнее. Прадигма BOM выпестована десятилетиями и что-то придумывать свое здесь по меньшей мере странно.
...
Рейтинг: 0 / 0
Ловушка 22
    #34252712
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf
Код: plaintext
1.
2.
3.
4.
5.
create table Детали(IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), IDИзделия int)

create table Изделия(IDИзделия int, Заказчик varchar( 100 ), Примечание varchar( 100 ))

create table Деталь_Изделия(IDИзделия int, IDДетали int)
Ээээ, а зачем в таблице Детали поле IDИзделия, если есть таблица Деталь_Изделия?????
...
Рейтинг: 0 / 0
Ловушка 22
    #34252906
Фотография !!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf !!!
В любом случае, у автора топика, в голове каша из услышанных обрывков разговоров производственников, конструкторов, технологов и, возможно, сбытовиков. Автор не отличает документацию и конкретный экземпляр изделия

2 softwarer: Обратите внимание, сделанный вывод, базирующийся на домыслах автора. Ниже еще поговорим о логических выводах. Здесь-же примечательно то, что мое первое образование - инженер-механик машиностроитель, я не просто знаю эту предметную область, а профессионально в ней разбираюсь, и могу работать (и работал на производственных практиках) на многих должностях, автоматизируемой нашей системой.Очередной недоучившийся студент. Я, знаете ли, тоже инженер-механик, специалист по машиностроению и отработал на производстве 5 лет, а последние 10 лет занимаюсь разработкой учетных систем. И неспроста сделал вывод о том, что вы не разбираетесь ни в предметной области, ни в проектировании БД. Но это было бы не так страшно, если бы вы слушали предложения опытных специалистов, которые искренне пытаются вам помочь. Вместо этого вы демонстрируете здесь свое воинствующее невежество.
...
Рейтинг: 0 / 0
Ловушка 22
    #34252908
кгм...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FrankieЭэээ, а зачем в таблице Детали поле IDИзделия, если есть таблица Деталь_Изделия?????
а шоб було :))
Фрумкера«Мужчина от женщины отличается тем, что перед совершением ошибки он всё тщательно продумывает»
ну чо прогресс есть, остался один парадоксальный IDИзделия, автор начал писать скл ...
ставлю рупь, что у автора что-то получится, а то увольняйся, наймите ... не все сразу!
...
Рейтинг: 0 / 0
Ловушка 22
    #34252916
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfУ нас специфическое опытное производство
Кстати, эта фраза меня уже изрядно настораживает. Дело в том, что специфические на первый взгляд задачи склонны в ходе сопровождения становиться все более и более похожими на типовые. Поэтому внесение информации заказа в изделие меня... напрягает; я не стал бы так делать, даже если сейчас они связаны 1:1. Просто потому, что весьма вероятно, это придется переделывать.

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

Поверьте, даже на таком специфическом производстве, как строительство АЭС - мне пришлось иметь с этим дело - были многогдеиспользуемые детали.

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

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

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

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

stenf softwarer
Это очень похоже на рассуждение именно о процедурном коде.

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

Если я говорю "А похоже на Б" - это не "догадка". Это "мнение", которое по необходимости я могу обосновать. Сказанное дальше "если так" Вы, разумеется, деликатно опустили.

stenf softwarer
Это чушь. При outer join ничего carefully account не нужно. carefully account может потребоваться при обработке полученных через outer join результатов

;) очевидно, ваш английский не находиться на идеальном уровне. Речь тут как раз и идет о Null в записях, сгенерированных при отсутствии совпадающих в другой таблице.
Мой английский находится на очень далеком от идеального уровне, впрочем, к данному случаю это отношения не имеет.

Очевидно, Вы в очередной раз не смогли или не захотели понять сказанное. Разжевываю: есть такая операция в реляционной алгебре, join. У нее есть вариация, outer join. Для ее применения никаких особых null учитывать не надо. В результате применения этой операции null values generated to preserve rows. Если эти данные дальше где-то обрабатываются (а не просто выводятся в грид, например), для этих null-ов может потребоваться "специальное внимание" на тех же основаниях, что и для полученных любым другим образом, ничего особенного outer join-ы не вносят.

Отдельно стоит напомнить, что outer join - операция, которая становится более частой как раз при попытке уменьшить количество null-полей в таблицах.

stenfи вы безусловно можете дать ссылку на что-нибудь официальное, где говориться именно о ламерах, способных писать хорошие программы при помощи софта ?
Скажем, рекламные пресс-релизы к Microsoft Access :) Ссылки, к сожалению, не дам - все же с 92-го года прошло немало времени, непросто найти - но впервые эта идея была подчеркнута именно там.

stenfСогласен, что про типичных девелоперов не знающих про null немного спорно, но вот про "anyone querying the data using the SQL language" вполне разумное высказывание.
Ничуть. Те, кто работает с данными именно на SQL - обычно толковые люди, специалисты в своей области, и идею null-ов схватывают очень быстро вместе с пользой от нее. Проблемы я видел у тех людей, кто пользуется визуальными инструментами, а в SQL лезет редко по особой необходимости. Но тут достаточно, чтобы визуальный интерфейс хорошо отрабатывал этот момент, благо это несложно - понятие необязательной связи интуитивное, внимание стоит уделить тонкостям, например вычисляемым атрибутам.

stenfУ нас например такие люди есть. Им нафиг не нужны подробности внутренней архитектуры сервера БД и тонкости языка,
Не надо сводить под одну крышу разные вещи. Внутренняя архитектура им нафиг не нужна, хотя "какие запросы медленные и как писать более быстрые" они схватывают. Тонкости языка.... зачастую они знают язык на уровне лучших разработчиков, просто потому, что для них это "более основной" инструмент, нежели для человека, думающего и о проектировании БД, и о клиенте, и о прочем, чего он успел нахвататься.

null - это не "тонкости языка". Это основа.

stenf softwarerИдеальным цитируемым был бы Кайт.
ах да Кайт, царь и бог мира Оракл, куда-уж без него. Я только не понимаю, какой смысл мне конкретно его цитировать, если вы и так хорошо знаете его публикации.
Я вовсе не так хорошо знаю его публикации, но вопрос не в этом. Вы спросили - я ответил. Если для Вас этот ответ очевиден - зачем спрашивали?

stenfа что, в Оракл пустая строка и null это одно и то-же ?
Да.

stenfИ вы этим, кгхм, гордитесь ?
Нет, ничуть не горжусь. Я этим пользуюсь, очень удобно. После того, как поработал на MSSQL и почуствовал разницу, стал ценить еще больше.

Кстати - следует ли понимать так, что Вы гордитесь mssql-ными unique?

stenfеще одна "пальцемвнебо" догадка.
Не "еще одна", а "та же самая". Которую я Вам разжевал, прямо сказав, что это догадка.

stenfИз мысли про футбольную команду вы вывели отсутствие опыта работы в команде ?
Нет, нисколько. И если не ошибаюсь, не давал повода думать именно так.

stenfПотрясающая логика.
Безусловно. Я уже упоминал, что Ваша логика представляется мне необычной. Например, сказанное Вами в предыдущем предложении мне бы и в голову не пришло. Жаль, конечно, но моя фантазия ограничена.

stenfВы знаете анекдот про логику и аквариум ?
Нет, не знаю, хотя примерно догадываюсь.

stenfТам, где, раз у тебя нет аквариума, то ты голубой ? Сильно напоминает.
Ну... меняйте, если хотите.

stenfа не будете-ли вы так любезны, конечно только в качестве исключения, еще раз прямо и недвусмысленно указать мою ошибку про выводы из цитат ?
Буду любезен. Вы упрекнули меня в движении против течения и заодно откуда-то решили, что null - это "нестандартных ходов и решений". Я ответил цитатой с примерно следующим смыслом: я делаю оптимально, а оказывается ли это "по течению", "против течения" или "поперек течения" - неважно. И тут Вы почему-то решили, что "оптимально" - значит "зачем просто, когда можно сложно" и Вас понесло как Остапа.

Поясняю: оптимально - значит оптимально. Если с некоторой задачей лучше справятся десять дворников, я найму десять дворников и куплю им метлы. Если с некоторой задачей лучше справятся два гуру, я найму двух гур и куплю им гурий. Технологии выполнения дворниками недворницких задач мне неинтересны, поскольку не позволяют достичь хорошего результата. Их потолок - "средний результат при низкой квалификации".

stenfу меня нет причин вам недоверять, но вы все-таки напишите пожалуйста какие параметры вы меряли. Время там, или загрузку ЦП или что-то еще. Я хочу в свободное время поэкспериментировать
Я выкинул все лишнее и мерял время выполнения запроса над табличкой с null- и notnull-полем в ситуации, когда надо было выполнить проверку на null. Конкретнее уже не вспомню.

stenfчестно говоря не понял пойнта. Почему снапшоты окажутся несогласованными и как refresh кнопка в этом поможет
Кнопка рефреш - целиком Ваша задумка, я про нее вроде бы не говорил ни слова, как она поможет - не знаю :)

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

stenfПользователь 1 не увидит нового изделия. Он-же без него загрузился. Если-же изделие наоборот, было удалено например в архив, то при попытке доступа к деталям этого изделия он получит сообщение в духе "список изделий изменился".
А если изделие изменилось? А если он и не должен видеть изделие, пляшет от деталей - скажем, выполнил поиск детали по ее артикулу, а деталь от нового изделия?

stenfа можно еще раз про "прочие" недостатки подхода с доп. таблицами ?
Ээ... больше таблиц, больше join-ов, необходимость постоянно помнить, что надо применить именно outer join, итого большая трудоемкость кодирования и более сложный код. В целом все минусы нарушения принципа старины Оккама.

stenf softwarerПотому что "без null" Вы имеете все шансы получить более склонную к ошибкам систему
Обоснование этой мысли я тоже не помню. Я его пропустил, или его и небыло ?
Пардон, уже не вспомню, было ли оно в конкретном месте, из которого развился этот абзац. В целом оно является основной темой всей дискуссии. Скажем, сколь мне помнится, я приводил примеры запроса "с null" и "без null" как довольно типичного для разницы в сложности того или иного подхода.

stenfСогласен, но я имел ввиду несколько другую ситуацию.....
В случае отказа от третьей таблицы и разрешения null в Детали.IDИзделия, вышеуказанный запрос на детали изделия не измениться. Однако в этом случае столбец IDИзделия nullable и значит требует расшифровки маски.
Хм. Видимо, мы к этому моменту потеряли понимание, раз обсуждали разные ситуации. Я понимал, что мы обсуждаем ситуацию с объединением таблиц изделий и деталей.

Что ж, здесь мы видимо в целом согласны, и напомню, все это идет только в контексте обсуждения трат на null-ы - заметны они или пренебрежимо малы. Вроде бы этот абзац можно дальше не обсуждать.

stenfэто чудо нужно затем, что-бы .....
Я понимаю, зачем оно нужно в текущей реализации. Но оно подозрительно своей особой ролью; я бы предположил, что либо "нулевая сборка есть изделие" в варианте с объединенными таблицами изделий и деталей, либо "нулевая сборка есть одна из многочисленных сборок" в других реализациях. Именно такая роль - в деталях лежит нулевая сборка и только она..... подозрительна.

stenfСпасибо, данная схема действительно представляется более удачной. Однако хотел-бы узнать, чем она лучше/хуже введения третьей таблицы. Или такие решения вообще равноправны ?
Поверхностно, оно лучше соблюдением принципа "не стрелять из пушки по воробьям". Если для хорошего решения задачи достаточно поля, незачем плодить таблицу, тем более таблицу с подчиненными объектами, такими как внешние ключи. Это верно со всех точек зрения: и проектирования (меньше делать, меньше держать в голове), и кодирования (меньше и проще кодировать), и соответственно сопровождения, и трат ресурсов.

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

stenfимхо разница в том, что если у живущего человека появиться дата смерти - то это не будет являться "логическим парадоксом".
Хм. А если у живущего человека появится гражданство - будет являться логическим парадоксом? Напомню, дата смерти - "временный null" в вышеуказанной терминологии, а гражданство - "перманентный".

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

stenfВ самом деле, если появилась дата смерти, то откуда системе знать, ошибка это или человек в самом деле помер ?
Система никогда не может удостоверить корректность введенных данных, она может удостоверить только "явную некорректность". Остальное на совести вводящих.

Но какое отношение это все имеет к постоянным/временным null? Чем логический парадокс для одного отличается от логического парадокса для другого?

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

Напомню: я сейчас пытаюсь показать, что Ваш критерий выбран странно, между "продолжительно временными null" и "потенциально перманентными null" нет какой-то практически значимой разницы.

stenfОднако, проблема совсем другого плана появиться, если в моей схеме (где если IDИЗделия is null, то это корень) в этой ячейке IDИзделия вместо перманентного null возникнет число. В этом случае нулевая сборка станет неразличимой и изделие вообще "изчезнет". Согласитесь, это другой уровень ошибки.
Нет, не соглашусь. Скажем, в ЖКХ есть понятие "ответственный квартиросъемщик". Если у него в "дате смерти" вдруг появится дата, легко произойдет ровно то же самое (достаточно предположить, что в запросе квартиры join-ятся со вьюхой "живых людей").

Если в Вашей системе действует бизнес-правило "у любой системы должна быть нулевая сборка" или подобное - следует придумать, кто и как будет это бизнес-правило контролировать и не допускать его нарушения. null-ы сами по себе тут совершенно не при чем.

stenfОператор системы вполне в состоянии увидеть логическую ошибку живущего мертвеца, а вот изчезнувшее изделие требует вмешательства другого уровня.
Хм. Знаете, я полтора года занимался тем, что разгребал подобные ошибки. А именно "находил подозрительные места в данных, искал, откуда они взялись и как их ликвидировать". Так вот, с точки зрения проблем, "исчезнувшая запись" - самая приятная какая только может быть. Потому, что пользователь, который работал с ней и вдруг не нашел - тут же говорит "исчезло". Или звонит из другого города и говорит "нам в бухгалтерии говорят, что счет уже оплачен, а у нас в списке оплаченных он так и не появился". Или "я пробую ввести, а система говорит мне, что такая запись уже есть, а я ее не могу найти" (это если например срабатывает unique key на каком-нибудь артикуле, номере документа итп). Или что-то еще подобное, быстро и просто, а потому обычно ликвидируется раньше, чем успели возникнуть серьезные последствия.

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

stenfПочему "аналитический счет" удобный ? Чем ?
Об этом уместно спросить тех, кто ими пользуется - аналитиков итп. Если бы был неудобным, придумали бы другую абстракцию, в которой было бы удобно решать те же задачи.

stenfВместо него вполне могло оказаться какая-нибудь "трансверзальная окклюзия", и все равно все учили-бы это.
Ээ... давайте еще раз, четко.

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

Другая абстракция, с другим содержимым - да, могла оказаться вместо этой. Скорее всего и были, и даже будут. "Выживает сильнейший", то есть наиболее удобный.

stenfК примеру, слово "транзакция" мне вообще не кажется связанным с тем, что все под ней представляют.
Ээ... а что "все под ней представляют"? Это слово употребляется в разных областях, в частности в туризме под ним понимают практически перевозку клиентов из пункта А в пункт Б.
...
Рейтинг: 0 / 0
Ловушка 22
    #34252953
Фотография !!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfУ нас специфическое опытное производство, что (для тех, кто не знаком с термином "опытный" ;) Не льстите себе, с точки зрения учета уникальных производств не существует, я бы даже услили это высказывание - все производства одной отрасли одинаковые, да и в разных отраслях, скорее всего, стоит выделить только два вида - непрерывное (например, химическое, металлургическое) и дискретное (это машиностроение, независимо от того, что оно выпускает, сковородки или авиационные двигатели). Впрочем, это лирика.

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

stenfВнутри нашей системы среди прочего, они будут разными еще и потому, что тот факт, что на момент запуска они были идентичны, не означает, что так и будет продолжаться дальше.
Например в подготовленный комплект документов на запуск 5 одинаковых изделий могут быть проведены изменения, касаящиеся только трех их них.Юноша, это и есть перевыпуск КД. На всякий случай, поясню вам, что если изменения в КД внесли на 3 изделия, то и принимать именно эти 3 (а не оставшиеся 2) будут по КД, с учетом внесенных изменений.

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

stenfМогут возникать и другие причины уже в процессе производства, связанные с дополнениями, недочетами и пр.Разумеется, что можно заставить ОТК (и даже ПЗ) принять брак, но, фактически, это, опять-таки, перевыпуск документации.

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

stenf ModelR
ORACLE : CONNECT BY.
MS SQL 2005 : появилась аналогичная фича.

;) я так и думал, что вы предложите что-то подобное. К сожалению, так не получиться. Входимость изделия никогда не забивается "по-порядку". Обычно, от конструкторов приносят отдельные сборки, никак друг с другом не связанные, кроме того, что известна информация об изделии, которому они принадлежат. Т.е. существует длительный промежуток времени, когда каждое дерево изделия содержит несколько голов, и если информация об изделии отсутствует, то по дереву нельзя определить, к какому изделию принадлежит конкретная деталь.
Никакой связи с порядком поступления оператору информации, которую надо заносить в БД предложение CONNECT BY не имеет.Кстати, от конструкторов сборки не приносят, от них могут приносить чертежи сборочных единиц и/или спецификации
...
Рейтинг: 0 / 0
Ловушка 22
    #34252962
Фотография !!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл одну вещь.

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

Подумайте об этом на досуге :)))
...
Рейтинг: 0 / 0
Ловушка 22
    #34254260
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
!!!
Очередной недоучившийся студент

Во первых перестаньте хамить. Если ваш общий стаж 15 лет - то ваш возраст приближается к сороковнику, и хамство в этом возрасте говорит о многом. Во вторых, стаж сам по себе ничего не значит. Бывают и недоучившиеся студенты поумнее убеленных сединами ИТРовцев, а 10-летний стаж проектирования на поверку может оказаться одногодичным стажем, полученным десять раз подряд.
!!!
Не льстите себе, с точки зрения учета уникальных производств не существует

где там у меня написано "уникальное" ? Написано - опытное.
!!!
Дайте определение изделия. Можно на примере.

ну например авиационная катапульта, как раз пойдет в запуск в следующем месяце. Это такой длинный барабан, который крепиться внизу самолета и сбрасывает бомбы. А как это может помочь обсуждению ?
!!!
Юноша, это и есть перевыпуск КД. На всякий случай, поясню вам, что если изменения в КД внесли на 3 изделия, то и принимать именно эти 3 (а не оставшиеся 2) будут по КД, с учетом внесенных изменений.

я уже писал, что наша система не учитывает КД как таковое, наша задача - непосредственно технологическая подготовка и производство.
!!!
В структуре чего?

изделия
!!!
Разумеется, что можно заставить ОТК (и даже ПЗ) принять брак, но, фактически, это, опять-таки, перевыпуск документации.

при чем тут брак ? Это вообще из другой оперы
!!!
Если в вашей системе предполагается некое подобие PDM

нет не предполагается
!!!
Кстати, от конструкторов сборки не приносят, от них могут приносить чертежи сборочных единиц и/или спецификации

8) это вы о чем вообще, понятно что от конструкторов поступает документация, а не сборки "в железе" :)))

softwarer
Дело в том, что специфические на первый взгляд задачи склонны в ходе сопровождения становиться все более и более похожими на типовые. Поэтому внесение информации заказа в изделие меня... напрягает; я не стал бы так делать, даже если сейчас они связаны 1:1. Просто потому, что весьма вероятно, это придется переделывать.

что-то не понял, почему я не должен вносить ссылку на заказ в изделия ? Почему придется переделывать ?
softwarer
Это наивно. Есть две разные операции - "сделать новую деталь и включить вместо старой" и "изменить атрибуты старой". Не следует их путать, ни в собственной голове, ни в интерфейсе, и тогда проблемы не останется.

Поверьте, даже на таком специфическом производстве, как строительство АЭС - мне пришлось иметь с этим дело - были многогдеиспользуемые детали.

Хорошо, согласен, что мое решение возможно необосновано. Когда я проектировал схему, то в первом приближении то-же думал об использовании детали во многих изделиях, однако потом, когда увидел, что изделия могут существовать достаточно независимо, то сделал по-другому. А какие собственно выгоды появяться, если сделать их универсальными ? Ведь по сути, дублирования данных как такового тут нет, если я изменяю аттрибут у одного изделия, то оно и должно отразиться только на одном изделии. Зато в случае "сделать новую деталь и включить вместо старой" появиться необходимость в проведении изменений, ведь ссылка на эту деталь будет находиться в нескольких других таблицах.
softwarer
Если не ошибаюсь, в том, что Вы изначально нарисовали, "подсборок" вообще нет, и чтобы добавить их, придется городить еще один (!) механизм иерархии.

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

опять-таки, почему дублирование ? Если простите пересказ книжной банальности, то дублирование - это когда ФИО автора книги занесено в систему например 2 раза, и исправление ее в одном месте приведет к ошибке - один и тот-же автор в разных местах будет появляться под разным и именем. У нас-же бизнес-правило как раз говорит о том, что изменение должно влиять только на одно место, а не на несколько.
softwarer
Ну и ничего страшного. Хотя несколько странно технологически - я бы предположил, что сначала известна общая схема изделия (из каких блоков оно состоит), потом начинают заполняться отдельные блоки.

ничего страшного нет, но к какому изделию-то деталь относиться вы тогда не определите. В схеме нет ничего странного, если будут вбивать например автомобиль, то вначале могут вбить сборку карбюратора. Информация, куда входит сам карбюратор внесут потом.
softwarer
Если я говорю "А похоже на Б" - это не "догадка". Это "мнение", которое по необходимости я могу обосновать. Сказанное дальше "если так" Вы, разумеется, деликатно опустили.

замечательно, тогда обоснуйте свое мнение
softwarer
Очевидно, Вы в очередной раз не смогли или не захотели понять сказанное. Разжевываю: есть такая операция в реляционной алгебре, join. У нее есть вариация, outer join. Для ее применения никаких особых null учитывать не надо.

нет не так. Вы написали, что цитата In outer-join operations, you should carefully account for NULL values that are generated to preserve rows that don't have a match in the table being joined. является чушью. Ее переводом на русский является В операциях outer-join вы должны внимательно относиться к null, которые генерируются для сохранения строк, которые не имеют совпадений в соединяемой таблице. что чушью не является . Речь идет не об учитывании null при применении операции, а об учитывании null, которые появились в результате этой операции
softwarer
Скажем, рекламные пресс-релизы к Microsoft Access :) Ссылки, к сожалению, не дам - все же с 92-го года прошло немало времени, непросто найти - но впервые эта идея была подчеркнута именно там.

это как раз и смахивает на ваш собственный логический вывод из прочитанной когда-то цитаты ;) Наверняка там речь шла о какой-нибудь технологии, упрощающей создание БД. Вывод о том, что будучи ламером ты неприменно напишешь качественную программу - это уже ваша интерпретация.
softwarer
Не надо сводить под одну крышу разные вещи. Внутренняя архитектура им нафиг не нужна, хотя "какие запросы медленные и как писать более быстрые" они схватывают. Тонкости языка.... зачастую они знают язык на уровне лучших разработчиков, просто потому, что для них это "более основной" инструмент, нежели для человека, думающего и о проектировании БД, и о клиенте, и о прочем, чего он успел нахвататься.

я все-таки имел ввиду людей, для которых sql не является основным инструментом
softwarer
Нет, ничуть не горжусь. Я этим пользуюсь, очень удобно. После того, как поработал на MSSQL и почуствовал разницу, стал ценить еще больше.

Кстати - следует ли понимать так, что Вы гордитесь mssql-ными unique?

у меня есть подозрение, что стоит мне поработать с Оракл, и я тоже начну ценить mssql'ое отличие null от пустой строки ;) А то до этого момента я даже не задумывался о том, как мне повезло :)
Вас кстати, не смущает что равенство null и пустой строки вообще-то противоречит определению null ?
По поводу того, что в mssql в unique столбце разрешен null, но почему-то только один - да согласен, нелогично. Хотя не помню, что-бы это мне приносило какие-то неприятности, возможно просто повезло
softwarer
Буду любезен. Вы упрекнули меня в движении против течения и заодно откуда-то решили, что null - это "нестандартных ходов и решений". Я ответил цитатой с примерно следующим смыслом: я делаю оптимально, а оказывается ли это "по течению", "против течения" или "поперек течения" - неважно. И тут Вы почему-то решили, что "оптимально" - значит "зачем просто, когда можно сложно" и Вас понесло как Остапа.

Если вы еще раз загляните назад, то увидете, что уже после null, я привел пример множественного наследования и указателей, что вы затем обозвали стандартным подходом программиста на VB, и сказали, что предпочитаете другой подход - брать тех, кто разбирается в этом. Извините, но оптимальностью тут не особо пахнет. Пахнет сложностью. Да, это логический вывод, но имхо обоснованный.

Кстати по поводу оптимальности. Проблема в том, что это очень общее понятие. Сказав, что предпочитаете делать оптимально - вы по сути ничего не сказали. Кто в здравом уме специально будет делать неоптимально ?
Зато мысль, что структура и алгоритмы программы должны быть как можно проще и понятнее - имеет некоторую смысловую нагрузку. Если эта мысль сидит у вас в голове, то это непосредственно отразиться на программе. Если-же у вас в голове сидит некая абстрактная оптимальность - вряд-ли это как-то серьезно на что-то повлияет.
softwarer
Снапшоты окажутся несогласованными, поскольку вы - если я правильно понял - кэшируете данные в приложении и никак не проверяете актуальность кэша. Соответственно, часть обрабатываемых данных окажется на момент старта приложения, часть - на актуальный момент. Если не ошибаюсь - признаться, уже лень лезть на предыдущие страницы - контекст был такой, что "запросы, требующие join изделий с деталями у нас редки, потому что изделия мы кэшируем". То есть там, где нужны и подразумевались совмещенные и согласованные данные, идет подстановка из кэша.
...
А если изделие изменилось? А если он и не должен видеть изделие, пляшет от деталей - скажем, выполнил поиск детали по ее артикулу, а деталь от нового изделия?

кэшируется информация об изделиях. Все остальные данные обновляются. Т.е. пользователь видит кэшированные изделия и работает с ними, например выбрал изделие -> появилась актуальная входимость -> редактирует ее.
Поиск по детали тут не имеет смысла, это есть в других модулях, но там и нет подобного кэширования изделий
softwarer
Ээ... больше таблиц, больше join-ов, необходимость постоянно помнить, что надо применить именно outer join, итого большая трудоемкость кодирования и более сложный код. В целом все минусы нарушения принципа старины Оккама.
...
Пардон, уже не вспомню, было ли оно в конкретном месте, из которого развился этот абзац. В целом оно является основной темой всей дискуссии. Скажем, сколь мне помнится, я приводил примеры запроса "с null" и "без null" как довольно типичного для разницы в сложности того или иного подхода.

да, но помнить о необходимости isnull(), coalesce() и пр. вещах ведь тоже надо. Кроме того, слово "типичный" настораживает, типичный для одной области, это может оказаться нетипичным для другой. По сути, вопрос в том, какой подход проще, и вы уверены, что с null ?
softwarer
Я понимаю, зачем оно нужно в текущей реализации. Но оно подозрительно своей особой ролью; я бы предположил, что либо "нулевая сборка есть изделие" в варианте с объединенными таблицами изделий и деталей, либо "нулевая сборка есть одна из многочисленных сборок" в других реализациях. Именно такая роль - в деталях лежит нулевая сборка и только она..... подозрительна.
...
Серьезно... честно говоря, не готов обсуждать. Как в силу текущей даты-времени, так и в силу подозрения, что я бы проектировал изрядно по-другому, а сравнение двух не очень хороших вариантов....

А почему "в деталях лежит нулевая сборка и только она" ? В деталях лежат все сборки, включая нулевую.
А если не секрет, как бы вы спроектировали ?
softwarer
Также, что бы хотелось отметить очень ярко и четко. Давайте придерживаться темы. Напомню, Вы выдвинули тезис об ошибках, которые вносят случайно появившиеся неверные значения. Случайно появившаяся дата смерти определенно внесет ошибки - скажем, человеку перестанет начисляться пенсия, изменится начисление коммунальных платежей и так далее, в зависимости от предназначения ИС. Так или иначе, пойдут генерироваться неверные данные - и поверьте, это самая серьезная ошибка, которая только может быть в ИС.

не спорю
softwarer
Система никогда не может удостоверить корректность введенных данных, она может удостоверить только "явную некорректность". Остальное на совести вводящих.

Но какое отношение это все имеет к постоянным/временным null? Чем логический парадокс для одного отличается от логического парадокса для другого?

дык как бы как раз тем, что в случае с null явная некорректность не может быть проверена. Например есть таблица летательных средств, содержащая самолеты и вертолеты. У вертолетов среди прочего есть аттрибут "количество лопастей", а у самолетов "размах крыла". Соответственно, для вертолетов у размаха крыла будет null (и не простой null, а перманентный, т.е. такой, который там по логике физической реальности ;) никогда не может появиться). Теперь, если случайно там все-таки возникло число, то в запросах "покажи все самолеты с размахом крыла 10 метров" появиться вертолет, что может например привести к аварийному завершению работы клиента.
softwarer
Если в Вашей системе действует бизнес-правило "у любой системы должна быть нулевая сборка" или подобное - следует придумать, кто и как будет это бизнес-правило контролировать и не допускать его нарушения. null-ы сами по себе тут совершенно не при чем.

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

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

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

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

Другая абстракция, с другим содержимым - да, могла оказаться вместо этой. Скорее всего и были, и даже будут. "Выживает сильнейший", то есть наиболее удобный

Некоторое противоречие: сначала вы говорите "Если бы был неудобным, придумали бы другую абстракцию", а затем "могло бы быть названо как угодно".
Я просто к тому, что термины не обязаны быть удобными/понятными, а вот абстракции/метафоры обязаны. Ваш розовый слон претендовал на роль абстракции/метаформы а не термина.
...
Рейтинг: 0 / 0
Ловушка 22
    #34254621
!!!
stenfВнутри нашей системы среди прочего, они будут разными еще и потому, что тот факт, что на момент запуска они были идентичны, не означает, что так и будет продолжаться дальше.
Например в подготовленный комплект документов на запуск 5 одинаковых изделий могут быть проведены изменения, касаящиеся только трех их них.Юноша, это и есть перевыпуск КД. На всякий случай, поясню вам, что если изменения в КД внесли на 3 изделия, то и принимать именно эти 3 (а не оставшиеся 2) будут по КД, с учетом внесенных изменений.

Внесу свои "5 копеек":
На моей прошлой работе (производство резиновых изделий для автомобильной промышленности) эта проблема решалась через нумерацию рецептуры (состава) изделия: изделие 1 рецепт №1, изделие 1 рецепт №2 и т.д. Это шла перманентная отработка технологии: что можно заменить в составе изделия для улучшения его эксплуатационных характеристик, внешнего вида и т.д...
Если это изделие/полуфабрикат входило в другое изделие, то на него также создавался опытный рецепт...
По заводу издавался приказ с какого числа надо опытную рецептуру использовать в производстве и на какое количество продукции/полуфабриката распространяется данная рецептура...
При вводе нарядов оператор просто указывал какое изделие и по какой рецептуре рабочий должен сделать.
Таким образом, номенклатура была одна, отличалась рецептура (состав) изделия...
С одной стороны это кажется более сложным, чем предлагаемая автором схема. Но, при определенной доработке, можно эти подходы неплохо согласовать (например: номенклатурный номер полуфабриката/детали + № рецепта полуфабриката/детали = ID детали)

А связывать деталь с изделием в таблице деталей - на самом деле неразумно...
...
Рейтинг: 0 / 0
Ловушка 22
    #34254631
stenf !!!
Юноша, это и есть перевыпуск КД. На всякий случай, поясню вам, что если изменения в КД внесли на 3 изделия, то и принимать именно эти 3 (а не оставшиеся 2) будут по КД, с учетом внесенных изменений.

я уже писал, что наша система не учитывает КД как таковое, наша задача - непосредственно технологическая подготовка и производство.

Ну, это Вы зря... Какая же подготтовка производства без конструкторской документации...


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

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

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

опять-таки, почему дублирование ? Если простите пересказ книжной банальности, то дублирование - это когда ФИО автора книги занесено в систему например 2 раза, и исправление ее в одном месте приведет к ошибке - один и тот-же автор в разных местах будет появляться под разным и именем. У нас-же бизнес-правило как раз говорит о том, что изменение должно влиять только на одно место, а не на несколько.

softwarer
Ну и ничего страшного. Хотя несколько странно технологически - я бы предположил, что сначала известна общая схема изделия (из каких блоков оно состоит), потом начинают заполняться отдельные блоки.

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

С этим всем справляется предложенная мной схема. Но там много своих проблем и, безусловно, она немного тяжеловесна :(((

stenf softwarer
Система никогда не может удостоверить корректность введенных данных, она может удостоверить только "явную некорректность". Остальное на совести вводящих.
Но какое отношение это все имеет к постоянным/временным null? Чем логический парадокс для одного отличается от логического парадокса для другого?

дык как бы как раз тем, что в случае с null явная некорректность не может быть проверена. Например есть таблица летательных средств, содержащая самолеты и вертолеты. У вертолетов среди прочего есть аттрибут "количество лопастей", а у самолетов "размах крыла". Соответственно, для вертолетов у размаха крыла будет null (и не простой null, а перманентный, т.е. такой, который там по логике физической реальности ;) никогда не может появиться). Теперь, если случайно там все-таки возникло число, то в запросах "покажи все самолеты с размахом крыла 10 метров" появиться вертолет, что может например привести к аварийному завершению работы клиента.

Простите мой офф, но нскажу насчет "вертолетов без крыльев"... Помнится во времена СССР было несколько моделей вертолетов С КРЫЛЬЯМИ (у меня их изображения есть где-то на почтовых марках). Это были "тяжеловозы" - мировые рекордсмены по поднятию тяжестей. Винты у них, как правило, располагались на концах крыльев.
...
Рейтинг: 0 / 0
Ловушка 22
    #34254719
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав СПростите мой офф, но нскажу насчет "вертолетов без крыльев"... Помнится во времена СССР было несколько моделей вертолетов С КРЫЛЬЯМИ (у меня их изображения есть где-то на почтовых марках). Это были "тяжеловозы" - мировые рекордсмены по поднятию тяжестей. Винты у них, как правило, располагались на концах крыльев.
Вообще-то эта штука называется не вертолёт, а винтокрыл.
Ка-22 , например
...
Рейтинг: 0 / 0
Ловушка 22
    #34255150
gybson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые господа, прежде чем постить такие высказывания, следовало-бы более внимательно читать топик. Я уже на это отвечал.
Еще раз, медленно и печально: (С)
У нас специфическое опытное производство, что (для тех, кто не знаком с термином "опытный" ;) означает, что все изделия считаются уникальными. Даже если идет подряд несколько идентичных изделий, то для бухгалтерии и прочих служб завода они считаются разными


Это никак не влияет на решение задачи. Автоматизация такая штука - 1 уже множественное число.
...
Рейтинг: 0 / 0
Ловушка 22
    #34256210
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНет, ничуть не горжусь. Я этим пользуюсь, очень удобно. После того, как поработал на MSSQL и почуствовал разницу, стал ценить еще больше.

Простите, а не кажется вам, что это действительно противоречит сути null?
В Делфи строка s:='' и s:=nil делают далеко не одно и то же. И я не знаю языка, где бы это было бы не так.

Код: plaintext
1.
2.
3.
declare @a char( 10 )
set @a='aaabbb'
select left(@a, 0 )
Возвращает не null, a ''

Код: plaintext
1.
 S:='aaaa';
 S:=Copy(S, 0 , 0 );
S естственно будет ''

Неужели в ORACLE аналог первого даст NULL? Это по меньшей мере подозрительно...
...
Рейтинг: 0 / 0
Ловушка 22
    #34256876
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfчто-то не понял, почему я не должен вносить ссылку на заказ в изделия ? Почему придется переделывать ?
Не "ссылку на заказ", а "информацию заказа". Кроме того, я бы сказал, как раз заказ (позиции заказа) должен ссылаться на изделие.

Попробую почетче. Есть мнение, если угодно, статистическое наблюдение, что задачи, которые сначала кажутся уникальными, в ходе сопровождения постепенно сползают к типовым. Это происходит по двум причинам: во-первых, изменение бизнес-правил склонно идти в сторону проторенных дорог, во-вторых, по мере получения опыта разработчики начинают все больше видеть общность в том, что раньше считали непохожим и неподходящим.

У Вас в изделии присутствовали атрибуты, кажется, заказчик и дата заказа или нечто подобное. Так вот: я бы не стал так делать, потому что по моему мнению, с высокой вероятностью бизнес-правила здесь рано или поздно изменятся так, что этот фрагмент потребуется переделать, и эта переделка окажется сравнительно трудоемкой. Поэтому я бы скорее всего сразу выделил бы сущность "заказы", чтобы потом сравнительно легко перейти к любым другим вариантам (скажем: заказ может включать несколько изделий, каждое изделие может заказываться несколько раз).

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

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

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

Так или иначе, у вас при этом используется определенная элементная база. И рано или поздно, но случатся глобальные операции, скажем, "заменить все диоды серии 12345 диодами серии 12346, такими же по основным характеристикам, но, скажем, на 0.05г более легкими".

stenfкак это нет подсбророк ? Изделие имеет дерево входимости, туда можно занести любую сборку.
Ээ.... дерева я там точно не припомню. Сколь помнится, первым же ответом Вам был как раз "используйте дерево". У меня пока что ощущение, что структура плоская, или я вообще не понял изначальной схемы.

stenfопять-таки, почему дублирование ? Если простите пересказ книжной банальности, то дублирование - это когда ФИО автора книги занесено в систему например 2 раза, и исправление ее в одном месте приведет к ошибке - один и тот-же автор в разных местах будет появляться под разным и именем. У нас-же бизнес-правило как раз говорит о том, что изменение должно влиять только на одно место, а не на несколько.
Хм. Видите ли в чем дело, существуют разные типы изменений. Скажем, если человек поменял фамилию, это не значит, что в БД ранее выпущенных книг должны в одночасье смениться атрибуты автора у давным-давно отпечатанных изданий - те должны лежать под старой фамилией. В то же время, если при вводе данных автора в БД была допущена опечатка, как раз таки изменение должно отразиться везде - эти правила вполне могут действовать одновременно. А в худшем случае может действовать еще и третье правило, скажем, если у нас есть данные из внешнего источника, и мы исправили опечатку, может оказаться, что теперь у нас в справочнике нет того автора, который указан во внешнем источнике (связка по имени распалась) и этот конфликт надо как-либо специально решать.

Так вот, как я упомянул выше, я не верю в то, что у вас каждый используемый винтик абсолютно уникален. "Так не бывает". А раз не бывает - значит, потребуется пройти по всему изделию и исправить ошибку человека, который материалом для винтика М3-18/1 указал дерево. Это другая операция, не та же, что "в конкретном месте использовать вместо него M3-18/2".

stenfничего страшного нет, но к какому изделию-то деталь относиться вы тогда не определите.
Да нет, я имел в виду "вполне решается". Просто пока неизвестно, куда присобачивать сборку, присобачивать к корню. Скажем, карбюратор не бывает сам по себе - поэтому когда вводят его сборку, уже введен (или нетрудно ввести) "автомобиль". К нему и привязать. Когда позже будет введен двигатель - перепривязать к нему.

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

stenf softwarerЕсли я говорю "А похоже на Б" - это не "догадка". Это "мнение", которое по необходимости я могу обосновать. Сказанное дальше "если так" Вы, разумеется, деликатно опустили.
замечательно, тогда обоснуйте свое мнение
OK. В вопросах программирования клиент-серверных приложений, в том числе использования null, можно выделить три основных составляющих:

- Запросы и прочий DML, включая динамически сгенерированные
- Процедурная бизнес-логика (включая триггера, скрипты-батчи и код бизнес-логики на аппсервере или клиенте)
- Интерфейс и прочие задачи клиента.

В цитате сказано "application code", что не дает какой-то конкретной привязки. При этом следующая и логически связанная фраза (You must always add special logic to account for the case of NULL) очевидно неверна, скажем, для задачи "выполнить запрос и вывести его результаты в грид"; таким образом можно предполагать, что имелось в виду не все многообразие "приложения в широком смысле этого слова", а что-то более узкое. Собственно, эта фраза в целом верна для второго пункта и в много меньшей степени - для первого и третьего. Для рассматриваемой фразы верно то же самое - она скорее верна для второго пункта, спорно-неоднозначна для третьего и скорее не верна для первого (пример обратного, который я полагаю типичным, я привел).

Таким образом, создается впечатление, что в этом фрагменте под application code имелся в виду второй пункт.

stenfЕе переводом на русский является В операциях outer-join вы должны внимательно относиться к null, которые генерируются для сохранения строк, которые не имеют совпадений в соединяемой таблице.
Согласен.

stenf что чушью не является . Речь идет не об учитывании null при применении операции, а об учитывании null, которые появились в результате этой операции
Хм. "В операции нужно учитывать" и "нужно учитывать то, что появилось в результате операции" - существенно разные по смыслу высказывания, не находите ли? Подчеркну, "в операциях" - взято из Вашего перевода.

stenfэто как раз и смахивает на ваш собственный логический вывод из прочитанной когда-то цитаты ;)
Наверняка там речь шла о какой-нибудь технологии, упрощающей создание БД. Вывод о том, что будучи ламером ты неприменно напишешь качественную программу - это уже ваша интерпретация.
Ээ... давайте различать выводы и интерпретации. Интерпретация, равно как и авторство конкретной формулировки, безусловно мои. Микрософт вряд ли стал бы обзывать целевую группу "ламерами" :)

Что касается выводов... в "наверняка" Вы промахнулись. Микрософт довольно активно продвигал идею "программировать без программистов", типа того, что специалист сможет решать свои задачи самостоятельно, программируя в Access, чуть позже - в Офисе (тогда Access не входил в состав офиса). Для этого делалось довольно много всего, в частности в тот же акцес включался набор заранее разработанных типовых БД, какие-то визарды вида "отметьте, какие поля в стандартных сущностях вам нужны и получите готовую БД" итп.

В этом направлении воз и ныне там, и несколько позже Микрософт пошел по другому пути, довольно явно ориентируясь на массу малограмотных разработчиков как на основную движущую силу индустрии. Как типовой пример, сошлюсь на пару раз обсуждавшийся в Сравнении СУБД механизм работы MSSQL с параметрами; если позволите краткий вывод, этот механизм микширует последствия неудачно написанного кода ценой повышенной вероятности замедления удачно написанного.

stenfя все-таки имел ввиду людей, для которых sql не является основным инструментом
Я сказал "более основной" :) Не знаю, может мне попадались не все категории людей, но я практически не встречал пользователей, которые бы плохо знали SQL, но при этом активно им пользовались. Точнее, я такого встретил в единственном экземпляре.

stenfу меня есть подозрение, что стоит мне поработать с Оракл, и я тоже начну ценить mssql'ое отличие null от пустой строки ;)
Все может быть, но не думаю. Впрочем, не вижу смысла поднимать здесь обсуждение еще и этой темы.

stenfВас кстати, не смущает что равенство null и пустой строки вообще-то противоречит определению null ?
"Смущать" меня это определенно не смущает. Я это знаю и рад, что Oracle в данном случае сделал правильный выбор. Если посмотрите другие мои сообщения в форуме, увидите, что я сторонник таких точек зрения, как

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

и


Стандарт - дело хорошее до тех пор, пока стандарт хорош. Там, где стандарт плох, стандарт идет в баню.

stenfПо поводу того, что в mssql в unique столбце разрешен null, но почему-то только один - да согласен, нелогично.
Это не то что "нелогично", а в первую очередь ровно так же противоречит стандарту. Почему и упомянул здесь, чтобы показать, что нарушение стандарта не является ноу-хау оракла :)

stenfХотя не помню, что-бы это мне приносило какие-то неприятности, возможно просто повезло
Это не то что приносит неприятности... просто в результате становится практически невозможным наложить unique constraint на nullable поле. Скажем, тот же ИНН - как мы говорили выше, его может не быть, но уж если он есть, он должен быть уникальным. Чтобы реализовать такое с помощью mssql-ных unique, придется извращаться, например таки вынести в отдельную таблицу.

stenfЕсли вы еще раз загляните назад, то увидете, что уже после null, я привел пример множественного наследования и указателей, что вы затем обозвали стандартным подходом программиста на VB, и сказали, что предпочитаете другой подход - брать тех, кто разбирается в этом.
Да, сказал.

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

Я в свое время играл в гандбол и нежно люблю эту игру, но есть одна проблема - на серьезном уровне требования к гандболистам примерно как к баскетболистам, а у меня рост 167. Даже на малосерьезном уровне, играя против много более высоких оппонентов, мне приходилось действовать по собственной тактике, "не по-книжному".

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

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

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

stenfКто в здравом уме специально будет делать неоптимально ?
О, сколько угодно (если под "в здравом уме" полагать "считающих, что находятся в здравом уме"). В частности, "идти по течению" - заведомо неоптимальный алгоритм, что доказывается пресловутым "если все прыгнут из окна", однако алгоритм весьма и весьма популярный.

stenfЗато мысль, что структура и алгоритмы программы должны быть как можно проще и понятнее - имеет некоторую смысловую нагрузку.
Смысловую нагрузку эта мысль имеет, вот только она неверна :)))

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

Я бы сказал, для разных задач существует разная степень "оптимальной простоты". Скажем, для очень простых задач клиент-серверная архитектура неоптимальна, старое-доброе "все на клиенте" проще и не хуже. Но для более сложных задач - становится "проще и хуже", а потом так и "сложнее и хуже".

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

stenfда, но помнить о необходимости isnull(), coalesce() и пр. вещах ведь тоже надо.
Ээ.... мне изменяет память или это "почти синонимы"? То есть всех прочих вещей в первом приближении одна штука :)

Знаете, это на уровне личного мнения, но я совершенно не ощущаю необходимости о них "помнить", причем не потому, что старый-умный-делаю на автомате, но даже в самые первые месяцы работы с БД.. не ощущал. Точнее, я могу назвать единственный случай, когда о них надо помнить - если используется агрегатная функция, скажем sum, которая может вернуть null по пустой выборке. Вот тут люди не так редко забывают об этой детали - но она уже от null-полей практически не зависит.

stenfКроме того, слово "типичный" настораживает, типичный для одной области, это может оказаться нетипичным для другой.
Согласен, рассуждение имеет право на существование, но... "область" тут не очень к месту, дело скорее в каких-нибудь подходах к проектированию итп.

"Типично" в данном случае - по моему опыту, включающему в себя работу с изрядным количеством разных БД, спроектированных разными людьми.

stenfПо сути, вопрос в том, какой подход проще, и вы уверены, что с null ?
"Уверен" - да. Поскольку уверенность статистическая, передать ее трудно - почему я и ограничился примером и "утверждением на правах мнения" что именно такая пропорция сложности типична.

stenfА почему "в деталях лежит нулевая сборка и только она" ? В деталях лежат все сборки, включая нулевую.
Ээ... боюсь, по указанной в первом письме структуре я этого тем более не понял.

stenfА если не секрет, как бы вы спроектировали ?
Мне кажется, я уже говорил, я не хочу рассуждать об оптимуме, не владея ни областью, ни полной постановкой задачи. Начал я бы со знакомства с неоднократновышеупомянутым BOM.

stenf softwarerСистема никогда не может удостоверить корректность введенных данных, она может удостоверить только "явную некорректность". Остальное на совести вводящих.

Но какое отношение это все имеет к постоянным/временным null? Чем логический парадокс для одного отличается от логического парадокса для другого?

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

stenfНапример есть таблица летательных средств, содержащая самолеты и вертолеты. У вертолетов среди прочего есть аттрибут "количество лопастей", а у самолетов "размах крыла". Соответственно, для вертолетов у размаха крыла будет null (и не простой null, а перманентный, т.е. такой, который там по логике физической реальности ;) никогда не может появиться). Теперь, если случайно там все-таки возникло число, то в запросах "покажи все самолеты с размахом крыла 10 метров" появиться вертолет, что может например привести к аварийному завершению работы клиента.
И таки правильно в ответах упомянули винтокрылы, хороший пример на тему соответствия реальности, бизнес-правил и прочего :)

Однако, оставим их в стороне и по сути. У Вас здесь есть один тонкий, незаметный переход, играющий важную роль. Если у Вас запрос "покажи все самолеты", то вертолет туда не попадет. Почему - потому что в запросе так или иначе будет фильтр "на самолеты". Скажем, "... and construction_type = 1". В случае с пристыковочными таблицами фильтром может выступать join, скажем, "Летательные_Аппараты join Атрибуты_Самолетов" дадут фильтр по самолетам. Если же запрос к "летательным аппаратам", появление там вертолета нормально.

Теперь давайте подробнее про фильтр. Если используется поле типа или нечто подобное, с этим все просто. Допустим, Вы решили использовать атрибут "размах крыла" как признак самолета, и пишете запрос примерно как

Код: plaintext
1.
2.
select *
from Летательные_Аппараты
where Размах_Крыла >  10 

В этом случае, раз уж среди бизнес-правил Вашей разработки есть "ЛА суть либо самолеты, либо вертолеты", Вы обязаны позаботиться о том, за счет чего будет реализовано это либо-либо. Например, сделать так:

Код: plaintext
1.
alter table Летательные_Аппараты add constraint Летательные_Аппараты_Тип check (
  nvl2 ( Размах_Крыла,  0 ,  1  ) + nvl2 ( Количество_Лопастей,  0 ,  1  ) =  1  ) ;

В этом случае никакое число "случайно не появится", и проблемы не будет. Если Вы не обеспечили проверку заложенного в систему бизнес-правила - виноваты в этом Вы, никак не null.

И вот теперь давайте посмотрим с другой стороны: как Вы собираетесь обеспечить проверку аналогичного правила, если Вы вынесли атрибуты в отдельные таблицы? Есть ли у Вас простой способ сказать СУБД, что "расширением к ЛА должны быть либо атрибуты самолетов, либо атрибуты вертолетов, но не те и другие сразу"?

На самом деле есть. Если у Вас ЛА ссылается на детали, а не наоборот, то Вы будете должны сделать поля ссылок на каждую из детализаций и связать эти поля в точности таким же check-ом, как приведен выше (он называется arc, "дуга"). То есть никакой разницы. Если Вы этого не сделаете, будут ровно те же проблемы, в частности будет возможно существование ЛА не являющихся ни самолетом, ни вертолетом, равно как и существование ЛА, являющихся тем и другим одновременно. Ну и естественно, следующие из этого проблемы.

stenf softwarer
Если в Вашей системе действует бизнес-правило "у любой системы должна быть нулевая сборка" или подобное - следует придумать, кто и как будет это бизнес-правило контролировать и не допускать его нарушения. null-ы сами по себе тут совершенно не при чем.

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

stenfв случае с вертолетами запись не изчезнет, а может привести к лишней записи, а то и к unhandled exception на клиенте
Ээ... давайте соблюдать тему. Отдельно говорить про исчезнувшие строки - в Вашем примере с исчезнувшим изделием, отдельно про строки появившиеся, в другом Вашем примере с вертолетом. У нас и так длинная дискуссия, и если мы начнем переплетать ее ветви, точно концов не найдем.

Про исчезнувшие строки, надеюсь, разобрались, я полагаю соответствующий аргумент дезавуированным. С лишними строками может быть очень много чего, варианты вряд ли реально перебрать. Скажем, запрос "покажи все самолеты с размахом крыла 10" типичен для пользовательских фильтров, динамического where и подобных задач. А там в большинстве случаев результат будет одинаков и в структуре с null-атрибутами, и в структуре с расширяющими таблицами (почему - потому что программистам чаще всего лень анализировать, нужно ли включать таблицу во from, они пишут безусловные join, а далее в where отсекают по введенным условиям. Это плохо, но это так).

stenfНекоторое противоречие: сначала вы говорите "Если бы был неудобным, придумали бы другую абстракцию", а затем "могло бы быть названо как угодно".
Если Вы видите противоречие, значит Вы не поняли, что я имел в виду. Или я плохо сказал. Я постарался максимально четко отделить ситуации "разные по сути абстракции" и "одна по сути абстракция, быть может названная тем или иным термином".

stenfЯ просто к тому, что термины не обязаны быть удобными/понятными, а вот абстракции/метафоры обязаны.
Снова здорово. Говорили-говорили, теперь Вы снова безосновательно выдвинули исходное утверждение.

Не обязана абстракция быть понятной. Она обязана быть "удобной и при этом по возможности понятной".
...
Рейтинг: 0 / 0
Ловушка 22
    #34256935
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieПростите, а не кажется вам, что это действительно противоречит сути null?
Возникает вопрос, что есть суть null :)

Оно безусловно противоречит определению null из стандарта, и скорее всего из тех источников, на основании которых формировался стандарт. Что же до сути..... давайте я приведу пример, в котором определение null из стандарта очевидно неудачно. Это случай, когда в типе данных уже есть значение, "очень похожее на null во всем смыслах". Очевидно, что наличие второго null вызовет существенные неудобства, согласны?

Пустая строка, конечно, не совсем null, но как оказывается, в единственном случае, где они практически различны (конкатенация строк), null как раз не дает преимуществ, исключительно неудобства. Мало того, если подумать о таких операциях, как join по строковому полю (изврат, конечно, но раз уж взялись сравнивать - например по какому-нибудь артикулу или коду изделия) - окажется, что null-овское поведение пустых строк при join-е очень даже правильно.

FrankieВ Делфи строка s:='' и s:=nil делают далеко не одно и то же.
Вы в этом действительно уверены? А проверяли?

Ваше утверждение вообще говоря не совсем корректно, поскольку строка s := nil, например в используемой мной D7 является синтаксически неверной, но если сделать то же корректно, например s := PChar(nil), я уверен, результат будет одинаковым (если посмотрите в ассемблерный отладчик - увидите, что оба варианта сводятся к вызову системной функции LStrClr).

Frankie
Код: plaintext
1.
 S:='aaaa';
 S:=Copy(S, 0 , 0 );
S естственно будет ''
Вот как? А попробуйте вот так:

Код: plaintext
1.
2.
  S := 'aaaa' ;
  S := copy ( S,  0 ,  0  ) ;
   if  pointer ( S ) =  nil   then  ShowMessage ( 'nil' )  else  ShowMessage ( 'Oops' ) ;
...
Рейтинг: 0 / 0
Ловушка 22
    #34258219
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВозникает вопрос, что есть суть null :)
Отсутствие значения есть суть null.

softwarerЭто случай, когда в типе данных уже есть значение, "очень похожее на null во всем смыслах". Очевидно, что наличие второго null вызовет существенные неудобства, согласны?
Какого ещё второго null? И как это так, что в типе данных уже есть значение? Конечно, реализация языка часто приписывает это значение, когда переменная определяется, но в большинстве случаев это и есть null / nil.

В остальном согласен, проверил:
Код: plaintext
1.
2.
3.
4.
5.
6.
  V:=PChar( nil );
  S:='';
   if  V = S  then  ShowMessage ('ogo');

  S:='aga'
  V:=V+S;
  ShowMessage (V);
Увидем и ого, и ага ))

С эстетитечкой точки зрения у меня это вызывает неприязнь, но нельзя не признать, что это весьма удобно! Интересно как на этот счёт ведут себя другие языки...
...
Рейтинг: 0 / 0
Ловушка 22
    #34258512
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)

FrankieКакого ещё второго null? И как это так, что в типе данных уже есть значение?
Если мне не изменяет память, стандарт определяет null как "значение, отличное от любого другого", попросту расширяет алфавит неким спецсимволом и дает ему специфическую роль.

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

FrankieКонечно, реализация языка часто приписывает это значение, когда переменная определяется, но в большинстве случаев это и есть null / nil.
Хм. Поймите: sql-ный null, паскалевский nil, дельфовый null, сишный NULL - это не то чтобы все совсем одно и то же. Это разные вещи, не стоит их безоговорочно смешивать.

FrankieИнтересно как на этот счёт ведут себя другие языки...
Ява - если не изменяет память, аналогично. В сях и сипласпласах нет стандартного класса строки, зависит от реализации. Там, где используется PChar или char*, в принципе зависит от реализации, от того, как обрабатывается этот момент. Скажем, большинство функций WinAPI понимают nil как пустую строку, но есть исключения, некоторые падают.
...
Рейтинг: 0 / 0
Ловушка 22
    #34258742
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)
Но в эту суть вполне не укладываются ваши рассуждения о неком спецсимволе null.

softwarerЕсли мне не изменяет память, стандарт определяет null как "значение, отличное от любого другого", попросту расширяет алфавит неким спецсимволом и дает ему специфическую роль.
Ловко вы, однако, приравняли "значение" и "спецсимвол"! Конечно, подобная трактовка может быть реализована, но думается, что на деле нету никакого символа, а есть просто нулевой указатель (в никуда).

softwarerВ принципе может случиться так, что в типе данных уже есть подобный спецсимвол, значение, играющее подобную же роль. В таком случае наличие различных между собой "sql-ного null" и "внутритипового спецсимвола с тем же смыслом" создает значительные неудобства, и будет вполне логично их отождествить. Авторы стандарта не предусмотрели этого момента, это их недочет.
Интересно какие? Вроде как при перетаскивании информации на клиент типы данных из запроса приводятся в наиболее близкие клиентские. Так что на sql-null приложению плевать. Отождествить? Не согласен. В БД null это пустая ячейка, в программировании - указатель в никуда. Память программы - не база данных, всё ж.

softwarerХм. Поймите: sql-ный null, паскалевский nil, дельфовый null, сишный NULL - это не то чтобы все совсем одно и то же. Это разные вещи, не стоит их безоговорочно смешивать.
С sqlным конечно. А в остальном так не вижу особой разницы (наверняка она есть для низкоуровневых программ), гораздо важнее как ведут себя с нуллом операторы.
...
Рейтинг: 0 / 0
Ловушка 22
    #34258798
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пару слов по теме: какая-то у автора странная nullофобия. Блин, ну раз в любой СУБД эта вещь есть и есть немало средств по работе с ним, то зачем-то она нужна? Так изучите и пользуйтесь!
...
Рейтинг: 0 / 0
Ловушка 22
    #34259291
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL и NULL: Можно обойтись без NULL в исходных таблицах (только много их будет), но без NULL невозможен Outer Join, что уж совсем скучно.
Ну а если NULL все равно пролез, так почему бы не использовать и в таблицах - будет их поменьше. Так что
Frankieизучите и пользуйтесь!
+1
...
Рейтинг: 0 / 0
Ловушка 22
    #34259366
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRно без NULL невозможен Outer Join
Это ошибочное утверждение.
...
Рейтинг: 0 / 0
Ловушка 22
    #34259775
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieЛовко вы, однако, приравняли "значение" и "спецсимвол"!
Хм. Если посмотрите книги по алгоритмам и более-менее формальным аспектам программирования, начиная от машины Тьюринга, обнаружите частно используемый прием: говорят об алфавите (например, возможных составляющих входных данных) и расширяют его некоторыми специально обозначенными символами, играющими роль маркеров итп. Это позволяет удобно и наглядно излагать теоретические выкладки, не перегружая их очевидными, но объемными техническими деталями. Спецсимвол здесь - именно в этом смысле, ничего особо ловкого, признаться, не вижу.

FrankieКонечно, подобная трактовка может быть реализована, но думается, что на деле нету никакого символа, а есть просто нулевой указатель (в никуда).
Нулевой указатель и указатель в никуда - разные вещи. То, что в частном случае второе реализуется первым - это именно что частный случай, полагаться на который не рекомендуется.

Далее, тот же sql-ный null определенно не является "нулевым указателем".

Наконец, различайте символ (null) и его реализацию. null, равно как и nil - это не просто значение, это ключевые слова языка (sql и pascal соответственно). Это обозначение некоего специального понятия, спецсимвол.

FrankieИнтересно какие? Вроде как при перетаскивании информации на клиент
А при чем тут вообще клиент? Клиент - это отдельная песня.

Какие - неопределенность. Скажем, представьте себе, что в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие?

password <> '' ?

password is not null ?

( password <> '' ) and ( password is not null ) ?

length ( password ) > 0 ?

any other idea?

Для того, чтобы такого вопроса не возникало, придется принимать дополнительное соглашение, скажем считать, что для строковых полей пустота - это пустая строка, а null - "логический парадокс", которого в поле никогда не должно быть, иначе обрушится вся бизнес-логика.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260187
softwarer FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)



Извиняюсь, что встреваю в вашу задушевную беседу :)
но null это всет таки неопределенное значение, а пустая строка это конкретно пустая строка. Сумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно.
Именно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковых
...
Рейтинг: 0 / 0
Ловушка 22
    #34260261
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковыхЕсли интерпретировать null как пустую строку, то с выводами можно было бы согласиться. В случае же понимания null именно как неопределенной величины, то, по стандарту ANSI, один null не равен другому и соответственно ограничение вида UNIQUE должно позволять любое множество таких значений. И с этой точки зрения MSSQL, например, нарушает данное требование стандарта, пусть даже такое ограничение и возможно сэмулировать.
Кстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34260263
ChA Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковыхЕсли интерпретировать null как пустую строку, то с выводами можно было бы согласиться. В случае же понимания null именно как неопределенной величины, то, по стандарту ANSI, один null не равен другому

Эта не вся правда. Другая правда это то, что условие один null не равен другому тоже фальш - любое сравнение с null дает фальш. Потому как значение не определено. В этом-то и логическая тонкость null. Но на этом вся его тонкость и заканчивается.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260264
ChAКстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ?

Inormix интерпретирует естественно как null и естественно второе значение запрещает.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260278
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренкоусловие один null не равен другому тоже фальш - любое сравнение с null дает фальш.Не совсем так, с появлением null логика становится трехзначной SQL2003a) If either XV or YV is the null value, then
X <comp op> Y
is Unknown . Думаю согласитесь, что Unknown и False - вещи немного разные ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34260717
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Чиатл в какой-то книге по основам программирования, что компьютерная логика на самом деле и есть трёхначная - false, true и null. Но фокус в том, что null, как верно нас одёрнули ниже - это не символ - это именно неопределённое значение и, конечно же, двух одинаковых null не бывает. Именно потому, что значение неопределено, а компьютер "палить наугад" права не имеет, пусть надо "угадать" из всего из двух.

softwarerНулевой указатель и указатель в никуда - разные вещи. То, что в частном случае второе реализуется первым - это именно что частный случай, полагаться на который не рекомендуется. Далее, тот же sql-ный null определенно не является "нулевым указателем".

Согласен со всем, погорячился :/

softwarer FrankieИнтересно какие? Вроде как при перетаскивании информации на клиент А при чем тут вообще клиент? Клиент - это отдельная песня.
Вы же практик? Так на практике важно, как клиент обработает поступивший от сервера NULL.

softwarer
Скажем, представьте себе, что в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие?
password <> '' ?

password is not null ?
( password <> '' ) and ( password is not null ) ?

length ( password ) > 0 ?

any other idea?

Могу обосновать, если хотите...

Отдельное спасибо вступившимся участникам дискуссии, очень интересно )))
...
Рейтинг: 0 / 0
Ловушка 22
    #34260753
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)

Простите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;)
...
Рейтинг: 0 / 0
Ловушка 22
    #34260916
ChA Александр Федоренкоусловие один null не равен другому тоже фальш - любое сравнение с null дает фальш.Не совсем так, с появлением null логика становится трехзначной SQL2003a) If either XV or YV is the null value, then
X <comp op> Y
is Unknown . Думаю согласитесь, что Unknown и False - вещи немного разные ?
Разговор не шел про is null. С ним как раз все понятно: либо нал либо не нал :)

Я как раз про ваш вывод "один null не равен другому и соответственно ограничение вида UNIQUE должно позволять любое множество таких значений". Он неверен, потому что основан только на одной половинке правды. Вернее "один null не равен другому" как раз и не правда :)
X = NULL;
Y = NULL;
Z = 0;
IF X <> Y THEN Z = 1;

Значение Z останется 0.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260977
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоОн неверен, потому что основан только на одной половинке правды. Вернее "один null не равен другому" как раз и не правда :)
X = NULL;
Y = NULL;
Z = 0;
IF X <> Y THEN Z = 1;

Значение Z останется 0.
Занятно

Но:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @a int;
declare @b int;

set @a = null;
set @b = null;

if @a <> @b set @a =  1 
select @a

if @a = @b set @a =  1 
select @a
В обеих случаях @a - NULL. А всё потому, что NULL это неопределённое значение, а значит никаких логических выводов на его основе делать невозможно, кроме is (not) null.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260998
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов ModelRно без NULL невозможен Outer Join
Это ошибочное утверждение.Плз подробнее.
XAB1p
YAC2q
Select X.*, Y.C from X left join Y on X.A=Y.A
JoinABC1p ??
...
Рейтинг: 0 / 0
Ловушка 22
    #34261070
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренко Он неверен, потому что основан только на одной половинке правды. Вернее "один null не равен другому" как раз и не правда :)
X = NULL;
Y = NULL;
Z = 0;
IF X <> Y THEN Z = 1;

Значение Z останется 0.
Правда.
IF X <> Y or not (X <> Y) or X=Y or not (X=Y ) THEN Z = 1;
Значение Z все равно останется 0, ибо все эти сранения не дадут ни ЛОЖЬ ни ИСТИНА, а лишь
х.е.з.

Но не всегда правда.
GROUP BY исправно все NULL сгруппирует в единственную строчку.
в ORACLE Decode(NULL, NULL, 1, 0) будет 1 - успешно сравнилось.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261184
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренконо null это всет таки неопределенное значение,
Есть и такая трактовка. Но с логической точки зрения она далеко не всегда удобна; скажем, она вполне оправдывает nullофобию топикстартера (согласитесь, "цена не задана" - вполне нормальная составляющая бизнес-модели, а вот "цена есть, но неопределенна" - мягко говоря, нелогично).

Александр ФедоренкоСумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно.
Это может быть и "естественно", хотя я с этим не соглашусь, но не удобно.

Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null
1. Кто сказал, что не могут?
2. А почему именно более двух, а не более одного или более трех?
...
Рейтинг: 0 / 0
Ловушка 22
    #34261205
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAКстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ?
Разрешит.

Александр Федоренколюбое сравнение с null дает фальш.
Это неправда, причем заведомая неправда, противоречащая стандарту.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> declare
   2     b boolean ;
   3   begin
   4     b := ( null = null ) ;
   5     if b then
   6       dbms_output.put_line ( 'true' ) ;
   7     elsif not b then
   8       dbms_output.put_line ( 'false' ) ;
   9     else
  10       dbms_output.put_line ( 'not true but not false also' ) ;
  11     end if ;
  12   end ;
  13   /

not true but not false also

PL/SQL procedure successfully completed
...
Рейтинг: 0 / 0
Ловушка 22
    #34261220
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sgt.PepperПростите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;)
Потому что для нуля в обычном его смысле - поле вещественных чисел и все такое - не выполняется сказанное мной требование "уже есть подобный спецсимвол, значение, играющее подобную же роль". Ноль не играет подобной роли, соответственно притягивание его к null-у будет неудобным.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261261
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоInormix интерпретирует естественно как null и естественно второе значение запрещает.
Значит, Informix, как и MSSQL, нарушает в этом месте стандарт ANSI. Спасибо, будет лишняя информация к очередному разговору с любителями действовать "строго по стандарту".

FrankieЧиатл в какой-то книге по основам программирования, что компьютерная логика на самом деле и есть трёхначная
Хм. Боюсь Вас шокировать, но никакого "на самом деле" не существует. Компьютерная логика - такая, какая заложена в железяки и софт, какую захотим, такую и сделаем. В железки заложена бинарная логика, для реляционных баз используется трехзначная (точнее - один из вариантов трехзначной логики), для конкретного приложения, если нужно, я легко могу запрограммировать хоть восьмизначную - не суть.

Frankie softwarerА при чем тут вообще клиент? Клиент - это отдельная песня.

Вы же практик? Так на практике важно, как клиент обработает поступивший от сервера NULL.
Важно, но это совершенно отдельный вопрос, не имеющий никакого отношения к обработке NULL сервером. С точки зрения клиента мне представляется наилучшим, если клиент имеет адекватный инструмент, клиентский null.

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

А обосновать можно любой из этих ответов.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261278
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRПлз подробнее.
null в outer join - всего лишь дефолт, подставляемый в определенных случаях. Достаточно дополнить синтаксис выражений в селекте конструкцией default тра-ля-ля чтобы получить outer join, не испытывающий никаких проблем от отсутствия концепции null.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261289
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Sgt.PepperПростите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;)
Потому что для нуля в обычном его смысле - поле вещественных чисел и все такое - не выполняется сказанное мной требование "уже есть подобный спецсимвол, значение, играющее подобную же роль". Ноль не играет подобной роли, соответственно притягивание его к null-у будет неудобным.
Простите, возможно не очень хорошо понял идею "спецсимвола". Не могли бы Вы пояснить подробнее, по возможности с примером?

'softwarer' + null = null (не удобно)
'softwarer' + '' = 'softwarer' (удобно)

4213 + null = null (не удобно)
4213 + 0 = 4213 (удобно)

Это я пытаюсь следовать Вашей логике "как я ее понял". И пусть стандарты идут лесом :))
...
Рейтинг: 0 / 0
Ловушка 22
    #34261295
Frankie

В обеих случаях @a - NULL. А всё потому, что NULL это неопределённое значение, а значит никаких логических выводов на его основе делать невозможно, кроме is (not) null.

Совершенно верно. Относительно же уникального индекса: два неопределенных значения вполне могут "оказаться" двумя одинаковыми. Именно поэтому два нала не разрешается в уникальном индексе, а не потому, что два нала это равные значения :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34261363
softwarer Александр Федоренконо null это всет таки неопределенное значение,
Есть и такая трактовка. Но с логической точки зрения она далеко не всегда удобна; скажем, она вполне оправдывает nullофобию топикстартера (согласитесь, "цена не задана" - вполне нормальная составляющая бизнес-модели, а вот "цена есть, но неопределенна" - мягко говоря, нелогично).

Цена не задана, т.е. не определена, т.е одно и то же. Цена есть как свойство товара, но неопределена (пока еще) как значение этого свойства. Чего-то вы мудрите уважаемый на пустом месте.


softwarer
Александр ФедоренкоСумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно.
Это может быть и "естественно", хотя я с этим не соглашусь, но не удобно.

А чего тут может быть сомнительного? Если к "неопределенному" добавит "определенное", то .естественно. получится неопределенное. По определению Это надо принять как есть.
А неудобно кое что делать на потолке, как известно.


softwarer
Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null
1. Кто сказал, что не могут?
2. А почему именно более двух, а не более одного или более трех?

1. В данном случае я сказал :) Проверил на СУБД, с которой работаю.
2. А вот тут вы пожалуй правы: я бы и одно вхождение запретил, если по логике. Наверное реализоторы этой логики в субд пошли на компромис, для того, чтобы вообще можно было использовать поля с налом и уникальным индексом.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261439
ModelR
Но не всегда правда.
GROUP BY исправно все NULL сгруппирует в единственную строчку.

Ага, еще один компромис :)

ModelR
в ORACLE Decode(NULL, NULL, 1, 0) будет 1 - успешно сравнилось.

Да, в Informix тоже, как сами NULL так и переменные со значением NULL. Работает по принципу функции IS NULL.
Никакой логики в этой логики :))
Однако это не мешает писать нормальный код, если это знать :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34261514
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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" представляется удобным. И действительно, пусть плохие стандарты идут лесом.

Стандарты - это отдельная большая тема. В целом, если стандарт обеспечивает ситуацию "всем одинаково плохо", он меня не привлекает :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34261535
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.
SQL> declare
   2     b boolean ;
   3   begin
   4     b := ( null = null ) ;
   5     if b then
   6       dbms_output.put_line ( 'true' ) ;
   7     elsif not b then
   8       dbms_output.put_line ( 'false' ) ;
   9     else
  10       dbms_output.put_line ( 'not true but not false also' ) ;
  11     end if ;
  12   end ;
  13   /

not true but not false also

PL/SQL procedure successfully completed

А здесь вы сами подтвержаете мои слова: не прошло ни одно из сравнений перемой со значением null )
...
Рейтинг: 0 / 0
Ловушка 22
    #34261543
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоЦена не задана, т.е. не определена, т.е одно и то же.
Нет, это не одно и то же. Это Вы сказали "то есть" на то, что синонимами не является.

Александр ФедоренкоЦена есть как свойство товара,
А кто сказал, что цена - это обязательное свойство товара? Нет ее. До тех пор, пока не придет кто-то и не скажет, быть может произвольно, быть может на что-то опираясь: "цена такова". Вот допустим Вы прямо сейчас взяли молоток, пилу, доску и сделали табуретку. Какова ее цена, которая есть как свойство товара?

Александр ФедоренкоЭто надо принять как есть.
Кому надо, и зачем?

Александр ФедоренкоА неудобно кое что делать на потолке, как известно.
В том числе и это. И если стандарт загоняет на потолок - стандарт идет в сауну.

Александр Федоренко1. В данном случае я сказал :) Проверил на СУБД, с которой работаю.
Я могу прямо сейчас проверить на трех СУБД и если не изменяет память, получить три разных результата :)

Александр Федоренко2. А вот тут вы пожалуй правы: я бы и одно вхождение запретил, если по логике. Наверное реализоторы этой логики в субд пошли на компромис, для того, чтобы вообще можно было использовать поля с налом и уникальным индексом.
А смысл? "Поле с единственным null" - самая бессмысленная конструкция, какую только можно представить. Мне не известно ни одного примера из обычной жизни, когда она удобна, и в нескольких беседах на эту тему никто примера так и не привел.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261677
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХм. Боюсь Вас шокировать, но никакого "на самом деле" не существует. Компьютерная логика - такая, какая заложена в железяки и софт, какую захотим, такую и сделаем. В железки заложена бинарная логика, для реляционных баз используется трехзначная (точнее - один из вариантов трехзначной логики), для конкретного приложения, если нужно, я легко могу запрограммировать хоть восьмизначную - не суть.
Я знаю, что мира "на самом деле" вообще не существует
Также я знаю, что "большой взрыв" в информатике произошёл в 1930е годы. Булева алгебра уже давно существовала, но тогда нашли физическую реализацию - положительный/отрицательный потенциал и создали элементную базу. Но, и это также известный факт, всерьёз думали над тем, чтобы сделать 3х значную логику (- / 0 / +). Надо полагать, из этого 0 произошёл NULL. И ещё, я читал (не исключаю, что это ерунда), что машина зависает в случае появления такого 0.

softwarerВажно, но это совершенно отдельный вопрос, не имеющий никакого отношения к обработке NULL сервером. С точки зрения клиента мне представляется наилучшим, если клиент имеет адекватный инструмент, клиентский null.
Ну, повеселили!!! А ну-ка давайте спросим у пользователей - "что такое NULL?". Посмотрим сколько Вам дадут хотя бы приблизительно верный ответ
На клиенте должна быть возможность трактовать бдшный NULL так, как хочется, только и всего.

softwarerНе нужно, спасибо. Ваш ответ показывает...
Жаль, но Вы меня не поняли. Не нужно, так не нужно...
...
Рейтинг: 0 / 0
Ловушка 22
    #34261698
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Вы всё время пишете "в сауну стандарты, если они неудобны". Это весьма животрепещущая для меня тема! Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты? Приведу пример. На позапрошлой работе я спорил с начальником по следущему вопросу: стоит ли пользоваться типом данных столбца array (мы использовали PostgreSQL)? В доках прямо написано, что данная возможность "снимает ограничение, накладываемое реляционной теорией - атомарность". Шеф опирался на то, что "реляционная теория доказана математически, а значит надёжна и безотказна", я на то, что array идеально подходил под наши задачи.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261700
Как мне кажется, интересная статейка на тему NULL

http://opensource.com.ua/contents/978546900257p.html
...
Рейтинг: 0 / 0
Ловушка 22
    #34261712
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренко 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 )
Если бы написано было без смайлика, я был бы уверен, что Вы просто не поняли приведенный код. Смайлик вызывает подозрение, что поняли, но не хотите это признать.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261785
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieНо, и это также известный факт, всерьёз думали над тем, чтобы сделать 3х значную логику (- / 0 / +).
Не логику, а арифметику. Троичная система счисления в некоторых аспектах удобнее двоичной, в частности она более эффективна с точки зрения хранения данных и позволяет обойтись без дополнительного кода и подобных извращений при работе с отрицательными числами. Ну и пришли к этой идее чуть позже; в 30-е годы делали, например, .... ладно, не помню как назывался этот чудо-арифмометр, так что опустим.

FrankieИ ещё, я читал (не исключаю, что это ерунда), что машина зависает в случае появления такого 0.
Скорее всего, имеется в виду то, что элементная база не позволяла сделать три четко различимых состояния, и "нечетко интерпретируемые пограничные значения" были естественным и неодолимым источником ошибок, по сути сбоями памяти.

FrankieНу, повеселили!!! А ну-ка давайте спросим у пользователей - "что такое NULL?".
Вы всегда приплетаете нечто, имеющее косвенное отношения к обсуждаемому вопросу? Сначала к обсуждению сервера приплели клиента, теперь к замечанию о клиенте - пользователя. Следующим, видимо, будет стул, на котором пользователь сидит.

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

FrankieНа клиенте должна быть возможность трактовать бдшный NULL так, как хочется, только и всего.
:) Высказывание сколь верное, столь и непродуктивное. Из серии известного "на воздушном шаре".

"Должна быть" - может быть. Из всех возможных трактовок есть более и менее удобные. Более удобную - я назвал.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261800
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieВы всё время пишете "в сауну стандарты, если они неудобны" [...] Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты?
Полностью согласен, просто с языка сняли.
Мне представляется, что нужно все-таки корректировать стандарты.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261816
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
SQLWKS> select nvl('', 1 ) from dual
      2 > 
N
-
 1 
Выбрана  1  строка.
Пустая строка не содержит ни одного символа, т.е. ее значение не задано, т.е. это null. имхо никакого нарушения стандарта здесь нет.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261831
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоКак мне кажется, интересная статейка на тему NULL
Факты изложены точно и хорошо. В рассуждениях и трактовках мне не нравится один момент: сквозит несформулированный, но явно видимый постулат "null рассматривается как такое же значение, как и любое другое". Особенно ярко это видно во фразе "Один приемлемый метод для избежания использования NULL-значений — применение фиктивных значений для обозначения отсутствующих данных. Например, вместо NULL в символьных столбцах можно применить строки «N/A» или «NV»." - с моей точки зрения, за такие советы надо отрывать голову, и постулат в целом представляется мне неверным и опасным.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261847
Frankie softwarer
Вы всё время пишете "в сауну стандарты, если они неудобны". Это весьма животрепещущая для меня тема! Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты? Приведу пример. На позапрошлой работе я спорил с начальником по следущему вопросу: стоит ли пользоваться типом данных столбца array (мы использовали PostgreSQL)? В доках прямо написано, что данная возможность "снимает ограничение, накладываемое реляционной теорией - атомарность". Шеф опирался на то, что "реляционная теория доказана математически, а значит надёжна и безотказна", я на то, что array идеально подходил под наши задачи.

Насчет array. Я тоже не рискнул использовать этот и другие "продвинутые" типы данных (Informix). Черт его знает, как там оптимизировано относительно быстродействия :). Ну и еще были некоторые осложнения, связанный с принятой технологией. Хотя заманчиво например с таблице документов иметь поле "товарный состав" на базе типов ROW и COLLECTION. Надо будет на досуге поэкспериментировать. Опять же вопрос с передачей этих типов на клиента открытый...
...
Рейтинг: 0 / 0
Ловушка 22
    #34261938
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieВы всё время пишете "в сауну стандарты, если они неудобны".
Точно так.

FrankieЭто весьма животрепещущая для меня тема! Но как определить, достаточно ли я квалифицирован, чтобы брать на себя ответственность плевать на стандарты?

Приведу пример. На позапрошлой работе я спорил с начальником по следущему вопросу: стоит ли пользоваться типом данных столбца array (мы использовали PostgreSQL)? В доках прямо написано, что данная возможность "снимает ограничение, накладываемое реляционной теорией - атомарность". Шеф опирался на то, что "реляционная теория доказана математически, а значит надёжна и безотказна", я на то, что array идеально подходил под наши задачи.
Что касается Вашего примера, то с моей точки зрения Вы скорее всего правы, хотя я недостаточно знаю Postgres, чтобы утверждать это категорически. Почему: потому что ограничение атомарности в реляционной теории обусловлено вполне определенными известными причинами и должно быть понято определенным образом.

Требование атомарности вызвано тем, что "SQL сам по себе", реляционная теория в том виде, в котором она вводилась, не обладает адекватными средствами работы с неатомарными данными. Скажем, если у Вас в символьном поле хранится список значений через запятую, у Вас нет возможности сделать join со смыслом "те строки, в списках которых есть общие значения". Не знаю Postgre; в том, что касается Oracle, его расширения SQL позволяют выполнить все необходимые операции с nested tables, а потому "нарушение ими атомарности" представляется мне не разрушающим теорию. Точнее, я бы сказал, атомарность следует рассматривать именно в этом смысле - "данные, для работы с которыми есть адекватные встроенные средства". Ну и здесь еще следует помнить про потребности задачи - скажем, возможно, Вы не можете наложить на массив ограничение уникальности. Но если Вам не нужно его накладывать - какая разница, можете или нет?

Другой момент, также относящийся к Вашему примеру - реляционная теория не учитывает один тип полей, имеющий довольно широкое распространение. Это memo, lob, xml и прочие подобные поля - не участвующие в реляционных операциях, поля, единственный смысл которых - храниться в базе и предоставляться по запросу, поля, возникающие только в select-списках запросов. Теория этого прямо не оговаривает, но добавление таких полей не приводит ни к каким теоретическим неприятностям, если ваши массивы отвечают этому ограничению - ну и почему бы нет? BLOBы в противном случае тоже противоречат реляционной теории, однако почему-то повсеместно применяются. Скажем, jpeg обычно хранят в базе в виде файла, а не в виде таблицы координат и цветов точек :)

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

1) Стараться глубоко разобраться, пока не будет достигнута уверенность в детальном понимании "что как и зачем". Делать что-то потому, что "авторитет написал" - плохо, даже преступно для мыслящего разработчика. Делать нужно потому, что "твердо знаешь, чем это лучше альтернатив, которые тоже обдумывал".

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

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

3) Надо помнить, что принятые ранее решения могут быть ошибочными. Надо не бояться сменить точку зрения, в том числе перепроектировать или переписать что-то реализованное.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261968
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВы всегда приплетаете нечто, имеющее косвенное отношения к обсуждаемому вопросу? Сначала к обсуждению сервера приплели клиента, теперь к замечанию о клиенте - пользователя. Следующим, видимо, будет стул, на котором пользователь сидит.
Мы обсуждали NULL. Если я напрасно ушёл в сторону, обратив внимание на NULL в языках программирования - другой вопрос. С удовольствием можно обсуждать NULL не выходя из сервера, но хотелось бы практической стороны дела...

softwarerКлиент работает с null, но из этого никак не следует, что пользователь работает с null и должен знать, что это такое.
А зачем клиенту работать с null, если можно не выносить это понятие за пределы сервера и ограничиться правильным приведением? Тем более, что Вы сами указали, что путать программный nil и sql-NULL никак нельзя.

softwarer"Должна быть" - может быть. Из всех возможных трактовок есть более и менее удобные. Более удобную - я назвал.
Возможно Ваш авторитет даёт Вам право говорить "удобную", не уточняя "мне удобную", но удобство - субъективная вещь, согласитесь.
...
Рейтинг: 0 / 0
Ловушка 22
    #34262007
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоОтносительно же уникального индекса: два неопределенных значения вполне могут "оказаться" двумя одинаковыми.Можно расшифровать ?

Если правильно помню, Дейт, в своей критике понятия NULL, подчеркивает, что трактовка NULL, как неопределенного значения, неверна. NULL - это отсутствие всякого значения, поэтому считать, что 2 NULL "могут "оказаться" двумя одинаковыми" принципиально неверно. Сравнивать ничто невозможно, IMHO.
У него же, кстати, было предложение к производителям РСУБД изменить такую ситуацию способом, аналогичным защищаемому softwarer-ом. NULL должен быть эээ... доменнопривязанным, т.е., тот самый "спецсимвол" в словаре, имеющий особое значение.

P.S. Насколько помню, в том же Informix, по крайней мере - версии 7.3x, столкнулся с ситуацией, когда 2хбайтное целое со знаком, не помню по давности название типа, не могло принимать значение -32768, под ним "прятался" NULL для полей данного типа. Хотя это совсем не то, что предлагал Дейт :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34262010
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieВозможно Ваш авторитет даёт Вам право говорить "удобную", не уточняя "мне удобную", но удобство - субъективная вещь, согласитесь.
Читайте оригинал:

softwarerС точки зрения клиента мне представляется наилучшим , если клиент имеет адекватный инструмент, клиентский null.

Повторять это имхо во всех последующих ссылках на эту цитату мне представляется излишним. Я надеюсь на собеседников, помнящих про контекст беседы и соблюдающих его. В противном случае беседовать практически невозможно.
...
Рейтинг: 0 / 0
Ловушка 22
    #34262025
barsukoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stenfКаждая деталь из таблицы Детали должна ссылаться на изделие, которому она принадлежит.
Но, само изделие - это тоже деталь, нулевая сборка, которая также как и все остальные детали обладает такими параметрами как Обозначение, Наименование и т.д., а значит должна находиться в таблице деталей.
Как быть ?
Букофф много , не хватило сил, дочитать до конца (там какие-то теоретичиские споры начались).
Но по первому вопросу топика есть мысля
Код: plaintext
1.
create table Детали(IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), Покупная bit, БезЧертежка bit, IDИзделия int)
сделать по методу предложенному softwarer-ом
Делаем ОДНУ таблицу , для наглядности можно добавить поле , в котором можно указать какого уровня элемент - деталь, сборочная единица, изделие и тд.
Фторая таблица - это тупо таблица связей
Код: plaintext
1.
create table Связи(IDВернейДетали int,IDНижнейДетали int)
В процессе работы заводим в базе в изобилии детали в ПЕРВОЙ таблице , потом легким движением руки жмем - сделать связь во ВТОРОЙ таблице (можно сделать поле кол-во деталей).
Данное творчество потом легко развернуть в виде дерева, просмотреть входимость деталей.Причем одна типовая деталь может участвовать в нескольких изделиях.
Нечто подобное пришлось делать на старой работе , но там было посмешнее - требовалось отношение многие ко многим (база присоединений электростанции - электрики меня поймут)
...
Рейтинг: 0 / 0
Ловушка 22
    #34262035
barsukoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
картинка к сообщению
...
Рейтинг: 0 / 0
Ловушка 22
    #34262278
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Не обязана абстракция быть понятной. Она обязана быть "удобной и при этом по возможности понятной".

Предлагаю закончить про абстракции, а то мы можем выяснять их отличия довольно долго, а смысла в этом все-таки довольно мало :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34262471
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfПросто литература по mssql пестрит предупреждениями про null, и люди которые пишут это тоже не являются теоретиками. Возможно это как-то связано с различиями в работе с null в разных серверах БД.Вряд ли. IMHO, количество появлений NULL в данных с большой степенью вероятности может говорить о несоответствии модели данных предметной области, а может даже и о степени понимания самой предметной области. Теоретически, база данных должна содержать факты, но NULL - суть отсутствие факта, хотя отсутствие оного и пытаются часто трактовать тоже как факт. Типа, отсутствие ответа - тоже ответ. Возможно с теоретической точки зрения, само существование NULL не есть хорошо, но на практическом уровне это допустимо, так как трактуется обычно исходя из контекста, где он появляется или используется. В некотором смысле, это как нормализация и денормализация. В некоторых случаях использование второй может сильно облегчить жизнь.
Так что, IMHO, не стоит бежать от NULL, как черт от ладана, но надо четко понимать, почему вы его позволяете, используете или трактуете в данном конкретном случае, и не допускать их появления как результата неграмотного проектирования или степень своего незнания или непонимания предметной области.
...
Рейтинг: 0 / 0
Ловушка 22
    #34262732
barsukoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stenf
Таким образом я не вижу выгоды от варианта с винтиками для всех изделий.
1 вариант) Если винтик не уникален для изделия (как вы советуете), то для случая замены винтика “везде” потребуется изменить только одну строку, а для замены винтика “в половине изделий” потребуется создание новых винтиков для половины изделий и проводки соответствующих изменений.
2 вариант) Если винтик уникален для изделия (как сделано у меня сейчас), то для случая замены винтика “везде” потребуется апдейт одной строчки для каждого изделия, а для замены винтика “в половине изделий” потребуется соответственно апдейт одной строчки для половины всех изделий.

Много теории ,заодно NULL-ы обсудили, я только не понял в чем загвоздка?
Где-то далеко назад в топике уже подсказывали - делайте что-то наподобие рецептов (там про резину было).
Какая проблемма-то? По моему глупому мнению, пока шло обсуждение темы, уже можно было задачу сдать в эксплуатацию.
Сделать иерархию, чуть выше с каринкой я писал. Верхом иерархии будет Ваша сборка ,в таблице связи её (IDВернейДетали=0) по ней мы узнаем что это предел совершенства и выше искать не нада , в этой же таблице добавим поле ЗАКАЗ.
Есть какая-то новая разработка забили его в эту структуру. Пришло время производить что-то загодя создали табличку ЗАКАЗЫ_НА_ПРОИЗВОДСТВО , создаем в ней новый заказик на основе сборки (например CБ001), и по нажатию волшебной кнопки, в таблице связи все записи касающие этой сборки тупо копируются ,только в поле ЗАКАЗ проставляеся ID из таблицы ЗАКАЗЫ_НА_ПРОИЗВОДСТВО .
Захотели что-то поменять создали новый заказ на базе хоть сборки, хоть другого заказа и уже в ЭТОЙ сборке можете резвиться как хотите - менять детали хоть партиями , хоть штучно.Можете просматривать как менялись версии изделия, короче простор мысли.
PS Я извинясь , что не цитирую тут классикоф, а так по деревенски объясняю.
PPS То stenf - ничего личного, но как постановщик задач, вы слабоваты. Да MS SQL (или Акцесс) Вас похоже подпортил свими конструкторами запросов (постоянные попытки вынести однотипные данные в отдельные таблицы и любовь к Join-ам до добра не доведут)
...
Рейтинг: 0 / 0
Ловушка 22
    #34262836
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ModelRПлз подробнее.
null в outer join - всего лишь дефолт, подставляемый в определенных случаях. Достаточно дополнить синтаксис выражений в селекте конструкцией default тра-ля-ля чтобы получить outer join, не испытывающий никаких проблем от отсутствия концепции null.
Хотел ответить, но уже отвечено:
softwarerВ рассуждениях и трактовках мне не нравится один момент: сквозит несформулированный, но явно видимый постулат "null рассматривается как такое же значение, как и любое другое". Особенно ярко это видно во фразе "Один приемлемый метод для избежания использования NULL-значений — применение фиктивных значений для обозначения отсутствующих данных. Например, вместо NULL в символьных столбцах можно применить строки «N/A» или «NV»." - с моей точки зрения, за такие советы надо отрывать голову, и постулат в целом представляется мне неверным и опасным.
...
Рейтинг: 0 / 0
Ловушка 22
    #34262849
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
\n if  Hotkey = \'Alt-A\' \n   then  ScanCode :=  61 \n else   if  Hotkey = \'Alt-B\' \n   then  ScanCode :=  62 \n........ и таких вот строк до хрена и больше ......

Скажете, этот код сложнее? Нет, ему так было проще. 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 - тогда мы написали бы программу из одной строки и решили задачу. Но поскольку чаще всего такой команды нет, то приходится думать и напрягаться".
...
Рейтинг: 0 / 0
Ловушка 22
    #34262877
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRХотел ответить, но уже отвечено:
Не согласен принять такой ответ без уточнений. Чем, по-Вашему, код

Код: plaintext
1.
2.
3.
select
  coalesce ( a.data, b.data ) +  1  as data
from 
  a full outer join b on ( some condition )

лучше, нежели

Код: plaintext
1.
2.
3.
select
  ( a.data default b.data ) +  1  as data
from 
  a full outer join b on ( some condition )

? Второй, однако, спокойно обойдется без null.
...
Рейтинг: 0 / 0
Ловушка 22
    #34262903
fooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerКакие - неопределенность. Скажем, представьте себе, что в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие?

password <> '' ?

password is not null ?

( password <> '' ) and ( password is not null ) ?

length ( password ) > 0 ?

any other idea?



password is null означает что у юзера была возможность не вводить пароль, и он его не вводил.
password = '' означает что юзер ввел пустую строку в качестве пароля.

вы все еще не видите разницу между пустой строкой и неопределенным значением, но легко представляете себе несколько разных пустых строк, совместимых с любым другим типом данных?
...
Рейтинг: 0 / 0
Ловушка 22
    #34262961
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fooopassword is null означает что у юзера была возможность не вводить пароль, и он его не вводил. password = '' означает что юзер ввел пустую строку в качестве пароля.
Возможна и такая трактовка. Она означает, что ответ, который чуть дальше дал Frankie, неверен (не является ответом на поставленную мной задачу).

Вот и иллюстрация проблем, вызываемых указанным различием. Простейшая вещь, а вы с ним уже поняли по-разному. А что было бы, если бы каждый из вас разрабатывал свой модуль, а потом потребовалось бы связать их в каком-то бизнес-процессе?
...
Рейтинг: 0 / 0
Ловушка 22
    #34263011
fooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ответ Frankie (3й вариант) - верен, почему нет? вы же не предполагали аутентифицировать юзера как-то иначе, чтобы наглядно проиллюстрировать не наши проблемы :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34263015
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foooответ Frankie (3й вариант) - верен, почему нет?
Потому что задача поставлена однозначно - "не давать вводить пустые пароли". Фильтрация "паролей, которых пользователь не вводил" является логической ошибкой.
...
Рейтинг: 0 / 0
Ловушка 22
    #34263083
fooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а мы не знаем что есть "пустой". пароль - последовательность символов, в нем может не быть ни одного символа или он может отсутствовать как объект. в строке может храниться список, например, прав на доступ (acl). в этом случае пустая строка может означать запрет на все действия, null - наоборот - полный доступ. это логично и удобно.
вот поэтому и задача поставлена неоднозначно, и разговариваете вы сами с собой... :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34263186
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Ловушка 22
    #34264335
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer foooответ Frankie (3й вариант) - верен, почему нет?
Потому что задача поставлена однозначно - "не давать вводить пустые пароли". Фильтрация "паролей, которых пользователь не вводил" является логической ошибкой.
Мой ответ основан на выборе самого надёжного решения, Вы же призываете рисковать надёжностью ради экономии времени на жалкую password is not null. Понимаете, я не знаю контекста и обязан учитывать, что в password может попасть NULL. Глупо, просто глупо зависеть от инетрперетации NULL и ''.
...
Рейтинг: 0 / 0
Ловушка 22
    #34264360
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ModelRХотел ответить, но уже отвечено:
Не согласен принять такой ответ без уточнений. Чем, по-Вашему, код

Код: plaintext
1.
2.
3.
select
  coalesce ( a.data, b.data ) +  1  as data
from 
  a full outer join b on ( some condition )

лучше, нежели

Код: plaintext
1.
2.
3.
select
  ( a.data default b.data ) +  1  as data
from 
  a full outer join b on ( some condition )

? Второй, однако, спокойно обойдется без null.Дык это и есть способ налететь на вредный постулат "null рассматривается как такое же значение, как и любое другое". Скажем теперь задача - выдать нестыковки, но как их отличить:(

2 Сергей Васкецов Никто не говорил, что исходные таблицы должны иметь NULL -поля. Речь о том, что outer join - такая операция , которую невозможно корректно определить (имеется ввиду с результатом - также таблицей) не используя понятие NULL. Частные случаи разумеется могут без него обойтись.
...
Рейтинг: 0 / 0
Ловушка 22
    #34264380
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
foooа мы не знаем что есть "пустой".
Это, пардон, отмазка, но забавная тем, что снова приводит к моему тезису: "не знаем, что есть "пустой"" - как раз та неопределенность, которую я зачислил в неудобства.

FrankieМой ответ основан на выборе самого надёжного решения,
Я понимаю. Правильно будет сказать - самого надежного из возможных в данной архитектуре. Потому что это решение не есть самое надежное вообще, стоит ли объяснять, почему?

FrankieВы же призываете рисковать надёжностью ради экономии времени
Не стоит делать поспешные и неверные выводы о том, к чему я якобы призываю.

FrankieПонимаете, я не знаю контекста
Именно. Поэтому Вы либо принимаете внутренний стандарт, определяете контекст (и имеете проблемы, например, при интеграции с другими модулями, выполненными в другом контексте) либо должны помнить и в каждом месте выполнять по две проверки (а это - заведомо тонкое место, где-то да забудете).
...
Рейтинг: 0 / 0
Ловушка 22
    #34264441
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ понимаю. Правильно будет сказать - самого надежного из возможных в данной архитектуре. Потому что это решение не есть самое надежное вообще, стоит ли объяснять, почему?
Конечно не стоит. По условию MSSQL, потому и такой ответ.

softwarerИменно. Поэтому Вы либо принимаете внутренний стандарт, определяете контекст (и имеете проблемы, например, при интеграции с другими модулями, выполненными в другом контексте) либо должны помнить и в каждом месте выполнять по две проверки (а это - заведомо тонкое место, где-то да забудете).
Если говорить вообще - то проблемы безусловно возможны. Если про данный пример - не вижу, где они могут быть. На практике конечно я всегда изучу контекст и напишу минмальную достаточную проверку. Про две проверки согласен, всегда раздрожало, как в php надо было писать if (isset($a) && $a!='smth' )
...
Рейтинг: 0 / 0
Ловушка 22
    #34264483
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 stenf
Вы действительно перевыпускаете спецификацию и все чертежи входящих деталей на некую сборку СБ12345, если примените ее (без каких-либо изменений) в другом изделии ???

Уже несколько раз прочел, но все не верится....
...
Рейтинг: 0 / 0
Ловушка 22
    #34266370
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRДык это и есть способ налететь на вредный постулат "null рассматривается как такое же значение, как и любое другое".
Стоп-стоп-стоп. В концепции "null вообще нет" постулат "null рассматривается..." определенно не верен :)

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

В то же время было выдвинуто локальное утверждение - без null невозможен outer join. Это утверждение представляется мне неверным, что я как-то пытаюсь обосновать. Если сделать описанную модель, она в целом будет хуже существующей - из-за отсутствия null. Но в то же время именно outer join будут работать ничем не хуже.

ModelRСкажем теперь задача - выдать нестыковки, но как их отличить:(
Я могу придумать какой-то ответ, но имхо не в этом суть. Понятно, что "с бедра" я - или кто-то другой - вряд ли предложит модель поведения, оптимальную в каждой детали; это все-таки задача для достаточно серьезных раздумий и обсуждений. Но принципиальная возможность имхо показана, оставшиеся задачи - технические, решаемы.
...
Рейтинг: 0 / 0
Ловушка 22
    #34266511
stenf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
barsukoff
Сделать иерархию, чуть выше с каринкой я писал. Верхом иерархии будет Ваша сборка ,в таблице связи её (IDВернейДетали=0) по ней мы узнаем что это предел совершенства и выше искать не нада , в этой же таблице добавим поле ЗАКАЗ.

вы невнимательно читали топик. Иерархия и так есть, она у меня называется Входимостью. Содержит ссылку на детальСборку, детальПодсборку и количество.
softwarer
Почему в нескольких?

Если замена идет в одном месте, в одной сборке, значит update-им одну строку одной таблицы. Если замена идет в "нескольких из многих" - меняем несколько строк, скорее всего в одной таблице.
...
Про это. Возможно и есть, но в первом посте темы оно... как минимум не очевидно. Можно предположить, что у Вас IDСборки есть ссылка на таблицу деталей, если так, дерево становится видным, но это повод пересмотреть стандарты именования :)

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

Код: plaintext
1.
2.
create table Детали (IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), IDИзделия int, НулеваяСборка bit)
create table Изделия (IDИзделия int, Заказчик varchar( 100 ), Сроки datetime)
create table Входимость (IDСборки int, IDДетали int, Количество int)

В таблице Входимость 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, если примените ее (без каких-либо изменений) в другом изделии ???

нет, а с чего вы взяли ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34266817
stenf barsukoff
Сделать иерархию, чуть выше с каринкой я писал. Верхом иерархии будет Ваша сборка ,в таблице связи её (IDВернейДетали=0) по ней мы узнаем что это предел совершенства и выше искать не нада , в этой же таблице добавим поле ЗАКАЗ.

вы невнимательно читали топик. Иерархия и так есть, она у меня называется Входимостью. Содержит ссылку на детальСборку, детальПодсборку и количество.
softwarer
Почему в нескольких?

Если замена идет в одном месте, в одной сборке, значит update-им одну строку одной таблицы. Если замена идет в "нескольких из многих" - меняем несколько строк, скорее всего в одной таблице.
...
Про это. Возможно и есть, но в первом посте темы оно... как минимум не очевидно. Можно предположить, что у Вас IDСборки есть ссылка на таблицу деталей, если так, дерево становится видным, но это повод пересмотреть стандарты именования :)

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

Код: plaintext
1.
2.
create table Детали (IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ), IDИзделия int, НулеваяСборка bit)
create table Изделия (IDИзделия int, Заказчик varchar( 100 ), Сроки datetime)
create table Входимость (IDСборки int, IDДетали int, Количество int)

В таблице Входимость IDСборки и IDДетали ссылаются на Детали.IDДетали, это и есть дерево изделия. Можно конечно было их назвать IDДеталиСборка и IDДеталиПодсборка но это не суть важно.
Что теперь происходит, если мы хотим создать новую детать и включить ее вместо старой ? Инсертим новую деталь. Запоминаем получившийся ее ID'шник. Идем во Входимость, и заменяем IDСтаройДетали на IDНовойДетали везде где она встречается. Потом идем в другие таблицы, содержащие ссылки на IDСтаройДетали и их тоже меняем. Таких "других" таблиц вообще говоря может быть много.

Да, Вы на самом деле немного неточно объяснили.
Надо было делать акцент не только (и не столько) на опытном производстве, сколько на его УНИКАЛЬНОСТИ / ШТУЧНОСТИ. Таким образом получаем, что один и тот же тип изделия (т.е. катапульта, мортира, гаубица и т.д. ) будет состоять из неизменной/фиксированной части и переменной части, определяемой требованиями покупателя-заказчика. Именно поэтому изделие привязывается к заказчику...
Только я бы сделал так (примерно так было в нашей системе):
Код: plaintext
1.
2.
3.
4.
create table Детали (IDДетали int, Обозначение varchar( 100 ), Наименование varchar( 100 ) )
create table Входимость (IDИзделия int, IDДетали int, Количество int, НулеваяСборка bit)
create table Спецификация заказа (IDИзделия int, IDЗаказа int)
create table Заказы (IDЗаказа int, Заказчик varchar( 100 ), Сроки datetime)
...
Рейтинг: 0 / 0
Ловушка 22
    #34267478
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenf ModelR
Вы действительно перевыпускаете спецификацию и все чертежи входящих деталей на некую сборку СБ12345, если примените ее (без каких-либо изменений) в другом изделии ???

нет, а с чего вы взяли ?С ваших пояснений. ИМХО обсуждение одного примера типа
ДСЕa1a2bc1c2
Изделияc1 Заказ1 срок=15c2 Заказ1 срок=20
Входимостьчто куда сколькоa1b30a2b40bc13bc27
заменило бы 6 страниц топика.
...
Рейтинг: 0 / 0
Ловушка 22
    #34267594
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ModelRСкажем теперь задача - выдать нестыковки, но как их отличить:(Я могу придумать какой-то ответ, но имхо не в этом суть. Понятно, что "с бедра" я - или кто-то другой - вряд ли предложит модель поведения, оптимальную в каждой детали; это все-таки задача для достаточно серьезных раздумий и обсуждений. Но принципиальная возможность имхо показана, оставшиеся задачи - технические, решаемы.Единственное принципиальное назначение NULL - отличить несуществующие (все равно по каким причинам) данные от существующих. Outer join по определению обязан уметь выдавать это отличие. Так что "оставшиеся задачи - технические" решаемы единственно игрой в слова.
Давайте не будем в арифметике 0 называть нулем, пусть это будет специальное значение (1-1), ну переформулируем правила... - и что? избавимся от запрета делить на 0 ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34267909
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRЕдинственное принципиальное назначение NULL - отличить несуществующие (все равно по каким причинам) данные от существующих.
Согласен.

ModelROuter join по определению обязан уметь выдавать это отличие. Так что "оставшиеся задачи - технические" решаемы единственно игрой в слова.
Вы сделали две ошибки.

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

Во-вторых, outer join обязан не "выдавать", а "обрабатывать". Как обрабатывать для выдачи пользователю - я уже показал. Обрабатывать для логики внутри запроса - той же самой конструкцией default, скажем

Код: plaintext
1.
2.
3.
4.
select
  case when p.person_id is null then 'Организация' else 'Персона' end contractor_type
from
  contractors c outer join persons p outer join organizations o

превратится в

Код: plaintext
1.
2.
3.
4.
select
  case when ( person_id default  1  ) <> ( person_id default  2  ) then 'Организация' else 'Персона' end contractor_type
from
  contractors c outer join persons p outer join organizations o

Так что как видите, то, что Вы необдуманно назвали "игрой слов" выливается во вполне конкретную реализацию, ни в коей мере на null не опирающуюся. Главный вывод: сделать можно, так что исходное утверждение не верно? Нужно ли так делать? Имхо не нужно.
...
Рейтинг: 0 / 0
Ловушка 22
    #34268281
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, упражнения со списком селект никак не влияют на определение самой операции outer join.
Или это какой-то особый outer join, где
Код: plaintext
1.
2.
3.
 select
  p.person_id 
from
  contractors c outer join persons p outer join organizations o
запрещено и все тут?
...
Рейтинг: 0 / 0
Ловушка 22
    #34268391
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы закончить вопрос о
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
ISNULL(@password, '') <> ''

В принципе, одно условие, достаточно удобно пользоваться при сохранении надёжности 3го варианта.
...
Рейтинг: 0 / 0
Ловушка 22
    #34268968
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRИли это какой-то особый outer join, где .... запрещено и все тут?
Не "запрещено" а выдаст ошибку "обязательно указать конструкцию default".
...
Рейтинг: 0 / 0
170 сообщений из 170, показаны все 7 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ловушка 22
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]