|
|
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Насколько использование внешних ключей снижает быстродействие? В большинстве случаев без них можно обойтись, т.к. добавление данных я контролирую в клиентской программе (выбор из ниспадающего списка), а каскадное удаление можно реализовать вручную из того же клиента, тем более происходить оно будет редко. Доступ к БД будет только через клиент. Есть ли в таком случае смысл использовать внешние ключи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:15 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
DenlerienНасколько использование внешних ключей снижает быстродействие? Настолько, что в большинстве случаев их присутствие куда разумнее их отсутствия. DenlerienЕсть ли в таком случае смысл использовать внешние ключи? Это плохая постановка вопроса. Правильно так: когда Ваша программа будет давным-давно отлажена и проверена эксплуатацией, можно будет добавить в интерфейс администратора кнопку "повысить быстродействие на 2% путем удаления внешних ключей". И написать в инструкции: "если ваша база трещит по швам, то можно использовать эту кнопку, хотя авторы этого не рекомендуют". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:20 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
softwarerПравильно так: когда Ваша программа будет давным-давно отлажена и проверена эксплуатацией, можно будет добавить в интерфейс администратора кнопку "повысить быстродействие на 2% путем удаления внешних ключей". И написать в инструкции: "если ваша база трещит по швам, то можно использовать эту кнопку, хотя авторы этого не рекомендуют". Просто у пользователей не будет возможности добавить записи с несуществующей ссылкой. Единственное, что могут дать в моем случае FK - это автоматическое каскадное удаление. Да и логическая схема с ними лучше. Но 2% - это несущественно. Насколько корректна эта оценка? У меня, судя по всему, будут таблицы с парой внешних ключей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:27 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Хотя нет, есть еще одно преимущество - автоматический запрет удаления (там гед оно не каскадное) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:30 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Denlerien wrote: > лучше. Но 2% - это несущественно. Насколько корректна эта оценка? У > меня, судя по всему, будут таблицы с парой внешних ключей. для MS SQL 2000 - даже очень оптимистичная оценка. хотя, даже если бы было 5% - отказываться ради этого от FK - глупство. FK - последний рубеж защиты, и уповать на то, что "приложение всё контролирует само" - смысла особого не имеет. Все делают ошибки, йето раз. существуют еще программеры и ДБА, которые не в полной мере владеют информацией по базе, зато имеют к ней полный доступ - это два, и гарантировать, что каждый из них при изменении данных произведёт все необходимые проверки - чересчур оптимистично. -- ------------------------- There's no silver bullet! Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 12:36 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
DenlerienПросто у пользователей не будет возможности добавить записи с несуществующей ссылкой. Все constraint-ы в БД - это механизм защиты в первую очередь от ошибок программиста (и разработанной им программы). Во вторую очередь - от доступа руками в базу (и он неизбежно будет, хотя бы в Вашем личном исполнении, хотя бы в виде написанных/сгенерированных Вами скриптов). О защите от пользователя в constraint-ах речи практически не идет (если прикладуха позволяет пользователю организовать и увидеть нечто типа "constraint XYZ violated" - это, мягко говоря, не очень хорошая программа. Попытка бить себя пяткой в грудь с криком "уж я-то ошибки не сделаю, мне ограничения не нужны" - вызывает несколько скептическую улыбку. Делают. Все делают. Я не видел человека, который не делал бы ошибок. И, думаю, не увижу. DenlerienНо 2% - это несущественно. Насколько корректна эта оценка? Взята с потолка. Вы легко можете проверить, как изменится скорость Вашей программы при отключении ключей. В разных случаях - по-разному, очень резко по-разному. Но как правило - слишком мало для того, чтобы рассматривать этот вариант иначе как пригодный для редких особых случаев (например, ETL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 12:43 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Я тоже подумал, что лучше их оставить. А насчет других программеров - я никому полный доступ не дам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 12:43 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Denlerien wrote: > Я тоже подумал, что лучше их оставить. > А насчет других программеров - я никому полный доступ не дам. ....иных уж нет, а те - далече... ничто не вечно под луной... дадите, дадите, не сегодня, так завтра (когда уже забудется, что там внутре делается). Или сами возьмут. -- ------------------------- There's no silver bullet! Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 12:54 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > И написать в инструкции: "если ваша база > трещит по швам, то можно использовать эту кнопку, хотя авторы этого не > рекомендуют". Авторы могут использовать в серверном коде такие свойства внешних ключей как каскадное удаление, или обработчики ошибки при нарушении этих самых ключей. Тогда ИМХО вообще отключить не получится. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 13:05 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Denis PopovАвторы могут использовать в серверном коде такие свойства внешних ключей как каскадное удаление, Могут, конечно. Но я бы не стал. Denis Popovили обработчики ошибки при нарушении этих самых ключей. Хм. Вы имеете в виду стиль "попробовали - получили отлуп - попробовали иначе"? Имхо в большинстве случаев это не очень хороший стиль программирования. Denis PopovТогда ИМХО вообще отключить не получится. Безусловно. Я в данном случае исходил из утверждения автора, что отключение в принципе возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 13:40 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
softwarer Denis Popovили обработчики ошибки при нарушении этих самых ключей. Хм. Вы имеете в виду стиль "попробовали - получили отлуп - попробовали иначе"? Имхо в большинстве случаев это не очень хороший стиль программирования. Т.е., например, в случае ограничения уникальности лучше сначала проверить вручную, нет ли такой записи, а потом уже добавлять или не добавлять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 09:51 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
softwarerХм. Вы имеете в виду стиль "попробовали - получили отлуп - попробовали иначе"? Имхо в большинстве случаев это не очень хороший стиль программирования. Почему? Внесение некорректных (по связям) данных в отлаженой (более-менее) программе - это исключительная ситуация. И почему бы не обрабатывать это как исключительную ситуацию. Ведь иначе придется делать предпроверку, которая в 99.99% случаев будет успешной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 10:05 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
Я тоже думаю, что ограничение уникальности чаще выполняется, чем нет. И при невыполнении виноваты могут быть пользователи, а не ошибка программы. Например, вводится классификация клиентов (обчный, постоянный, VIP и т.д.), каждый класс уникальный, имеет identity-идентификатор. Но и имя класса также должно быть уникальным, и если пользователи пытаются создать еще один класс под тем же именем - это ошибка пользователей, а не программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 10:26 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
softwarer Denis PopovАвторы могут использовать в серверном коде такие свойства внешних ключей как каскадное удаление, Могут, конечно. Но я бы не стал. Отчего же? Типичная ситуация Товар --каскад--< Вхождение_в_группу >--не каскад-- Группа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 13:03 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
DenlerienНасколько использование внешних ключей снижает быстродействие? В большинстве случаев без них можно обойтись, т.к. добавление данных я контролирую в клиентской программе (выбор из ниспадающего списка), а каскадное удаление можно реализовать вручную из того же клиента, тем более происходить оно будет редко. Доступ к БД будет только через клиент. Есть ли в таком случае смысл использовать внешние ключи?Опять почему-то забываем про многопользовательский режим. В многопользовательской системе между успешной проверкой и последующим добавлением данных в БД может вклинится другая транзакция, и все предварительные проверки - псу под хвост. Значит, клиент должен явно блокировать проверенные данные от изменений - т.е. дополнительные затраты, а не экономия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 13:09 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
DenlerienТ.е., например, в случае ограничения уникальности лучше сначала проверить вручную, нет ли такой записи, а потом уже добавлять или не добавлять? Это вопрос, на который трудно ответить коротко и точно, и который по направленности не очень совпадает с тем, что я имел в виду в предыдущем ответе. Если говорить о процедуре, суть которой - в выполнении некоего insert-а одиночной записи, то в большинстве случаев не стоит делать предварительной проверки. Причин две: во-первых, это потенциально лишняя работа, во-вторых, это вносит возможность ошибки (например, в read committed существует пауза между проверкой и добавлением, в ходе которой кто-то другой может вставить нарушающую запись). Вопрос в том, что исключительная ситуация в большинстве случаев не должна планироваться как часть нормального рабочего процесса. Позволю себе искусственный пример - допустим, есть таблица Numbers, и задача формулируется как "вставить в нее те числа из диапазона 1..10, которые там сейчас отсутствуют). Так вот, в этом случае из вариантов Код: plaintext 1. 2. 3. и Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. первый с моей точки зрения лучше. Куда лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 14:19 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
СерегаПочему? Внесение некорректных (по связям) данных в отлаженой (более-менее) программе - это исключительная ситуация. Ключевые слова той моей фразы - "попробовали иначе". То есть ситуация не исключительная, а плановая, и соответственно обрабатывать ее как исключительную не совсем верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 14:20 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
ModelR softwarerМогут, конечно. Но я бы не стал. Отчего же? По моему опыту с каскадным удалением в итоге оказывается больше геморроя, нежели без него. Я позиционирую эту фразу как сугубо личную точку зрения (я бы не стал), не являющуюся настойчивой рекомендацией или претендующим на объективность суждением; также я не слишком хотел бы погрузиться в детальное обсуждение - почему именно. Причина - отсутствие хоть мало-мальски объективных критериев при широком спектре возможных ситуаций; в лучшем случае обсуждение получится сравнением конкретных ситуаций, эксклюзивного (плохо переносимого) опыта конкретных людей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 14:40 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
товары и категории товаров. При использовании каскадного удаления если удалить категорию то удалятся и товары. Так нельзя. письма и вложения в письмах. Если удалить письмо то нужно автоматом удалить и вложения. Или заказ и строки заказа. Использовать каскадное удаление нужно. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 15:17 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
1024Или заказ и строки заказа. Использовать каскадное удаление нужно. После чего в ходе сопровождения ТЗ дорабатывается: удалять можно и нужно только строки в статусе "не выполнено", а на строки в статусе "выполнено" - ругаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 15:30 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
softwarerпервый с моей точки зрения лучше. Куда лучше.Бесспорно. Но тема несколько другая, про клиента - скорее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Альтернатива без exception - БЛОКИРОВАТЬ всех нафиг пока я не надумаю. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 15:46 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
1024 товары и категории товаров. При использовании каскадного удаления если удалить категорию то удалятся и товары. Так нельзя. Дык Товар --каскад--< Вхождение_в_группу >-- не каскад -- Группа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 15:49 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
ModelRБесспорно. Но тема несколько другая, про клиента - скорее Вы упускаете из вида, что контекст - не только общий вопрос темы, но и конкретная фраза Дениса Попова, на которую я ответил этой. Там было сказано, что приложение может использовать обработчик исключительной ситуации, причем не на ограничение уникальности, а на внешний ключ (разница - в уникальности возникает проблема при вставке кем-то другим записи, а во внешнем ключе - при удалении), причем по контексту у меня сложилось впечатление, что имеется в виду использование обработчика исключений как часть бизнес-логики. И мой ответ ограничивался рамками именно этого аспекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 16:18 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
После чего в ходе сопровождения ТЗ дорабатывается: удалять можно и нужно только строки в статусе "не выполнено", а на строки в статусе "выполнено" - ругаться. ------------------------ Это значит что в ходе сопровождения выяснится что каскадное удаление в данном случае неприменимо. В примере с почтой и вложениями как-то наглядней. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 17:28 |
|
||
|
Использование внешних ключей
|
|||
|---|---|---|---|
|
#18+
1024Это значит что в ходе сопровождения выяснится что каскадное удаление в данном случае неприменимо. Именно. Причем - подчеркну - это не ошибка проектирования, а изменение требований в ходе последующего сопровождения. Причем отказаться от каскадного удаления довольно непросто, поскольку эта операция может быть неявно связана со многими другими (например, являться частью более глобального каскадного удаления). Повторю: по моим личным ощущениям использование каскадного удаления в итоге выливается в бОльшую трудоемкость по сравнению с ручной реализацией каскада. Я вполне верю в то, что по опыту других людей ситуация может быть другой. Однако, исхожу из следующего: если есть два метода, оба достаточно нетрудоемкие, при этом один из них хорошо работает всегда, а другой может вызвать проблемы в будущем - я буду использовать первый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 17:59 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33794675&tid=1545199]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 416ms |

| 0 / 0 |
