Советую очень хорошо подумать прежде чем делать фактически M2M там, где и O2M сойдёт. Мы напоролись у себя на проблемы, когда понадобилось привязывать к сущности А, которая ранее ссылалась на единственную сущность Б, дополнительные экземпляры сущности Б. Привязка была второстепенная, но мы развязали из через M2M с добавлением признака первичной связи. Но данные в обе таблицы добавляли ежедневно десятками тысяч (соответственно, столько же лилось в таблицу связи), плюс, на проекте были сложные правила доступа пользователей к данным, из-за чего нельзя было отобрать доступное одному пользователю только по одной таблице. В итоге, в ядре некоторых запросов был отбор по 50-200 тысяч строк, каждый джойн на таких объёмах данных занимал по ~секунде (приходилось ещё и с планировщиком биться, чтобы он из-за неправильной оценки по некоторым условиям не переходил на nested loop join, который на таких объёмах тормозит), приходилось делать денормализацию, возвращая ранее удалённую связь.