Насколько внешние ключи любят ресурсы?

Решил начать их использовать по полной, но переживаю не увлекся ли я с ними, я понимаю когда важно сохранять целостность важных данных и т.д, но вот допустим у меня почти все модели которые хранят id-пользователей которые создали, меняли и т.д. насколько это важно? т.е. за 5 лет опыта вроде никто не спрашивали такую информацию и я сам вроде не смотрел, мне не лень наставить внешних ключей, но насколько это скажется на ресурсах? сайты пока простые, нагрузки почти нет, поэтому большого опыта нет. В целом буду рад услышать плохой опыт с внешними ключами, до этого вроде жил без них, но может только везло
  • Вопрос задан
  • 1978 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Делать внешние ключи обязательно.
И уникальные индексы проставлять. Ещё бы check constraint ставить, да у вас глупый mysql в тегах, он такое не умеет.
Это всё ваши помощники. Они помогают искать ошибки и отлично мешают делать глупости.
И выбирать подходящие типы данных. Ну и раз у вас mysql - то всенепременно проверить sql_mode и выставить его максимально агрессивным. В 5.7 стало гораздо лучше, до этого из коробки уж слишком много позволял делать глупостей.

Дорастёте до террабайтной базы как авито - тогда можете начинать думать, а сколько денег нам стоит целостность внешних ключей или дешевле будет периодически проверять целостность скриптами и озадачивать разработчиков. О, кстати, вот запись доклада с pgday15, на 27 минуте как раз начинается обсуждение вопроса из зала "ребята, а вы в своём уме отключать FK?"
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@MadridianFox
Web-программист, многостаночник
Смотря какие ресурсы. Внешний ключ, а точнее индекс по полю внешнего ключа ускоряет поиск по таблице. Т.е. когда вы делает запрос
select * from my_table where creator = 123456
полного перебора таблицы не происходит. СУБД по индексу этой таблицы сразу берёт нужные строки.
Отсюда - меньшее потребление процессорного времени, но большее потребление диска, т.к. индекс это тоже файл.
Ответ написан
@Fortop
Tech/Team lead
Или
я понимаю когда важно сохранять целостность важных данных и т.д

Или
допустим у меня почти все модели которые хранят id-пользователей которые создали, меняли и т.д. насколько это важно


Т.е. все же не совсем понимаете.
На самом деле все зависит от бизнеспроцессов, которые вы реализуете.
Хранить всех посетителей общественного туалета за 10 лет вряд ли нужно.
А вот в разрезе какой-то сети супермаркетов хранить всех посетителей уже можно. И делать по ним анализ.

Аналогично и внутренними процессами. В общем случае действия операторов лучше протоколировать, для выяснения причин тех или событий (например, груз ушел не тому адресату - почему?)

Что касается внешних ключей, то они немного о другом. Они гарантируют вам целостность данных в разрезе базы.
Т.е. вы не сможете удалить пользователя, у которого есть история заказов, посещений и т.п.
Верно и обратное вы не сможете добавить посещение кого-то, кто отсутствует в таблице пользователей.
Ответ написан
Решил начать их использовать по полной

Помните поговорку про того, кто лоб расшибёт?
Использовать нужно не "по полной", а "по необходимости".
Любой индекс замедляет вставку (не так уж сильно, но на млн. записей - ощутимо), и тратит не столько диск (это фигня), сколько память (что тоже недорого, но просто её нужно будет докупить).
Зато индексы нередко в 10-ки/100-ни раз ускоряют выборку.
Соответственно, если у вас есть регулярная выборка типа "все заказы пользователя", то по "пользователю" лучше (надо) индекс создать.
Заметьте, я описать только индексы, но FK - это не только индексы, это и контроль целостности, что тоже ресурсы (польза тоже бывает, но совсем не всегда и в простых приложениях типа инет-магазина скорее бессмысленна).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы