Недавно я завершил проект с полным стеком, в котором использовался 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. Мы хотели бы, чтобы приложение было доступно для пользователей всех возрастных групп, и мы также хотели бы, чтобы пользователи могли фильтровать контент, основываясь не только на рекомендациях о том, что им нравится, но также на основе фильмов и критериев, которые они не хотят включать. Поиск. Это потребует более вдумчивого взгляда на избыточность, которая может существовать в наших ассоциациях, а также усложнит работу с помощью ассоциаций «один-ко-многим» и «многие-многие».