Я думаю, что нет проблем с использованием составного ключа.
Для меня база данных - это отдельный компонент, который должен обрабатываться так же, как мы обращаемся с кодом: например, нам нужен чистый код, который четко сообщает о своем намерении, который выполняет одно и делает это хорошо, что не ' добавить любой ненужный уровень сложности и т. д.
То же самое с БД, если ПК составной, это реальность, поэтому модель должна быть чистой и ясной. Композитный ПК более понятен, чем автоинкремент + ограничение + микс. Когда вы видите столбец ID, который ничего не делает, вам нужно спросить, что такое настоящий PK, есть ли какие-то другие скрытые вещи, о которых вам следует знать, и т. Д. Чистый PK не оставляет никаких сомнений.
БД - это основа вашего приложения, для меня нам нужна самая надежная основа, которую мы можем иметь. На этой основе мы создадим приложение (веб или нет). Так что я не могу понять, почему мы должны сгибать модель БД, чтобы она соответствовала некоторым конкретным инструментам / фреймворку / языку разработки. Данные направляют приложение, а не наоборот. Что если ORM изменится в будущем и станет устаревшим, и появится лучшее решение, навязывающее другую модель? Мы не можем играть с моделью db, чтобы соответствовать той или иной структуре, модель должна оставаться прежней, она не должна зависеть от того, какой инструмент мы используем для доступа к данным ...
Если модель БД изменится в будущем, она должна измениться, потому что функциональность изменилась. Если бы мы сегодня знали, как изменится эта функциональность, мы уже смоделируем это. И когда любое будущее изменение будет иметь дело, когда придет время, мы не можем, например, предсказать влияние на существующие данные, поэтому один дополнительный столбец не гарантирует, что он отменит любое будущее изменение ...
Мы должны спроектировать для сегодняшней функциональности и сделать модель БД максимально простой, чтобы в будущем ее можно было легко изменять / развивать.