Как настроить отношения один ко многим в Sequelize? - PullRequest
0 голосов
/ 24 ноября 2018

В настоящее время я использую Express с Sequelize + MySQL, и мне было интересно, как лучше всего решить эту проблему.Я прошу прощения, если это основной вопрос, так как я довольно новичок в Sequelize и даже в базах данных SQL в целом.

У меня есть модель User, например,

export default db.define('User', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});

Тогда ятакже есть другая модель Shoe, например, так:

export default db.define('Shoe', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  size: {
    type: Sequelize.INTEGER,
    allowNull: true,
  },
  quality: {
    type: Sequelize.ENUM('Brand New', 'Used', 'Collector Item'),
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});

Затем я определяю связь между этими двумя.

User.hasMany(Shoe);
Shoe.belongsTo(User);

Однако проблема в том, что она «создает»обувь, и это приводит к дублированию.Я в основном хочу таблицу под названием «Обувь», в которой есть обувь, а затем пользователь просто ссылается на идентификаторы, основываясь на том, какие у нее ботинки.

Не уверен, что это лучший способ сделать это, особенно еслипользователь владеет несколькими ботинками.В псевдо я полагаю, что я хотел бы что-то вроде массива идентификаторов обуви, таких как shoes: [1, 2, 3, 4], который при запросе затем каким-то образом просматривается в таблице обуви и вставляется в ответ пользователя.

Очевидно, я могу что-то сделатькак и в сыром SQL, но я полагаю, что должен быть лучший способ приблизиться к этому, учитывая, сколько сил имеет Sequelize.

Надеюсь, кто-то может дать какой-то совет и помощь по этому поводу!

1 Ответ

0 голосов
/ 30 ноября 2018
  1. Я рекомендую использовать параметр tableName.
  2. Если вы хотите хранить пользователей, обувь и информацию о том, какая обувь у каждого пользователя, вам нужно создать третью таблицу.Это n: m ассоциация, потому что у каждого пользователя может быть несколько ботинок, и каждый ботинок может принадлежать нескольким пользователям.Вы можете создать эту таблицу несколькими способами:

    • см. Учебник Model.belongsToMany и api doc

      User.belongsToMany(Shoe, {through: 'UserShoe'});
      Shoe.belongsToMany(User, {through: 'UserShoe'});
      
    • определить модель UserShoe, а затем связать модели User, Shoe и UserShoe:

      export default db.define('UserShoe', {
        userId: {
          type: Sequelize.INTEGER,
          allowNull: false,
          primaryKey: true
        },
        shoeId: {
          type: Sequelize.INTEGER,
          allowNull: false,
          primaryKey: true
        }
      });
      
      
      User.belongsToMany(Shoe, {through: UserShoe});
      Shoe.belongsToMany(User, {through: UserShoe});
      
    • или как это:

      User.hasMany(UserShoe);
      UserShoe.belongsTo(User);
      Shoe.hasMany(UserShoe);
      UserShoe.belongsTo(Shoe);
      
  3. Рекомендую прочитать книгу Антипаттерны SQL / Карвин Билл.Роли и Последовательность документов ассоциации .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...