Реализуете ли вы MVC самостоятельно или используете уже существующий фреймворк? Платформы типа Rails обычно имеют хорошее отображение между классами / методами и запросами, например ::100100
GET /book/view/id/1 --> Book::view(1)
В зависимости от структуры ваших моделей, это может соответствовать GUID книги; альтернативно, если вы настаиваете на такой иерархии типов, вы можете предпочесть что-то вроде:
GET /book/view/type/novel/id/3 --> Novel::view(3)
Где id относится к роману, а не к книге, id. Кроме того:
GET /novel/view/id/3 --> Novel::view(3)
будет работать идентично.
Может быть, более уместно, вы должны отдавать предпочтение композиции, а не наследованию; есть ли причина иметь 4 типа книг? Чем они действительно отличаются? Если они различаются только по типу метаданных, которые они содержат, вы можете рассмотреть инкапсуляцию этого различия каким-либо иным способом, кроме перемещения по иерархии типов (например, если методы, влияющие на различные типы книг, похожи, вы просто исключите любой алгоритм, который применяется к определенным типам книг, и используйте композицию объектов, чтобы включить эту функциональность в ваши классы). Я думаю, что это также позволит вам упростить структуру представления, что, косвенно, даст вам более четкое решение этой проблемы.