powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Использование внешних ключей
25 сообщений из 25, страница 1 из 1
Использование внешних ключей
    #33779850
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько использование внешних ключей снижает быстродействие? В большинстве случаев без них можно обойтись, т.к. добавление данных я контролирую в клиентской программе (выбор из ниспадающего списка), а каскадное удаление можно реализовать вручную из того же клиента, тем более происходить оно будет редко. Доступ к БД будет только через клиент.
Есть ли в таком случае смысл использовать внешние ключи?
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33779880
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenlerienНасколько использование внешних ключей снижает быстродействие?
Настолько, что в большинстве случаев их присутствие куда разумнее их отсутствия.

DenlerienЕсть ли в таком случае смысл использовать внешние ключи?
Это плохая постановка вопроса. Правильно так: когда Ваша программа будет давным-давно отлажена и проверена эксплуатацией, можно будет добавить в интерфейс администратора кнопку "повысить быстродействие на 2% путем удаления внешних ключей". И написать в инструкции: "если ваша база трещит по швам, то можно использовать эту кнопку, хотя авторы этого не рекомендуют".
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33779920
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerПравильно так: когда Ваша программа будет давным-давно отлажена и проверена эксплуатацией, можно будет добавить в интерфейс администратора кнопку "повысить быстродействие на 2% путем удаления внешних ключей". И написать в инструкции: "если ваша база трещит по швам, то можно использовать эту кнопку, хотя авторы этого не рекомендуют".
Просто у пользователей не будет возможности добавить записи с несуществующей ссылкой. Единственное, что могут дать в моем случае FK - это автоматическое каскадное удаление. Да и логическая схема с ними лучше. Но 2% - это несущественно. Насколько корректна эта оценка? У меня, судя по всему, будут таблицы с парой внешних ключей.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33779939
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя нет, есть еще одно преимущество - автоматический запрет удаления (там гед оно не каскадное)
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33780239
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denlerien wrote:
> лучше. Но 2% - это несущественно. Насколько корректна эта оценка? У
> меня, судя по всему, будут таблицы с парой внешних ключей.
для MS SQL 2000 - даже очень оптимистичная оценка.
хотя, даже если бы было 5% - отказываться ради этого от FK - глупство.
FK - последний рубеж защиты, и уповать на то, что "приложение всё
контролирует само" - смысла особого не имеет. Все делают ошибки, йето
раз. существуют еще программеры и ДБА, которые не в полной мере владеют
информацией по базе, зато имеют к ней полный доступ - это два, и
гарантировать, что каждый из них при изменении данных произведёт все
необходимые проверки - чересчур оптимистично.


