|
|
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. Каждая деталь из таблицы Детали должна ссылаться на изделие, которому она принадлежит. Но, само изделие - это тоже деталь, нулевая сборка, которая также как и все остальные детали обладает такими параметрами как Обозначение, Наименование и т.д., а значит должна находиться в таблице деталей. Когда создается новое изделие, то при такой схеме нельзя добавить записи, так как при внесении записи в таблицу Изделия у нас еще нет IDДетали (нулевой сборки), а если вначале пытаться внести запись в таблицу Детали - то мы не знаем IDИзделия. Как быть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 17:38 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
дерево тебе поможет! изделие или деталь: идизделия, идродителяизделия, ... все остальное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 17:44 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
не понял, какое дерево ? Дерево Сборка-деталь и так есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 19:27 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Дерево - это одна таблица. В твоем случае надо таблицы Детали и Изделия объединить в одну. Код: plaintext 1. 2. 3. Вот это дерево, а у тебя просто три таблицы со связями.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2006, 21:23 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfКак быть ? Я могу назвать как минимум три варианта. 1. Совместить таблицы деталей и изделий. 2. Воспользоваться deferred constraints. 3. Пробивать информацию в два приема: insert в изделия - insert в детали - update изделий с установкой id детали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2006, 02:20 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
В "изделия" одно из IDИзделия int , IDДетали int - лишнее. Все изделия зарегистрированы как детали. Изделия - подтип Детали. Еще у вас возможно проблема в данных входимости. Деталь может входить в несколько изделий. Что у вас в Детали.IDИзделия - первичная применяемость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2006, 10:09 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer 1. Совместить таблицы деталей и изделий. получиться избыточность softwarer 2. Воспользоваться deferred constraints. 3. Пробивать информацию в два приема: insert в изделия - insert в детали - update изделий с установкой id детали. хотелось-бы все-таки обеспечить ссылочную целостность структурой базы, а не хитрыми финтами ушей ModelR В "изделия" одно из IDИзделия int , IDДетали int - лишнее. Все изделия зарегистрированы как детали. Изделия - подтип Детали. да, но изделие (нулевая сборка) - это хитрая разновидность деталей, она обладает доп. параметрами, которых нет у рядовых деталей ModelR Еще у вас возможно проблема в данных входимости. Деталь может входить в несколько изделий. Что у вас в Детали.IDИзделия - первичная применяемость? где там проблема ? деталь может входить куда угодно. С Входимость как раз проблем нет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2006, 10:38 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfда, но изделие (нулевая сборка) - это хитрая разновидность деталей, она обладает доп. параметрами, которых нет у рядовых деталейДык и на здровье. В таблице Деталей - все ДСЕ с общими для всех типов ДСЕ характеристики. В таблице изделий - только ДСЕ типа изделий с их особенными характеристиками. Обе в качестве ключа имеют один и тот же ДСE_Id. Получается связь тип/подтип. stenf где там проблема ? деталь может входить куда угодно. С Входимость как раз проблем нет :)Кроме таблицы входимости (спецификация) у вас еще какая-то входимость в самой таблице деталей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2006, 16:35 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelR В таблице Деталей - все ДСЕ с общими для всех типов ДСЕ характеристики. В таблице изделий - только ДСЕ типа изделий с их особенными характеристиками. Обе в качестве ключа имеют один и тот же ДСE_Id. Получается связь тип/подтип. т.е. имеете ввиду, вставив новую деталь, применить получившийся ID в таблице Изделия для идентификации ? Т.е. если новый IDДетали=34, то вставляем в Изделия запись с IDИзделия=34 ? Но как в этом случае занести запись в Детали, ведь там должна быть ссылка на изделие, т.е. в случае нулевой сборки на то-же ID, что имеет сама деталь, а в момент вноса он еще неизвестен. ModelR Кроме таблицы входимости (спецификация) у вас еще какая-то входимость в самой таблице деталей В таблице Деталь ? Где ? что-то не вижу там ничего предосудительного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2006, 22:15 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfcreate table Детали(IDДетали int, Обозначение varchar(100), Наименование varchar(100), Покупная bit, БезЧертежка bit, IDИзделия int ) [...] Но как в этом случае занести запись в Детали, ведь там должна быть ссылка на изделие, т.е. в случае нулевой сборки на то-же ID, что имеет сама деталь, а в момент вноса он еще неизвестен. [...] В таблице Деталь ? Где ? что-то не вижу там ничего предосудительного деталь входит два изделия. Что в Детали.IDИзделия ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 10:17 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfполучиться избыточность Не получится. Точнее, если Вы полагаете избыточностью любое поле, допускающее null, Вам придется чуть ли не для каждого поля заводить отдельную таблицу. stenfхотелось-бы все-таки обеспечить ссылочную целостность структурой базы, а не хитрыми финтами ушей Хм. Интересно, Вы вообще думаете, о чем говорите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 10:25 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Сначала прочитай статьи про деревья на ibase.ru, там достаточно для начала, оттуда же поймешь, что можно задавать новые записи в древесной тоблице в виде ссылок на ранее созданные. Сама природа развивается от простого к сложному, та шта...сначала набиваются справочники всевозможных простых элементов, а потом вводятся более сложные, ссылаясь на уже набитые более простые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 10:35 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelR деталь входит два изделия. Что в Детали.IDИзделия? Виноват. Непреднамеренно ввел вас в заблуждение. Прошу прощения. Деталь может входит только в одно изделие (IDИзделия + IDДетали уникально). Это связано с тем, что деталь с одним и тем-же шифром может иметь разные наименования в разных изделиях. Вообще, подумав, я пришел к выводу, что в IDИзделия нулевой сборки можно вставить null. Первоначально я не хотел так делать, но вообще-то в этом нет ничего страшного. Так что ваше предложение об использовании IDДетали в качестве IDИзделия в таблице изделий вполне работает. Это позволит избавиться от ссылки на деталь в таблице Изделия, так как теперь IDИзделия и является собственно ссылкой на деталь. Thanks softwarer Хм. Интересно, Вы вообще думаете, о чем говорите? Неужели обиделись ? Вот уж не думал. Избыточность в первом случае есть, так как каждая деталь будет обладать параметрами, присущими только изделиям, что имхо неверно. Update после вставки не даст установить внешний ключ на это поле (а он тут нужен), deffered constraints не знаю есть-ли в mssql, но в любом случае даже временный "обход" ограничений не есть идеальное решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 18:56 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfНеужели обиделись ? Вот уж не думал. Да нет, просто удивляюсь. stenfИзбыточность в первом случае есть Избыточность, точнее "логическая избыточность в Вашем смысле этого слова" есть в случае любого поля, допускающего null-значения. Рассмотрите, скажем, позиции товарных документов, ряд полей которых (отпускная цена, кладовщик, серийный номер) заполняются только при отгрузке. В принципе их можно было бы так же распилить - на "позицию" и "данные по отгрузке позиции". Технически любую схему можно преобразовать в эквивалентную без подобной избыточности, это будет даже давать некоторые преимущества, скажем возможность легко реализовать ограчинения вида "если введено A, должны быть также введены B, C и D". Но на практике это будет зверски неудобно. stenfUpdate после вставки не даст установить внешний ключ на это поле (а он тут нужен), Ччего, простите? stenfdeffered constraints не знаю есть-ли в mssql Были какие-то. Но это лучше смотреть на месте. stenf, но в любом случае даже временный "обход" ограничений не есть идеальное решение Хм. Снова хочется повторить банальную фразу. Представьте себе любую транзакцию, состоящую более чем из одного элементарного SQL-оператора. Можно быть почти уверенным в том, что в момент "между операторами" данные не являются целостными (скажем, с одного счета списали, на другой еще не записали). И что же, все, капут рыбке, решение неидеальное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2006, 19:18 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenfДеталь может входит только в одно изделие (IDИзделия + IDДетали уникально). Это связано с тем, что деталь с одним и тем-же шифром может иметь разные наименования в разных изделияхНе совсем понял. "IDИзделия + IDДетали уникально" означает лишь что одна деталь входит в одно изделие однократно но не запрещает вхождений в разные изделия. А "Деталь может входит только в одно изделие" моделируется как функциональная зависимость IDДетали -> IDИзделия. Откуда следует, что если в ключе таблицы присутствует IDДетали , то IDИзделия уже не часть этого ключа. Короче уникальность не проясняет ситуацию, важен ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 10:46 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer Но на практике это будет зверски неудобно. Я могу вам привести цитату Джо Селко: "В целой схеме БД, разработанной профессионалом часто бывает меньше полей допускающих null, чем в одной таблице, разработаной новичком." Так что я стараюсь избавляться от null'ов, и имхо с этой точки зрения ввод в таблицу сразу нескольких полей с null нецелесообразно. softwarer Ччего, простите? ваши слова "insert в изделия - insert в детали - update изделий с установкой id детали.". При инсерте в Изделия деталь неизвестна, что вы там будете вставлять в поле IDДетали, если там стоит внешний ключ на Детали ? Подозреваю, что вы мне сейчас предложите null. Однако давать разрешение столбцу иметь null, хотя там ни один null не должен будет появляться (за исключением короткого момента между двумя вышеуказанными операторами) является логическим кошмаром. Кроме того, как известно ружье висящее на стене рано или поздно выстрелит, а в столбце допускающим null'ы рано или поздно этот null появиться, что приведет к сбою клиентского приложения, причем неприменно в момент демонстрации его заказчикам. softwarer Представьте себе любую транзакцию, состоящую более чем из одного элементарного SQL-оператора Вы утрируете. В случае транзакций вам некуда деваться. В данном случае можно найти выход, придумав хорошую структуру базы. ModelR Короче уникальность не проясняет ситуацию, важен ключ вообще-то да, IDДетали действительно уникально, (оно вообще identity). Я не могу допустить появления одного и того-же IDДетали в разных изделиях, даже если их параметры полностью идеинтичны, так как через некоторое время конструктор захочет переименовать деталь (пометить как покупную и прочее), и это изменение не должно повлиять сразу на два и более изделия. Собственно этим identity заодно обеспечиться и уникальность детали внутри одного изделия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 15:32 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
2 stenf: гы, мля! улыбнул! до чего мудро, глубоко излагаешь! разбомбил softwarer-а, камня от камня не оставил .... читай, пиши еще .... смари - у тебя пылесос - это изделие ? состоит из деталей? - все хорошо. а есть супир пылесосно втягивающая машина, которая состоит из тысчи пылесософф, мост приэтом взорван, ваши дейстия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 15:55 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
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. stenfЯ не могу допустить появления одного и того-же IDДетали в разных изделиях, даже если их параметры полностью идеинтичны, Вот как раз тут стоило бы думать о хорошей структуре базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 20:01 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ййййййй гы, мля! улыбнул! до чего мудро, глубоко излагаешь! разбомбил softwarer-а, камня от камня не оставил .... читай, пиши еще .... смари - у тебя пылесос - это изделие ? состоит из деталей? - все хорошо. а есть супир пылесосно втягивающая машина, которая состоит из тысчи пылесософф, мост приэтом взорван, ваши дейстия? вах маладэц, какой информативный речь сказал ! Твои познания в программировании такого-же уровня, как в русском языке ? Подними глаза и прочти еще раз мой ответ ModeleR'у. Никаких "изделий внутри изделия" в моей системе быть не может по указанной там причине. А потом на прием к врачу сходи, а то "супир пылесосно втягивающая машина из тысчи пылесософф" с приплетенным "взорванным мостом" наводит на подозрения... Буйная фантазия это конечно хорошо, пока она не перерастает некоторые границы и не оказывается в компетенции соответствующего медперсонала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 21:04 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer Селко, при всех его многочисленных достоинствах, не совсем практик. Кроме своих достоинств он обладает также одним из моих, а именно склонностью к экстремальным точкам зрения. Это и приводит к этой цитате, порожденной, как я слегка подозреваю, рефлексами работы в dbf-овские времена. Хорошо, открываем Кена Хендерсона и читаем там, что null это "противные маленькие чудовища" и "необходимое зло в некоторых случаях". Он тоже теоретик ? :) Хотя конечно может быть. Видимо у меня неудачная подборка книг softwarer С этой точки зрения предлагаемая Вами структура.... настораживает, и имхо больше нуждается во внимании, нежели формальные критерии. Вы возможно не совсем верно поняли цель моего первого поста - указанная там структура лишь показывает, что я примерно хочу добиться, и выложил я ее сюда как раз что-бы найти что-то лучшее. На данный момент мне нравиться предложение ModelR - я убираю IDДетали из Изделия, а в качестве IDИзделия в таблице Изделия применяю IDДетали, сгенерированный при вставке в Детали. В поле IDИзделия таблицы Детали для нулевой сборки вставляю null. Если у вас есть конструктивная критика данного подхода - буду очень рад услышать. softwarer В Вашем случае это будет означать "изделие является собственной деталью", что есть даже не логический кошмар, а просто объективный бред. Это еще почему ? Заместо null для нулевой сборки я могу вставить IDДетали и никакого объективного бреда не получиться. Нулевая сборка тоже является частью изделия, просто в данном конкретном случае она еще и обладает рядом дополнительных свойств. Возможно вы путаете отношение деталь/сборка и изделие/деталь. Все детали (включая нулевую сборку) имеют изделие, в рамках которого изготовляются. softwarer Чего, простите? По-вашему, транзакция из нескольких операций - это утрирование, в жизни такого не бывает? Утрирование в данном случае - это применение нерелевантного сравнения. Это как если-бы я в качестве доказательства опасности велосипедистов на улицах привел-бы статистику погибших пешеходов под колесами Кразов. Ведь и то, и другое - средство передвижения. Зачем приводить в пример нарушение логической целостности базы внутри транзакции и нарушение целостности, при котором в таблицу вставляются значения, которых там по бизнес правилам быть не должно, а вы просто договорились с сервером, что "ща погоди, следующий оператор все поставит на свои места" ? Есть принципиальная разница между "списали с одного счета, а на другой зачислим следующим оператором" и "вставляем в поле ссылку на отсутствующий объект" Вообще я тут не критикую deffered constraints, просто применение этого "маленького чудовища" тоже бы неплохо ограничить действительно необходимыми случаями, а данный случай имхо не является таковым. softwarer Вот как раз тут стоило бы думать о хорошей структуре базы. Любая критика - welcome. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 21:04 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenf Вы возможно не совсем верно поняли цель моего первого поста - указанная там структура лишь показывает, что я примерно хочу добиться, и выложил я ее сюда как раз что-бы найти что-то лучшее. Вы лучше по русски опишите то, чего Вы пытаетесь добиться. Разбираться в чужих мыслях для решения обычных задач, думаю, мало кому интересно. Отсюда и поток флейма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2006, 23:20 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
iscrafm Вы лучше по русски опишите то, чего Вы пытаетесь добиться Есть набор деталей/сборок. Из них сформирована входимость. Каждая деталь/сборка должна обладать аттрибутом Изделие, которое описывает общие для изделия параметры. В базе должны быть написаны запросы, которые возвращали-бы например "все детали/сборки данного изделия" и "всю входимость данного изделия", могли-бы удалять определенную ветвь данного изделия и т.д. Это общая постановка задачи. В общем случае, изделие не обязано быть завязанным на нулевую сборку, хотя оно физически ей и является. Тем не менее, связь между изделием и нулевой сборкой все-таки должна существовать, иначе в некоторых случаях нельзя определпть, какая из ветвей является корневой. Наиболее очевидным для меня способом связать их - это в определении изделия дать ссылку на деталь, являющейся корневой. Однако при этом возникают вышеозвученные проблемы. Уж больше и не знаю, как можно еще более понятно описать проблему, сорри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 10:35 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
stenf Вы опять, без таблиц правда, описали Ваше решение какой-то задачи, а не саму задачу. Хочется понять, почему типовые варианты BOM Вас не устраивают, но для этого нужно знать хотя-бы образ задачи, а не Ваше решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 11:30 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
дядя, похоже ты недавно оттуда ?! :)) я погорячился, не читай! особенно страшных книжек про 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) автор В базе должны быть написаны запросы, которые возвращали-бы например "все детали/сборки данного изделия" и "всю входимость данного изделия", могли-бы удалять определенную ветвь данного изделия и т.д. запросы ты будешь написывать или ты только теоретик/архитектор? дядя, не обижайся! тебе рассказывают, рассказывают а ты цитируешь гегеля ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 11:45 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=34216898&tid=1544780]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
193ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 577ms |

| 0 / 0 |
