|
|
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyТак хорошо? Замечательно. Итак, вы согласны с тем, что "отслеживание истории записей" никакого отношения к SQL не имеет, а является "понятием другого порядка". Собственно тут и кроется причина противоречий в вашем утверждении после которого я влез в дискуссию: iljyНе очень понятно, зачем в триггере достукиваться до конкретной записи, скуль - язык обработки множеств. Но для правильного сопоставления двух множеств inserted и deleted необходим неизменяющийся уникальный ключ, одноpначно идентифицирующий запись. Если вы ссылаетесь на "скуль", то никаких задач по "однозначной идентификации записей" не встает. А если вы оперируете "понятиями другого порядка", то задача о "достукивании в триггере до конкретной записи" вполне себе правильная. Но вернувшись к теме топика можно заметить, что речь идет о таблице связей. Записи этой таблицы вряд ли можно рассматривать "воплощению некоторого объекта предметной области". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2011, 17:22 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
Bogdanov AndreyСобственно тут и кроется причина противоречий в вашем утверждении после которого я влез в дискуссию: iljyНе очень понятно, зачем в триггере достукиваться до конкретной записи, скуль - язык обработки множеств. Но для правильного сопоставления двух множеств inserted и deleted необходим неизменяющийся уникальный ключ, одноpначно идентифицирующий запись. Если вы ссылаетесь на "скуль", то никаких задач по "однозначной идентификации записей" не встает. А если вы оперируете "понятиями другого порядка", то задача о "достукивании в триггере до конкретной записи" вполне себе правильная. Извините, но видно что вы теоретик Под "достукиванием до конкретной записи" обычно понимается позаписная обработка в цикле. И именно это вступает в противоречие с декларативной природой скуля. А для множественной обработки, позволяющей нам тем или иным способом отследить историю изменений записи-объекта, нужно иметь способ сопоставления записей-кортежей в множествах inserted-deleted. Bogdanov AndreyНо вернувшись к теме топика можно заметить, что речь идет о таблице связей. Записи этой таблицы вряд ли можно рассматривать "воплощению некоторого объекта предметной области". Во-первых, здесь не совсем таблица связей: в ней явно больше 2х полей, так что это скорее не связь, а подчиненный объект Запчасть-Автомобиля, являющийся конкретизацией объекта Запчасть. Но тут пусть ТС сам решает, я всей структуры не вижу. Ну а во-вторых - то мое утверждение уже вышло за рамки топика, меня попросили сказать, какие потенциальные проблемы в принципе могут возникнуть при разрешении изменять ПК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2011, 17:34 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljyКакой вы скучный, все вам на пальцах надо разжевывать... sphinx_mvПроблема НЕ возникает из-за разрешения изменений ПК - проблемы МОГУТ возникнуть. А могут и НЕ возникнуть... И если проблема ВОЗНИКЛА - есть ВЕСЬМА существенная вероятность, что надо "что-то менять в консерватории", ака, в логике и структуре БД. Да, и изменение должно заключаться в создании суррогатного неизменяемого ключа. Ваша проблема в том, что Вы требуете этого независимо от задачи... При этом, вроде бы, соглашаясь, что ЕСТЬ много задач, которые ПРЕКРАСНО могут жить даже с изменяемым естественным ключом. iljysphinx_mvВаш пример? ... Вот и запустите его... О результатах не забудьте доложить... Надеюсь, Вы НЕ получите message 547, level 16, state 1... Но это вряд ли... Зашибись! А ничего, что я писал про INSTEAD OF триггер? И ах простите - я не ткнул вас носом, что приведенный код работает в ситуации, когда отсутствуют декларативные связи и поддержание целостности целиком возложено на триггеры. Хорошо, ткну сейчас. Естественно при наличии декларативной связи код триггера усложняется: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ИCХОДНЫЙ ВАШ код НЕ РАБОТАЕТ - потому ЭТОТ пример идет лесом и очень далеко... Это во-первых... Во-вторых... Перечитайте ВСЕ ваши посты и НАЙДИТЕ в каком из них ПОЯВЛЯЕТСЯ INSTEAD OF - кстати, уже после того, как Вам указали на НЕ работоспособность Вашего кода... В-третьих... Ваш ИСХОДНЫЙ пример НЕ сработает даже внутри INSTEAD OF триггера... В-четвертых. Обсуждалась ДЕКЛАРАТИВНАЯ ссылочной целостности и Ваши неоглашенные допущения об ее отсутствии в качестве аргумента восприниматься НЕ МОГУТ даже сейчас, когда Вы их снизошли изложить... iljysphinx_mvЕсли при удалении из таблицы A Вашего примера таблица D попадает под обработку, сколько по Вашему раз должны были бы сработать (сугубо теоретически) триггера (при их наличии) этой таблицы? Каскадные удаления по таблицам B и C не зависят друг от друга... Соответственно, и триггеры таблицы D имеют все шансы отработать (независимо) тоже два раза... По одним и тем же данным... Чего в этом случае будет стоить результат подобной обработки - на Ваше собственное усмотрение. Это была попытка разумного объяснения (на пальцах)... Вообще-то наличие триггеров - это уже дополнительное условие, при котором каскад может давать проблемы. Да и условие-то хиленькое. С какого перепугу триггера сработают на одних и тех же данных? Первый каскад что-то удалит из таблицы - сработает триггер, после чего второй будет что-то удалять из того, что останется, и триггер сработает на новых данных. Да и потом, объединить таблицы deleted и запустить триггеры AFTER один раз - не великая проблема. А INSTEAD OF триггеры при наличии каскадной связи в принципе запрещены. Так что хиленький примерчик. Наличие триггеров - никакое не "дополнительное" условие! Это стандартная, хорошо документированная функциональность сервера. Когда использование стандартной функциональности начинают влиять на невозможность использования каких-то Ваших заморочек - может проблема в Ваших заморочках? Кстати, если вам еще не надоело гнуть пальцы, рассмотрите ситуацию, когда ДВА разных удаления (из таблицы B и из таблицы C) в каскадной операции удаления/обновления из таблицы A пытаются обратиться к одной и той же записи в таблице D - такое может быть? Что со взаимными блокировками делать будете? Какую часть ВСЕЙ операции (все модификации во ВСЕХ таблицах) отменять "по таймауту"? Намекну: отмена любой из них откатит ВСЮ операцию - одна транзакция, однако... И что Вы уперлись в INSTEAD OF? Разве Вы не в курсе, что есть еще и другие типы триггеров, которых в отличие от INSTEAD OF может даже быть больше одного на каждый вид операции? iljysphinx_mvпропущено... К чему мне искать для Вас обобщенные случаи, если Вы даже в своих частных не особо разобрались? Разобрался я в ваших частных. Хреновенькие они. Тут, скорее, Вы хреновенько разобрались... Но, "в общем случае" это излечимо... iljysphinx_mvпропущено... Не более Вашего - " естественный ключ у вас тут напрашивается (car, part)" (с)... Ну а кой же он тут? Вполне себе составной естественный ключ. Вы вообще с декларацией этих полей в таблице успели ознакомиться? Чего-то я как-то не припомню (из реальной жизни) ни автомобиля "1", ни гайки "10"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2011, 18:45 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
sphinx_mviljyКакой вы скучный, все вам на пальцах надо разжевывать... пропущено... Да, и изменение должно заключаться в создании суррогатного неизменяемого ключа. Ваша проблема в том, что Вы требуете этого независимо от задачи... Вы издеваетесь чтоли? Я всю дорогу говорю о том, что создавать суррогатный ключ нужно только в случае реальной необходимости. И один из признаков, что необходимость такая есть, это возможные изменения натурального ПК. Но я сразу говорил что неизменяемость - "очень и очень существенное пожелание к ПК", и нигде не говорил, что это железное требование. А дальше меня начали спрашивать, какие проблемы может повлечь изменение ПК, и я начал приводить примеры возможных проблем. Я нигде не говорил, что они обязательно возникнут. sphinx_mv ИCХОДНЫЙ ВАШ код НЕ РАБОТАЕТ - потому ЭТОТ пример идет лесом и очень далеко... Это во-первых... Во-вторых... Перечитайте ВСЕ ваши посты и НАЙДИТЕ в каком из них ПОЯВЛЯЕТСЯ INSTEAD OF - кстати, уже после того, как Вам указали на НЕ работоспособность Вашего кода... В-третьих... Ваш ИСХОДНЫЙ пример НЕ сработает даже внутри INSTEAD OF триггера... В-четвертых. Обсуждалась ДЕКЛАРАТИВНАЯ ссылочной целостности и Ваши неоглашенные допущения об ее отсутствии в качестве аргумента восприниматься НЕ МОГУТ даже сейчас, когда Вы их снизошли изложить... Да, есть у меня такой грешок - я часто пропускаю в рассуждениях соображения, которые кажуться мне тривиальными, чтобы не создавать у собеседника впечатления, что я считаю его идиотом. Принято, для вас я буду делать исключения. sphinx_mvНаличие триггеров - никакое не "дополнительное" условие! Это стандартная, хорошо документированная функциональность сервера. Когда использование стандартной функциональности начинают влиять на невозможность использования каких-то Ваших заморочек - может проблема в Ваших заморочках? Нет уж, это именно дополнительное условие - множественные каскадные удаления должны быть запрещены при наличии триггеров. Соответственно мы должны запрещать создание множественных каскадов при наличии триггеров и создание триггеров при наличии множественых каскадов (как собственно делается для INSTEAD OF-триггеров и любых каскадов). Да и то кстати не факт. sphinx_mvКстати, если вам еще не надоело гнуть пальцы, рассмотрите ситуацию, когда ДВА разных удаления (из таблицы B и из таблицы C) в каскадной операции удаления/обновления из таблицы A пытаются обратиться к одной и той же записи в таблице D - такое может быть? Что со взаимными блокировками делать будете? Какую часть ВСЕЙ операции (все модификации во ВСЕХ таблицах) отменять "по таймауту"? Намекну: отмена любой из них откатит ВСЮ операцию - одна транзакция, однако... Какие взаимные блокировки в рамках одной сессии? Кто с кем за что будет бороться? Или вы про распараллеливание решили поговорить? Так оно при каскадных операциях обычно запрещено ( Restrictions on Parallel DML ). sphinx_mvИ что Вы уперлись в INSTEAD OF? Разве Вы не в курсе, что есть еще и другие типы триггеров, которых в отличие от INSTEAD OF может даже быть больше одного на каждый вид операции? А вы разве не в курсе, что реализовать каскадное удаление/изменение при наличии декларативного ограничения вида FOREIGN KEY ... ON DELETE/UPDATE NO ACTION можно только INSTEAD OF/BEFORE триггером? Ну значит теперь будете. А при каскадах INSTEAD OF триггеры запрещены (я об этом сказал), так что мы однозначно говорим о проблемах при наличии AFTER-триггеров (простите, что забыл сказать об этом явно большими буквами ). sphinx_mviljyпропущено... Разобрался я в ваших частных. Хреновенькие они. Тут, скорее, Вы хреновенько разобрались... Но, "в общем случае" это излечимо... Хоть бы одним глазком на "Тот Самый Общий Случай" взглянуть... sphinx_mviljyпропущено... Ну а кой же он тут? Вполне себе составной естественный ключ. Вы вообще с декларацией этих полей в таблице успели ознакомиться? Чего-то я как-то не припомню (из реальной жизни) ни автомобиля "1", ни гайки "10"... Видите ли в чем дело... Вспомните, Ваше Высочество, ведь Суррога́тный ключ — это дополнительное служебное поле, добавленное к уже имеющимся информационным полям таблицы, единственное предназначение которого — служить первичным ключом. Значение этого поля не образуется на основе каких-либо других данных из БД, а генерируется искусственно.. Так что Вы безусловно абсолютно точно и полно подметили, что ключи car и part являются несомненно суррогатными для таблиц Автомобили и Запчасти. Но позволю себе нижайше обратить Ваше просвященное внимание на то, что для таблицы test эти поля являются информационными, поскольку наверняка (это допущение, основанное на предположениях о предметной области ТС, но я смею надеяться, что Ваш беспристрастный взгляд сочтет сие допущение имеющим право на существование) ссылаются на соответствующие поля таблиц Автомобиль и Запчасти соответственно. Следствием же этого является тривиальный факт, что ключ, образованный этими полями, никак не может быть суррогатным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2011, 20:05 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljysphinx_mvВаша проблема в том, что Вы требуете этого независимо от задачи... Вы издеваетесь чтоли? Я всю дорогу говорю о том, что создавать суррогатный ключ нужно только в случае реальной необходимости. И один из признаков, что необходимость такая есть, это возможные изменения натурального ПК. Но я сразу говорил что неизменяемость - "очень и очень существенное пожелание к ПК", и нигде не говорил, что это железное требование. А дальше меня начали спрашивать, какие проблемы может повлечь изменение ПК, и я начал приводить примеры возможных проблем. Я нигде не говорил, что они обязательно возникнут. У Вас мысли отличаются от того, что вы пишите: не Вы ли писали, что ПК не должен меняться? Кто и какого это запретил?! И не Вы ли писали, что "проблемы возникают" (даже без всяких "иногда", кстати)? А они всего лишь МОГУТ ИНОГДА возникнуть... Даже некоторое увеличение нагрузки при обновлении связанных таблиц, увеличение занимаемого базой дискового пространства и усложнение синтаксиса запросов очень не всегда становятся проблемой... iljysphinx_mv ИCХОДНЫЙ ВАШ код НЕ РАБОТАЕТ - потому ЭТОТ пример идет лесом и очень далеко... Это во-первых... Во-вторых... Перечитайте ВСЕ ваши посты и НАЙДИТЕ в каком из них ПОЯВЛЯЕТСЯ INSTEAD OF - кстати, уже после того, как Вам указали на НЕ работоспособность Вашего кода... В-третьих... Ваш ИСХОДНЫЙ пример НЕ сработает даже внутри INSTEAD OF триггера... В-четвертых. Обсуждалась ДЕКЛАРАТИВНАЯ ссылочной целостности и Ваши неоглашенные допущения об ее отсутствии в качестве аргумента восприниматься НЕ МОГУТ даже сейчас, когда Вы их снизошли изложить... Да, есть у меня такой грешок - я часто пропускаю в рассуждениях соображения, которые кажуться мне тривиальными, чтобы не создавать у собеседника впечатления, что я считаю его идиотом. Принято, для вас я буду делать исключения. После того, как Вы с пеной у рта утверждали, что неработающий в обсуждаемых условиях код обязательно будет работать - мне от этого сугубо... Одним "гениальным" (censored) больше... одним меньше... Я их уже столько повидал... iljysphinx_mvНаличие триггеров - никакое не "дополнительное" условие! Это стандартная, хорошо документированная функциональность сервера. Когда использование стандартной функциональности начинают влиять на невозможность использования каких-то Ваших заморочек - может проблема в Ваших заморочках? Нет уж, это именно дополнительное условие - множественные каскадные удаления должны быть запрещены при наличии триггеров. Соответственно мы должны запрещать создание множественных каскадов при наличии триггеров и создание триггеров при наличии множественых каскадов (как собственно делается для INSTEAD OF-триггеров и любых каскадов). Да и то кстати не факт. Вы уж определитесь - Вам шашечки или ехать? Еще чуть-чуть, и Вы начнете требовать отмены использования хранимых процедур и заставлять выполнять всю обработку данных на клиенте... iljysphinx_mvКстати, если вам еще не надоело гнуть пальцы, рассмотрите ситуацию, когда ДВА разных удаления (из таблицы B и из таблицы C) в каскадной операции удаления/обновления из таблицы A пытаются обратиться к одной и той же записи в таблице D - такое может быть? Что со взаимными блокировками делать будете? Какую часть ВСЕЙ операции (все модификации во ВСЕХ таблицах) отменять "по таймауту"? Намекну: отмена любой из них откатит ВСЮ операцию - одна транзакция, однако... Какие взаимные блокировки в рамках одной сессии? Кто с кем за что будет бороться? А не расскажете как каскадные удаления/обновления из B и С будут выполнять модификации в D? Напоминаю, если у вас с памятью что-то случилось, модификации в B и C вызваны каскадными операциями в A... Т.е. выполняются в рамках одного процесса. Вероятность параллельного выполнения больше 0. Между потоками начинается соревнование за ресурсы, "проигравший" поток ждет снятия блокировок с захваченной другим потоком таблицы. Дождется? iljy Или вы про распараллеливание решили поговорить? Так оно при каскадных операциях обычно запрещено ( Restrictions on Parallel DML ). Очччееень умнО! Это просто пять! Какое, простите, отношение Oracle имеет к MSSQL? Может тогда Вы нам расскажете про мутации таблиц на Oracle?.. И про "тривиальность" их обхода?.. iljysphinx_mvИ что Вы уперлись в INSTEAD OF? Разве Вы не в курсе, что есть еще и другие типы триггеров, которых в отличие от INSTEAD OF может даже быть больше одного на каждый вид операции? А вы разве не в курсе, что реализовать каскадное удаление/изменение при наличии декларативного ограничения вида FOREIGN KEY ... ON DELETE/UPDATE NO ACTION можно только INSTEAD OF/BEFORE триггером? Ну значит теперь будете. Я Вам разве УЖЕ не говорил, что если возможности декларативной ссылочной целостности меня НЕ будут устраивать, я ее реализую на триггерах БЕЗ ее использования? Хотя, как я мог забыть - это же "бредятина" (с)... iljyА при каскадах INSTEAD OF триггеры запрещены (я об этом сказал), так что мы однозначно говорим о проблемах при наличии AFTER-триггеров (простите, что забыл сказать об этом явно большими буквами ). Если Вы не знаете как запустить триггер INSTEAD OF в рамкак каскадной операции, это совершенно не значит, что такие триггеры ЗАПРЕЩЕНЫ. Но это так... К слову, пришлось... iljysphinx_mvВы вообще с декларацией этих полей в таблице успели ознакомиться? Чего-то я как-то не припомню (из реальной жизни) ни автомобиля "1", ни гайки "10"... Видите ли в чем дело... Вспомните, Ваше Высочество, ведь Суррога́тный ключ — это дополнительное служебное поле, добавленное к уже имеющимся информационным полям таблицы, единственное предназначение которого — служить первичным ключом. Значение этого поля не образуется на основе каких-либо других данных из БД, а генерируется искусственно.. Так что Вы безусловно абсолютно точно и полно подметили, что ключи car и part являются несомненно суррогатными для таблиц Автомобили и Запчасти. Но позволю себе нижайше обратить Ваше просвященное внимание на то, что для таблицы test эти поля являются информационными, поскольку наверняка (это допущение, основанное на предположениях о предметной области ТС, но я смею надеяться, что Ваш беспристрастный взгляд сочтет сие допущение имеющим право на существование) ссылаются на соответствующие поля таблиц Автомобиль и Запчасти соответственно. Следствием же этого является тривиальный факт, что ключ, образованный этими полями, никак не может быть суррогатным. Составной ключ на основе суррогатных полей быть "естественным" никак не может... По очень простой причине - ну, не несет он непосредственной полезной информационной нагрузки ни из какой предметной области... Это так, к сведению... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 01:35 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
sphinx_mviljyпропущено... Вы издеваетесь чтоли? Я всю дорогу говорю о том, что создавать суррогатный ключ нужно только в случае реальной необходимости. И один из признаков, что необходимость такая есть, это возможные изменения натурального ПК. Но я сразу говорил что неизменяемость - "очень и очень существенное пожелание к ПК", и нигде не говорил, что это железное требование. А дальше меня начали спрашивать, какие проблемы может повлечь изменение ПК, и я начал приводить примеры возможных проблем. Я нигде не говорил, что они обязательно возникнут. У Вас мысли отличаются от того, что вы пишите: не Вы ли писали, что ПК не должен меняться? Кто и какого это запретил?! И не Вы ли писали, что "проблемы возникают" (даже без всяких "иногда", кстати)? А они всего лишь МОГУТ ИНОГДА возникнуть... Даже некоторое увеличение нагрузки при обновлении связанных таблиц, увеличение занимаемого базой дискового пространства и усложнение синтаксиса запросов очень не всегда становятся проблемой... Вы читать вообще умеете? Может шрифт мелковат? iljyнеизменяемость - "очень и очень существенное пожелание к ПК" sphinx_mviljyпропущено... Да, есть у меня такой грешок - я часто пропускаю в рассуждениях соображения, которые кажуться мне тривиальными, чтобы не создавать у собеседника впечатления, что я считаю его идиотом. Принято, для вас я буду делать исключения. После того, как Вы с пеной у рта утверждали, что неработающий в обсуждаемых условиях код обязательно будет работать - мне от этого сугубо... Одним "гениальным" (censored) больше... одним меньше... Я их уже столько повидал... Когда нечего сказать по существу - цепляются к формальностям... sphinx_mvВы уж определитесь - Вам шашечки или ехать? Еще чуть-чуть, и Вы начнете требовать отмены использования хранимых процедур и заставлять выполнять всю обработку данных на клиенте... ... или флудят. sphinx_mviljyпропущено... Какие взаимные блокировки в рамках одной сессии? Кто с кем за что будет бороться? А не расскажете как каскадные удаления/обновления из B и С будут выполнять модификации в D? Напоминаю, если у вас с памятью что-то случилось, модификации в B и C вызваны каскадными операциями в A... Т.е. выполняются в рамках одного процесса. Вероятность параллельного выполнения больше 0. Между потоками начинается соревнование за ресурсы, "проигравший" поток ждет снятия блокировок с захваченной другим потоком таблицы. Дождется? iljy Или вы про распараллеливание решили поговорить? Так оно при каскадных операциях обычно запрещено ( Restrictions on Parallel DML ). Очччееень умнО! Это просто пять! Какое, простите, отношение Oracle имеет к MSSQL? Позвольте обратить Ваше просвещенное внимание на постенький факт: MSSQL до сих пор не умеет распараллеливать DML-операции. А когда научится (хотя по-моему даже в Denali этого не обещают) - решение проблемы каскадов можно слизнуть из оракла. sphinx_mvМожет тогда Вы нам расскажете про мутации таблиц на Oracle?.. И про "тривиальность" их обхода?..Ну уж это-то вы к чему приплели? Умным словом сверкнуть решили от безысходности? Проблема мутации таблиц (она же ошибка ORA-04091) возникает при обращении из ROW-level триггера к изменяющейся таблице. Один из вариантов решения - симуляция STATEMENT-триггеров с помощью явного создания таблиц inserted-deleted в качестве переменных пакета. sphinx_mviljyпропущено... А вы разве не в курсе, что реализовать каскадное удаление/изменение при наличии декларативного ограничения вида FOREIGN KEY ... ON DELETE/UPDATE NO ACTION можно только INSTEAD OF/BEFORE триггером? Ну значит теперь будете. Я Вам разве УЖЕ не говорил, что если возможности декларативной ссылочной целостности меня НЕ будут устраивать, я ее реализую на триггерах БЕЗ ее использования? Хотя, как я мог забыть - это же "бредятина" (с)... Безусловно бредятина. Не вижу ни одной причины отказываться от декларирования ВК только из-за невозможности написать ON DELETE CASCADE. При этом в схеме базы сохраняется явно прописанная логическая связь, движок СУБД обеспечивает практически всю функциональность ВК, а недостающую (и только недостающую, а не весь комплект) я дописываю простеньким триггером. sphinx_mviljyА при каскадах INSTEAD OF триггеры запрещены (я об этом сказал), так что мы однозначно говорим о проблемах при наличии AFTER-триггеров (простите, что забыл сказать об этом явно большими буквами ). Если Вы не знаете как запустить триггер INSTEAD OF в рамкак каскадной операции, это совершенно не значит, что такие триггеры ЗАПРЕЩЕНЫ. Но это так... К слову, пришлось... iljyпропущено... Вы фееричны Прочитайте наконец документацию http://msdn.microsoft.com/en-us/library/ms189799.aspx For INSTEAD OF triggers, the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE. Similarly, the UPDATE option is not allowed on tables that have a referential relationship specifying a cascade action ON UPDATE. Специально для Вас напишу большими буквами - я говорю про наличие формального ограничения, а не про способы его обхода. sphinx_mvВидите ли в чем дело... Вспомните, Ваше Высочество, ведь пропущено... . Так что Вы безусловно абсолютно точно и полно подметили, что ключи car и part являются несомненно суррогатными для таблиц Автомобили и Запчасти. Но позволю себе нижайше обратить Ваше просвященное внимание на то, что для таблицы test эти поля являются информационными, поскольку наверняка (это допущение, основанное на предположениях о предметной области ТС, но я смею надеяться, что Ваш беспристрастный взгляд сочтет сие допущение имеющим право на существование) ссылаются на соответствующие поля таблиц Автомобиль и Запчасти соответственно. Следствием же этого является тривиальный факт, что ключ, образованный этими полями, никак не может быть суррогатным. Составной ключ на основе суррогатных полей быть "естественным" никак не может... По очень простой причине - ну, не несет он непосредственной полезной информационной нагрузки ни из какой предметной области... Это так, к сведению... Для тех кто в танке - повторяем нашу передачу: Суррога́тный ключ — это дополнительное служебное поле, добавленное к уже имеющимся информационным полям таблицы, единственное предназначение которого — служить первичным ключом. Значение этого поля не образуется на основе каких-либо других данных из БД , а генерируется искусственно. На всякий случай персонально для Вас уточню - первичные ключи других таблиц являются какими-либо другими данными из БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 11:36 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
iljysphinx_mvпропущено... После того, как Вы с пеной у рта утверждали, что неработающий в обсуждаемых условиях код обязательно будет работать - мне от этого сугубо... Одним "гениальным" (censored) больше... одним меньше... Я их уже столько повидал... Когда нечего сказать по существу - цепляются к формальностям... Неслабая такая формальность - предъявление претензий к НЕРАБОТАЮЩЕМУ фрагменту кода... iljysphinx_mvОчччееень умнО! Это просто пять! Какое, простите, отношение Oracle имеет к MSSQL? Позвольте обратить Ваше просвещенное внимание на постенький факт: MSSQL до сих пор не умеет распараллеливать DML-операции. А когда научится (хотя по-моему даже в Denali этого не обещают) - решение проблемы каскадов можно слизнуть из оракла. То есть, мусье как бы помягче выразиться, "несколько не в курсе", что MSSQL "не умеет" распараллеливать DML еще как бы не с 7 версии? И мусье не в курсе, что MSSQL и Oracle весьма отличаются архитектурой, и, чтобы чего-то "слизнуть" с одного на другой, нужно весьма неслабо корежить продукт - с неизвестным результатом и практически полной обратной несовместимостью? Уж после чего-чего, но после ТАКОГО к Вам вопросов я больше НЕ ИМЕЮ... iljysphinx_mvСоставной ключ на основе суррогатных полей быть "естественным" никак не может... По очень простой причине - ну, не несет он непосредственной полезной информационной нагрузки ни из какой предметной области... Это так, к сведению... Для тех кто в танке - повторяем нашу передачу: Суррога́тный ключ — это дополнительное служебное поле, добавленное к уже имеющимся информационным полям таблицы, единственное предназначение которого — служить первичным ключом. Значение этого поля не образуется на основе каких-либо других данных из БД , а генерируется искусственно. На всякий случай персонально для Вас уточню - первичные ключи других таблиц являются какими-либо другими данными из БД. И где же Вам такую траву продают-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 16:47 |
|
||
|
Нужен ли primary key в таблице, организующей связь один ко многим?
|
|||
|---|---|---|---|
|
#18+
sphinx_mviljyпропущено... Когда нечего сказать по существу - цепляются к формальностям... Неслабая такая формальность - предъявление претензий к НЕРАБОТАЮЩЕМУ фрагменту кода... К работающему, просто без явной оговорки очевидно необходимых для его работы условий. Так что увы и ах - вы цепляетесь за соломинку. sphinx_mviljyпропущено...Позвольте обратить Ваше просвещенное внимание на постенький факт: MSSQL до сих пор не умеет распараллеливать DML-операции. А когда научится (хотя по-моему даже в Denali этого не обещают) - решение проблемы каскадов можно слизнуть из оракла. То есть, мусье как бы помягче выразиться, "несколько не в курсе", что MSSQL "не умеет" распараллеливать DML еще как бы не с 7 версии? И мусье не в курсе, что MSSQL и Oracle весьма отличаются архитектурой, и, чтобы чего-то "слизнуть" с одного на другой, нужно весьма неслабо корежить продукт - с неизвестным результатом и практически полной обратной несовместимостью? Уж после чего-чего, но после ТАКОГО к Вам вопросов я больше НЕ ИМЕЮ... Как же вам идет ваш ник - вы тааакой загадочный! Я в курсе, и именно поэтому привел пример формального ограничения из оракла, в котором действительно могла бы возникнуть проблема конкурентного доступа при распараллеливании обработки нескольких каскадов. А для MSSQL проблемы взаимоблокировок в рамках одной сессии, которую вы изо всех сил тянули сюда за воображаемые уши, пока просто не существует (Ах простите, я опять не уточнил, что физические операции чтения и поиска данных в плане выполнения DML-оператора распараллеливаться могут, а вот модификации - увы. На всякий случай еще подстрахуюсь и уточню: распараллеливаться могут DDL-операции с индексами, но если вы расскажете, как в этом случае в рамках той же сессии могут возникнуть множественные каскады - вам можно будет ставить чугунный памятник в натуральную величину). И может объясните, каким образом "покорежит продукт" и "приведет к практически полной обратной несовместимости" принятие формального ограничения при предполагаемой реализации новой внутренней возможности движка? sphinx_mviljyпропущено... Для тех кто в танке - повторяем нашу передачу: пропущено... На всякий случай персонально для Вас уточню - первичные ключи других таблиц являются какими-либо другими данными из БД. И где же Вам такую траву продают-то? Что, красавица, и сказать-то по существу больше нечего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 18:09 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37427824&tid=1542038]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
410ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 712ms |

| 0 / 0 |
