Недавно я завершил проект с полным стеком, в котором использовался API MoviesDatabase, и одним из самых больших препятствий, которые нам нужно было преодолеть, была взаимосвязь между нашими моделями. Наши модели определяются своими параметрами и могут быть настроены для ссылки на другие модели через внешние ключи и идентификаторы. Мы хотели разработать приложение, которое могло бы генерировать рекомендации фильмов на основе фильмов, которые уже нравятся пользователю. Для этого нам понадобилась базовая линия с моделью пользователя и моделью фильма. Однако в процессе я понял… нам может не хватать еще нескольких моделей!
Во-первых, чтобы установить отношения «многие ко многим», нам понадобится другая модель для их соединения. С нашим приложением мы хотели быть доступными для нескольких пользователей. Мы также хотели предоставить этим пользователям доступ к нескольким фильмам. Таким образом, эта связь потребовала от нас создания модели UserMovies. В нашу модель UserMovies мы включили «movie_id» и «user_id» для использования в качестве внешних ключей для пользователя и фильма соответственно.
UserMovies.init( { id: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true, }, user_id: { type: DataTypes.INTEGER, allowNull: false, references: { model: "user", key: "id" } }, movie_id: { type: DataTypes.INTEGER, allowNull: false, references: { model: "movie", key: "id" } },
Далее я занялся ассоциациями. В синтаксисе отношения «многие ко многим» используется функция ownToMany. Отношение идет в обе стороны, поэтому требуется функция ownToMany, а не hasOne или hasMany. Модель Movie принадлежит многим пользователям на том основании, что несколько пользователей будут иметь доступ к нескольким фильмам. Модель пользователя относится ко многим фильмам на том основании, что не один пользователь связан с одним фильмом, а многие пользователи связаны со многими фильмами.
Movie.belongsToMany(User, { foreignKey: 'movie_id', through: UserMovies }); User.belongsToMany(Movie, { foreignKey: 'user_id', through: UserMovies })
Дальнейшая функциональность потребует большего количества моделей, на которых будут основываться данные, например модель жанра, модель рейтинга и/или модель AdultContent. Мы хотели бы, чтобы приложение было доступно для пользователей всех возрастных групп, и мы также хотели бы, чтобы пользователи могли фильтровать контент, основываясь не только на рекомендациях о том, что им нравится, но также на основе фильмов и критериев, которые они не хотят включать. Поиск. Это потребует более вдумчивого взгляда на избыточность, которая может существовать в наших ассоциациях, а также усложнит работу с помощью ассоциаций «один-ко-многим» и «многие-многие».