--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33780278
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenlerienПросто у пользователей не будет возможности добавить записи с несуществующей ссылкой.
Все constraint-ы в БД - это механизм защиты в первую очередь от ошибок программиста (и разработанной им программы). Во вторую очередь - от доступа руками в базу (и он неизбежно будет, хотя бы в Вашем личном исполнении, хотя бы в виде написанных/сгенерированных Вами скриптов). О защите от пользователя в constraint-ах речи практически не идет (если прикладуха позволяет пользователю организовать и увидеть нечто типа "constraint XYZ violated" - это, мягко говоря, не очень хорошая программа.

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

DenlerienНо 2% - это несущественно. Насколько корректна эта оценка?
Взята с потолка.

Вы легко можете проверить, как изменится скорость Вашей программы при отключении ключей. В разных случаях - по-разному, очень резко по-разному. Но как правило - слишком мало для того, чтобы рассматривать этот вариант иначе как пригодный для редких особых случаев (например, ETL).
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33780279
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже подумал, что лучше их оставить.
А насчет других программеров - я никому полный доступ не дам.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33780317
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denlerien wrote:
> Я тоже подумал, что лучше их оставить.
> А насчет других программеров - я никому полный доступ не дам.
....иных уж нет, а те - далече... ничто не вечно под луной...
дадите, дадите, не сегодня, так завтра (когда уже забудется, что там
внутре делается). Или сами возьмут.

--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33780361
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:

> И написать в инструкции: "если ваша база
> трещит по швам, то можно использовать эту кнопку, хотя авторы этого не
> рекомендуют".

Авторы могут использовать в серверном коде такие свойства внешних ключей как
каскадное удаление, или обработчики ошибки при нарушении этих самых ключей.
Тогда ИМХО вообще отключить не получится.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33780495
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovАвторы могут использовать в серверном коде такие свойства внешних ключей как каскадное удаление,
Могут, конечно. Но я бы не стал.

Denis Popovили обработчики ошибки при нарушении этих самых ключей.
Хм. Вы имеете в виду стиль "попробовали - получили отлуп - попробовали иначе"? Имхо в большинстве случаев это не очень хороший стиль программирования.

Denis PopovТогда ИМХО вообще отключить не получится.
Безусловно. Я в данном случае исходил из утверждения автора, что отключение в принципе возможно.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33794619
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer Denis Popovили обработчики ошибки при нарушении этих самых ключей.
Хм. Вы имеете в виду стиль "попробовали - получили отлуп - попробовали иначе"? Имхо в большинстве случаев это не очень хороший стиль программирования.

Т.е., например, в случае ограничения уникальности лучше сначала проверить вручную, нет ли такой записи, а потом уже добавлять или не добавлять?
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33794675
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХм. Вы имеете в виду стиль "попробовали - получили отлуп - попробовали иначе"? Имхо в большинстве случаев это не очень хороший стиль программирования.
Почему? Внесение некорректных (по связям) данных в отлаженой (более-менее) программе - это исключительная ситуация. И почему бы не обрабатывать это как исключительную ситуацию. Ведь иначе придется делать предпроверку, которая в 99.99% случаев будет успешной.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33794751
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже думаю, что ограничение уникальности чаще выполняется, чем нет. И при невыполнении виноваты могут быть пользователи, а не ошибка программы. Например, вводится классификация клиентов (обчный, постоянный, VIP и т.д.), каждый класс уникальный, имеет identity-идентификатор. Но и имя класса также должно быть уникальным, и если пользователи пытаются создать еще один класс под тем же именем - это ошибка пользователей, а не программы.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795404
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Denis PopovАвторы могут использовать в серверном коде такие свойства внешних ключей как каскадное удаление,
Могут, конечно. Но я бы не стал. Отчего же? Типичная ситуация
Товар --каскад--< Вхождение_в_группу >--не каскад-- Группа
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795430
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenlerienНасколько использование внешних ключей снижает быстродействие? В большинстве случаев без них можно обойтись, т.к. добавление данных я контролирую в клиентской программе (выбор из ниспадающего списка), а каскадное удаление можно реализовать вручную из того же клиента, тем более происходить оно будет редко. Доступ к БД будет только через клиент.
Есть ли в таком случае смысл использовать внешние ключи?Опять почему-то забываем про многопользовательский режим. В многопользовательской системе между успешной проверкой и последующим добавлением данных в БД может вклинится другая транзакция, и все предварительные проверки - псу под хвост. Значит, клиент должен явно блокировать проверенные данные от изменений - т.е. дополнительные затраты, а не экономия.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795722
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenlerienТ.е., например, в случае ограничения уникальности лучше сначала проверить вручную, нет ли такой записи, а потом уже добавлять или не добавлять?
Это вопрос, на который трудно ответить коротко и точно, и который по направленности не очень совпадает с тем, что я имел в виду в предыдущем ответе.

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

Вопрос в том, что исключительная ситуация в большинстве случаев не должна планироваться как часть нормального рабочего процесса. Позволю себе искусственный пример - допустим, есть таблица Numbers, и задача формулируется как "вставить в нее те числа из диапазона 1..10, которые там сейчас отсутствуют). Так вот, в этом случае из вариантов

Код: plaintext
1.
2.
3.
insert into Numbers ( n# )
  select rownum from Dual connect by level <=  10  
  minus
  select n# from Numbers

и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  for i in  1 .. 10  loop
    begin 
      insert into Numbers ( n# ) values ( i ) ;
    exception
      when DUP_VAL_ON_INDEX then null ;
    end ;
  end ;
end ;

первый с моей точки зрения лучше. Куда лучше.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795731
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СерегаПочему? Внесение некорректных (по связям) данных в отлаженой (более-менее) программе - это исключительная ситуация.
Ключевые слова той моей фразы - "попробовали иначе". То есть ситуация не исключительная, а плановая, и соответственно обрабатывать ее как исключительную не совсем верно.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795793
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR softwarerМогут, конечно. Но я бы не стал. Отчего же?
По моему опыту с каскадным удалением в итоге оказывается больше геморроя, нежели без него. Я позиционирую эту фразу как сугубо личную точку зрения (я бы не стал), не являющуюся настойчивой рекомендацией или претендующим на объективность суждением; также я не слишком хотел бы погрузиться в детальное обсуждение - почему именно. Причина - отсутствие хоть мало-мальски объективных критериев при широком спектре возможных ситуаций; в лучшем случае обсуждение получится сравнением конкретных ситуаций, эксклюзивного (плохо переносимого) опыта конкретных людей.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795943
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
товары и категории товаров. При использовании каскадного удаления если
удалить категорию то удалятся и товары. Так нельзя.

письма и вложения в письмах. Если удалить письмо то нужно автоматом удалить
и вложения. Или заказ и строки заказа. Использовать каскадное удаление
нужно.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33795984
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024Или заказ и строки заказа. Использовать каскадное удаление
нужно.
После чего в ходе сопровождения ТЗ дорабатывается: удалять можно и нужно только строки в статусе "не выполнено", а на строки в статусе "выполнено" - ругаться.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33796058
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerпервый с моей точки зрения лучше. Куда лучше.Бесспорно. Но тема несколько другая, про клиента - скорее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
  while TRUE
    begin
      ВЫБРАТЬ допустимый_список ;  
      ДИАЛОГ запроса (newi, допустимый_список );
      if i < 0  exit ; -- это просто признак конца работы .
      insert into Numbers ( n# ) values ( newi ) ;
    exception
      when DUP_VAL_ON_INDEX then СООБЩИТЬ что не вышло;
    end ;
  end ;
end ;
ДИАЛОГ разрывает транзакцию базы и справедливо отмечено - кто-то другой может вставить нарушающую запись. Поэтому именно ограничения целостности и триггеры проверяют правильность в момент реальной вставки. А допустимый_список в ДИАЛОГ существенно снижает вероятность ошибочных данных.

Альтернатива без exception - БЛОКИРОВАТЬ всех нафиг пока я не надумаю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
  while TRUE
    begin
      БЛОКИРОВАТЬ Numbers;
      ВЫБРАТЬ допустимый_список ;  
      ДИАЛОГ запроса (newi, допустимый_список );
      if i not in (допустимый_список ) {ОСВОБОДИТЬ Numbers; exit;}
      insert into Numbers ( n# ) values ( newi ) ;
      ОСВОБОДИТЬ Numbers;
    end ;
  end ;
end ;
ИМХО плохая альтернатива.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33796074
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024
товары и категории товаров. При использовании каскадного удаления если
удалить категорию то удалятся и товары. Так нельзя.
Дык
Товар --каскад--< Вхождение_в_группу >-- не каскад -- Группа
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33796202
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRБесспорно. Но тема несколько другая, про клиента - скорее
Вы упускаете из вида, что контекст - не только общий вопрос темы, но и конкретная фраза Дениса Попова, на которую я ответил этой. Там было сказано, что приложение может использовать обработчик исключительной ситуации, причем не на ограничение уникальности, а на внешний ключ (разница - в уникальности возникает проблема при вставке кем-то другим записи, а во внешнем ключе - при удалении), причем по контексту у меня сложилось впечатление, что имеется в виду использование обработчика исключений как часть бизнес-логики. И мой ответ ограничивался рамками именно этого аспекта.
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33796497
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После чего в ходе сопровождения ТЗ дорабатывается: удалять можно и нужно
только строки в статусе "не выполнено", а на строки в статусе "выполнено" -
ругаться.
------------------------

Это значит что в ходе сопровождения выяснится что каскадное удаление в
данном случае неприменимо.

В примере с почтой и вложениями как-то наглядней.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Использование внешних ключей
    #33796597
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1024Это значит что в ходе сопровождения выяснится что каскадное удаление в данном случае неприменимо.
Именно. Причем - подчеркну - это не ошибка проектирования, а изменение требований в ходе последующего сопровождения. Причем отказаться от каскадного удаления довольно непросто, поскольку эта операция может быть неявно связана со многими другими (например, являться частью более глобального каскадного удаления).

Повторю: по моим личным ощущениям использование каскадного удаления в итоге выливается в бОльшую трудоемкость по сравнению с ручной реализацией каскада. Я вполне верю в то, что по опыту других людей ситуация может быть другой. Однако, исхожу из следующего: если есть два метода, оба достаточно нетрудоемкие, при этом один из них хорошо работает всегда, а другой может вызвать проблемы в будущем - я буду использовать первый.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Использование внешних ключей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]