тут несколько моментов:
1. если ты хочешь юзать реляционную базу и мэпить данные на структуры в памяти тебе придется иметь ORM. готовую или самописную - это детали. Факт того что тебе надо решать проблему того что у тебя в памяти референсы есть а в реляционной модели их нет.
2. На чтение эту проблему можно вовсе не решать так как данные не меняются, нет никакой возможности что данные станут неконсистентными раз ты забил на референсы. Тогда все куда проще.
3. На запись лучше взять доктрину или любое готовое решение
4. все проблемы от попыток юзать одни и те же вещи для чтения и записи. Оттуда и many-to-many связи и прочие one-to-many двунаправленные
Спасибо, вот это интереснее. Насчёт 4, если писать как-то отдельно, то концепция many to many не потребуется уже?