powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Стоит ли всегда записи описывать внешними ключами?
25 сообщений из 27, страница 1 из 2
Стоит ли всегда записи описывать внешними ключами?
    #39804237
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Уважаемые!

Хочу спросить, правильно ли при проектировании БД в таблицах имеющих поля однозначно являющимися ID других записей в другой таблице оформлять их внешним ключом или нет?
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804248
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем так - нет ни одной вменяемой причины этого не делать. Теоретически без обьявления внешних ключей обновления происходят чуть-чуть быстрее, но на практике это заметить, ээ, непросто - а вот затупы оптимизатора из-за недостатка информации и грязь в данных заметить куда как легче.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804258
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И про индексы на внешние ключи не забываем, во избежании...
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804259
Serguei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotправильно ли при проектировании БД в таблицах имеющих поля однозначно являющимися ID других записей в другой таблице оформлять их внешним ключом или нет?

в зависимости от зависимости. Бывают разные случаи: чаще всего да надо ссылки делать FK, но бывают случаи когда так делать не нужно. Универсального рецепта нет.
На каждый конкретный пример надо смотреть и решать.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804262
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic HunterИ про индексы на внешние ключи не забываем, во избежании...
Это что значит? Т.е. кроме описания
FK objID->objects(id) ещё надо
KEY objIdx (objID)?

Разве наличие FK не даёт индекса? Объясните пожалуйста. На всяк случай я в MariaDB всё это делаю.

Кот МатроскинСкажем так - нет ни одной вменяемой причины этого не делать. Теоретически без обьявления внешних ключей обновления происходят чуть-чуть быстрее, но на практике это заметить, ээ, непросто - а вот затупы оптимизатора из-за недостатка информации и грязь в данных заметить куда как легче.
Хорошо, учту. А то делал всегда делал всё жёстко описывая связями а потом подумал, так а надо ли и решил уточнить тут. Спасибо!
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804263
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormot,

Если у вас oltp, то нужно.
Если же dwh, то не нужно.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804285
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic HunterИ про индексы на внешние ключи не забываем, во избежании...
Или это имеется ввиду накладывать условие уникальности FK или их комбинации в случае такого правила в предметной области?
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804324
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotРазве наличие FK не даёт индекса? Объясните пожалуйста.The foreign key constraint alone does not provide the index - one must (and should) be created.

https://sqlperformance.com/2012/11/t-sql-queries/benefits-indexing-foreign-keys
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804326
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotRelic HunterИ про индексы на внешние ключи не забываем, во избежании...
Или это имеется ввиду накладывать условие уникальности FK или их комбинации в случае такого правила в предметной области?

No.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804328
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotРазве наличие FK не даёт индекса? Объясните пожалуйста. На всяк случай я в MariaDB всё это делаю.Зависит от СУБД.
https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804405
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic HunterThe foreign key constraint alone does not provide the index - one must (and should) be created.
miksoft https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.
Охренеть. Вот что называется век живи и столько же учись. А я всю жизнь жил в полной уверенности, что описания FK хватает и не парился.
Жесть какая.
Т.е. для каждого FOREIGN KEY надо создать дополнительно KEY idx (fkID)?
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804414
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotЖесть какая.
авторMySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует. Этот индекс может быть автоматически удален позже, если вы создадите другой индекс, который можно будет использовать для применения ограничения внешнего ключа. index_name, если дано, используется, как описано ранее.

сколько же всего мы не знаем, проработав в аксесс 20 лет
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804458
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotОхренеть. Вот что называется век живи и столько же учись. А я всю жизнь жил в полной уверенности, что описания FK хватает и не парился.
Жесть какая.
Т.е. для каждого FOREIGN KEY надо создать дополнительно KEY idx (fkID)?
(postgres):
Код: sql
1.
ALTER TABLE users_ops ADD FOREIGN KEY (uid) REFERENCES users(id) ON DELETE CASCADE;


id в users должен иметь уникальный индекс (обычно PK)
uid в users_ops должен иметь любой индекс
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804459
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и да, каждый такой индекс будет грузить таблицу, поэтому нет, не нужно бездумно лепить FK на каждый чих
вот конкретно такой FK - милое дело, т.к. эти индексы и так всегда присутствуют
в идеале связи ставятся на колонки, в которых уже есть индекс
а вот если новый индекс надо создавать только под FK, вот тут уже надо подумать и взвесить - часто можно и без него обойтись.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804461
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но в любом случае, когда в одной таблице id, а в другой ссылка на этот id, то FK нужен, чтобы при удалении автоматом всё делалось
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804462
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот с триггерами ситуация гораздо хуже
они могут попасть в цикл и так протормозить базу, что раком встанет весь сайт
вот их я вообще не использую.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39804552
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotТ.е. для каждого FOREIGN KEY надо создать дополнительно KEY idx (fkID)?Совсем необязательно. Основная задача внешнего ключа гарантировать ссылочную целостность. Для этого вполне достаточно основного ключа или ограничения уникальности на основной таблице. В основном, индекс на внешнем ключе нужен только если по этому полю(ям) выполняется фильтрация, да и то есть ситуации, когда даже в таком случае индекс всё равно может оказаться излишним.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39806682
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotДобрый день Уважаемые!

