Я согласен с рекомендацией «без внешних ключей» (с заявлением об отказе: я также работаю в Percona).
Причина, по которой это рекомендуется, заключается в параллельности / уменьшении внутренней блокировки.
Продажа может быть сложной «оптимизацией», но если вы считаете, что в базе данных есть транзакции (и более или менее совместимы с ACID), то это должны быть только ошибки логики приложения, которые вызывают нарушения внешнего ключа. Не сказать, что они не существуют, но, если вы включите внешние ключи в разработку, надеюсь, вы найдете хотя бы несколько ошибок.
С точки зрения того, нужно ли вам писать собственный SQL:
Объяснение, которое я обычно даю, состоит в том, что «оптимизация редко уменьшает сложность». Я думаю, что по-прежнему можно использовать ORM по умолчанию, но если в профилировщике это выглядит так, как будто одна конкретная часть функциональности отнимает гораздо больше времени, чем вы подозреваете, если бы она была написана от руки, тогда вам нужно быть готовым к исправлению это (при условии, что код вызывается достаточно часто).
Настоящий секрет здесь в том, что вам нужны хорошие инструменты / профилирование, чтобы быть экономными при добавлении оптимизации (ов).