|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Симонов Денис> ну про каскады вообще страшилок много На заборах тоже пишут, не читай на ночь. :) Симонов Денис> Во первых порядок их срабатывания вовсе Симонов Денис> не тот что многие ожидают Во-первых, тогда так и надо говорить, а не "зло". Во-вторых, что ожидают многие я не знаю, но у меня никаких претензий к порядку срабатывания нет, что именно тебе не нравится/удивительно? Симонов Денис> Во вторых цепочка каскадов это всё равно что цепочка триггеров Тогда уж говорите, что и триггеры тоже зло. А заодно предложите альтернативу удалению не каскадами и не триггерами. Впрочем, я заранее знаю, что вы скажете. Симонов Денис> А уж если на каждой таблице участвующей Симонов Денис> в каскаде ещё и триггеры на удаление навешаны Во-первых, это несерьёзно, во-вторых, ничего страшного при этом не будет, не "пропало". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 22:05 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамПроблема ещё актуальна или уже разобрался? видимо тут передмудрил Код: plsql 1. 2.
несколько одинаковых полей были в разных ФК ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2016, 02:19 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, вот только почему если в разных ФК используется одно и то же поле каскад не проходит? вот сейчас смотрю на тело договора. там один фк на шапку. в нем есть поле признака. и второй фк на тело другого документа. там тоже используется это же поле. каскад споткнулся ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2016, 22:03 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Swv> вот только почему если в разных ФК используется Swv> одно и то же поле каскад не проходит? Я не очень понял вопрос. Участие одного поля в несколько внешних ключах не запрещено и работает (возможно с багами). Ссылки из некольких полей на одно поле (т.е. много деталей у мастера) тем более не запрещено, работает годами. Так что лучше приводи DDL. И без всяких новоязов типа "каскад споткнулся", а точное сообщение об ошибке и DML, который к нему привёл. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 13:10 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, вот я тоже думаю, что не запрещено. но поубирав некоторые ФК на этих таблицах спотыкаться перестал DDL слишком большой будет ) а сообщение страндартное violation of FOREIGN KEY constraint "". violation of FOREIGN KEY constraint "FK_BODY_1" on table "BODY". Foreign key reference target does not exist. Problematic key value is ("PART_ID" = 77, "MAIN_ID" = 80, "HEADER_ID" = 302, "YEAR_ID" = 3, "ORG_ID" = -1). At trigger 'CHECK_292' At trigger 'CHECK_290' At trigger 'CHECK_235'. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:09 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
body это не обновляемая в данном случае таблица. до нее каскад дошел. и споткнулся ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:11 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
SwvDDL слишком большой будет DDL двух таблиц master + detail не может быть очень большим, если ты конечно не 255 столбцов в каждой создал. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:19 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
сейчас нашел в одной из таблиц , которые по идее должны обновиться, не каскадный ФК. поставил у него CASCADE и споткнулось уже на этой таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:27 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Симонов Денис, от обновляемой таблицы по набору полей зависит другая, а от нее другая... и тд. всего штук 15-20. вот по ним и идет каскад. так что думаю смысла нет смотреть на две таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:29 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Swv> DDL neeoei? aieuoie aoaa? ) Как верно заметил Денис, DDL двух (или трёх) задействованных таблиц большим быть не может. Даже если много полей - можешь просто выкинуть ненужные, оставив только поля PK и FK. И DML, который приводит к ошибке, не забудь привести. Не будет DDL+DML - вряд ли кто-то сможет помочь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:37 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Swv, столько гемора из-за Swv...чтобы таблицу пятых документов можно было бы быстро отфильтровать по этому признаку не joinив все вплоть до первой таблицы. Ну смотри. Ты фильтруешь по полю, которое у тебя продублировано в табличке нижнего уровня. Для эффективной фильтрации у тебя должен быть подходящий индекс. Иначе, если табличка большая - может получиться грустно. ... А теперь - "с джойном". Ты фильтруешь по полю в табличке верхнего уровня. Эта табличка наверняка меньше, чем табличка "нижнего уровня". Фильтруется быстро, стало быть. А потом к остатку джойнятся только те записи, которые ты должен увидеть. Выигрыш по скорости - налицо. Даже из-за этого есть смысл все переделать на искусственные ключи на основе целочисленной последовательности. Выигрыш - колоссальный: не нужно каскадно обновлять данные, уменьшается размер базы, упрощается сопровождение, во мнгих случаях возрастает скорость обработки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:47 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Ну смотри, ну согласен ) может так и есть. но дублировал еще по той причине, что было необходимо, чтобы в тело второго документа нельзя было добавить ничего, кроме как из тела первого документа, тк первый есть основание для второго. может конечно и перемудрил. DDL порезал. DDL Код: plsql 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61.
в данном случае спотыкается на FK_STARTP2_5. если же у него убрать каскадность, то тут уже ошибки не будет. появится на другой таблице обновляю так Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 15:54 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Swv...но дублировал еще по той причине, что было необходимо, чтобы в тело второго документа нельзя было добавить ничего, кроме как из тела первого документа, тк первый есть основание для второго... ... Если в документе не будет полей, куда можно добавить это самое "что-то не то", то и проблемы такой не будет. Бывает, конечно, необходимость брать данные из справочной таблицы не "по ссылке", а по значению. Например, чтобы зафиксировать цену, по которой товар был продан, цена в платежный документ копируется из прайса, прай после этого может меняться, а в платежном документе останется цена на момент покупки. Но в этом случае уж точно никакого каскадного обновления не потребуется, и это явно не твой случай. Насчет суррогатных кл.чей смотри сюда: http://www.informix.com.ua/articles/key/key.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 16:14 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Ну смотри, ок. есть вот такие вот таблицы Код: plsql 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. 40. 41. 42. 43. 44. 45. 46. 47.
z1 и z2 это два документа. Z2.BASE_ID это базовый документ Z1. Соответственно в Z2_1 для конкретного документа не должно быть ничего, чего нет в Z1_1 соответствующего документа Z2.BASE_ID Какое ограничение добавить? По мне так в Z2_1 надо добавить тоже base_id и создать ФК Z2_1 (Z2_id,BASE_ID) REFERENCES Z2 (C,BASE_ID). тогда добавление как должно быть не пройдет ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 18:15 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
могу только погрешить на зацикленные каскадные ссылочные действия ) как говорил kdv. Есть какой нибудь запрос на выявления этих циклов? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 18:51 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
SwvЕсть какой нибудь запрос на выявления этих циклов? я думал, что он у меня тут www.ibase.ru/sysqry/ но оказывается, что нет. по идее, можно выполнить запрос 9, и просканировать его на "зацикливание". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 19:12 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
по стеку ошибки удалось однако узнать порядок срабатывания системных триггеров этих самых каскадов. получилась такая картина Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
обновлялась HEADER0_BODY. а споткнулась на HEADER1_BODY ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 20:35 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
выполняется каскад так HEADER0_BODY HEADER1 HEADER2 HEADER1_BODY HEADER2_BODY но получается, что сначала обрабатывается HEADER1_BODY, а потом уже HEADER2. И доходит до HEADER2_BODY и обламывается. что намудрил? HEADER2 имеет ссылку на документ-основание HEADER1. а чтобы "залочить" HEADER2_BODY на соответствующий HEADER1_BODY в HEADER2_BODY имеется ссылка и ФК на HEADER1_BODY. Вот тут видимо и перемудрил. вот только как поправить с учетом того, что у второго документа есть документ документ-основание и в теле второго документа не должно быть ничего кроме как из тела документа-основания ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 21:29 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
SwvСоответственно в Z2_1 для конкретного документа не должно быть ничего, чего нет в Z1_1 соответствующего документа Z2.BASE_IDЯННП. А то, что понял - не уверен, что понял правильно. Более того, у тебя и с именованием объектов проблемы. Затрудняешься объяснить - приводи таблички с данными. Если Z11 и Z21 - это две таблицы для одной сущности (т.е. для разных её атрибутов) - так и скажи. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 22:18 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, z1, z1_1 - шапка-тело ) z2 ,z2_1 аналогично ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 23:10 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
И? Какое отношение Z21 имеет к Z11 или Z1 ? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 23:18 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
Имхо, автору следует обратиться в http://www.sql.ru/forum/db-design ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2016, 02:03 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
МимопроходящийSwv, советовать тебе сейчас что-либо, не зная предметной области и поставленной задачи смысла не имеет. есть общие принципы проектирования БД (помимо нормализации). один из них - избегать составных ПЕРВИЧНЫХ ключей. нужна уникальность по группе полей - создавай УНИКАЛЬНЫЙ ключ (но не первичный). а первичный ключ обычно делают суррогатным, на генераторах, сиквенсах, автоинкрементах, UUID-ах и т.п. на такой ключ гораздо удобнее ссылаться из FK и не нужно городить каскадные обновления. к слову, легенда гласит, что если на ПК вообще забить, mysql его сам создаст произвольно ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2016, 09:12 |
|
Каскадный ФК
|
|||
---|---|---|---|
#18+
kdvэто не анекдот.Каждый анекдот - это зачастую реальное событие, гиперболизированное вплоть до абсурда, так что не вижу никаких противоречий. Гаджимурадов РустамКак будто если бы удаление в этой БД было на триггерах, а не каскадное - стало бы легче/лучше.Речь не о способе реализации, а о самой архитектуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2016, 09:57 |
|
|
start [/forum/topic.php?fid=40&msg=39196580&tid=1562244]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 154ms |
0 / 0 |