Хочу спросить, правильно ли при проектировании БД в таблицах имеющих поля однозначно являющимися ID других записей в другой таблице оформлять их внешним ключом или нет?
что за вопрос. при ПРОЕКТИРОВАНИИ - конечно же правильно.
т.е на уровне логической модели - да
При реализации уже (на уровне физической модели) - возможны варианты
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39807247
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAkormotТ.е. для каждого FOREIGN KEY надо создать дополнительно KEY idx (fkID)?Совсем необязательно. Основная задача внешнего ключа гарантировать ссылочную целостность. Для этого вполне достаточно основного ключа или ограничения уникальности на основной таблице. В основном, индекс на внешнем ключе нужен только если по этому полю(ям) выполняется фильтрация, да и то есть ситуации, когда даже в таком случае индекс всё равно может оказаться излишним.
Индекс больше нужен потому, что где внешний ключ - там наверняка будут по нему джойны с таблицей, на которую он ссылается. Надобность проверить по-моему очень легко - сджойнить эти таблицы с реальными данными и посмотреть план запроса - используется ли индекс или нет, потому что это очень сильно может зависеть от объема данных и от статистики.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39807276
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatChAИндекс больше нужен потому, что где внешний ключ - там наверняка будут по нему джойны с таблицей, на которую он ссылается. Надобность проверить по-моему очень легко - сджойнить эти таблицы с реальными данными и посмотреть план запроса - используется ли индекс или нет, потому что это очень сильно может зависеть от объема данных и от статистики.Безусловно, практика - критерий истины, но по моим многолетним наблюдениям для JOIN часто более чем достаточно индекса со стороны основной таблицы, так как в запросах хотят видеть их данные, потому что чаще всего это какие-то справочники. Само слияние по индексам, к сожалению, не спасает от bookmark lookup в подчинённой таблице, если только он удачно не впишется в кластерный индекс. В результате польза от него бывает не так велика, как бы хотелось. В то же время, если внешние значения активно и независимо используются при фильтрации, то тут, конечно, без индекса никуда. Если, конечно, выборка, опять же, не идёт по всей таблице или фильтрация по другим полю(ям) уже её неплохо ограничивают. Так что речь идёт не столько о том, будет или нет использоваться индекс, а будет ли от него реальный выигрыш, а не только лишние траты ресурсов на его создание и поддержание. Обилие индексов может само собой создавать немалые проблемы, их создание должно быть объективно аргументированно, избегая бездумной комбинаторики на все мыслимые и немыслимые случаи.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39808326
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAБезусловно, практика - критерий истины, …...
Однако, можно предположить что истины нет критерия. Есть критерии у заблуждений.
Я уже не говорю про Ницше - истины вообще не существует, а существуют неопровержимые заблуждения.

Индексы на внешние ключи нужны в некоторых СУБД, так как иначе может в некоторых ситуациях возникнуть блокировка всей дочерней таблы без такого индекса, а с индексом нет. Наблюдал такое в 8 версии Оракла. Случай редкий. Но все же у заказчика начались зависания. С тех пор предпочитал ставить индексы.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39808440
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухи да, каждый такой индекс будет грузить таблицу, поэтому нет, не нужно бездумно лепить FK на каждый чих
вот конкретно такой FK - милое дело, т.к. эти индексы и так всегда присутствуют
в идеале связи ставятся на колонки, в которых уже есть индекс
а вот если новый индекс надо создавать только под FK, вот тут уже надо подумать и взвесить - часто можно и без него обойтись.

Давайте новый флейм про FK на пару дюжин страниц
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39808442
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухно в любом случае, когда в одной таблице id, а в другой ссылка на этот id, то FK нужен, чтобы при удалении автоматом всё делалось

FK нужен не для "автоматом", а чтобы в таблицу гамнища гору не навалили. "Автоматом" это уже так, просто опциональное удобство, которое не всегда и удобно.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39812946
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotДобрый день Уважаемые!

Хочу спросить, правильно ли при проектировании БД в таблицах имеющих поля однозначно являющимися ID других записей в другой таблице оформлять их внешним ключом или нет?

Конечно стоит, всегда.
...
Рейтинг: 0 / 0
Стоит ли всегда записи описывать внешними ключами?
    #39812996
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotХочу спросить, правильно ли при проектировании БД в таблицах имеющих поля однозначно являющимися ID других записей в другой таблице оформлять их внешним ключом или нет?
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Стоит ли всегда записи описывать внешними ключами?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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