Когда вы подходите к приложению с точки зрения базы данных, что-то вроде Doctrine2 (PHP) или Hibernate (Java), из которого оно «получено», не подходит. Они гораздо больше подходят, когда вы хотите пойти другим путем (например, «у меня есть модель предметной области OO, и мне нужно сохранить ее в реляционном БД», а не «у меня есть реляционный БД и я хочу (сгенерированный?) Интерфейс ОО» для этого, без каких-либо компромиссов на стороне базы данных "). Если вы используете их, несмотря на это важное различие в подходах, и вам нравится ваша реляционная схема больше, чем ваша объектная модель, вы просто расстроитесь.
Очень важно различать разные категории инструментов ORM, поскольку они, как правило, фокусируются на разных моделях разработки.
Возможно, попробуйте Propel или RedBeanPHP, которые кажутся подходящими для модели разработки на основе базы данных, при которой почти не выполняется отображение, просто сгенерированные (и обычно глупые) «объекты данных» и не так много абстракций. Поля внешнего ключа просто помещаются в объекты непосредственно в этих решениях и т. Д., Чтобы они могли «поддерживать» все нужные вам составные компоненты.
Такие решения, как Doctrine2 или Hibernate, препятствуют использованию составных ключей и, следовательно, поддерживают их только до определенного уровня (Hibernate идет довольно далеко, но, тем не менее, их не рекомендуется использовать).
Лично я не фанат составных ключей (за исключением чистых таблиц ссылок «многие ко многим» без дополнительных данных), потому что я склонен подходить к вещам гораздо больше со стороны приложения / модели домена / объекта и там составные ключи, которые сопоставляются с объектами, часто являются трудной задачей, даже если базовая технология сопоставления поддерживает их. Суррогатные ключи (или, по крайней мере, натуральные ключи с одним полем) делают вещи намного проще. Я не фетишист реляционной базы данных-нормализации, и «лучшая производительность» очень сомнительна с моей точки зрения. Сохранение случайного объединения не спасет вас, если у вас возникнут реальные проблемы с производительностью в системе.