2016-04-27 3 views
7

В качестве составного первичного ключа модели можно определить два внешних ключа?Sequelize, внешние ключи как составной первичный ключ

Пользователь может быть членом только одной семьи, семья может иметь много членов и таблица семьи-членов нужны ссылки на пользователя и семьи

const User = sequelize.define(
    'User', 
    { 
     id: { type: dataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true }, 
     name: { type: dataTypes.STRING(30) }, 
     email: { type: dataTypes.STRING(30) } 
     ... 
    }, 
    { 
     classMethods: { 
      associate(models) { 
       User.hasOne(models.FamilyMember, { 
        foreignKey: 'user_id' 
       } 
      } 
     } 
    } 
) 

const Family = sequelize.define(
    'Family', 
    { 
     name: { type: dataTypes.STRING(30) } 
    }, 
    { 
     classMethods: { 
      associate(models) { 
       Family.hasMany(models.FamilyMember, { 
        foreignKey: 'family_id' 
       } 
      } 
     } 
    } 
) 

const FamilyMember = sequelize.define(
    'FamilyMember', 
    { 
     name: { type: dataTypes.STRING(30) }, 
     /* 
     family_id and user_id will be here after associations but I wanted them to be a composite primaryKey 
     */ 
    } 
) 
+1

Я не уверен, что вы можете создать составной первичный ключ, но я знаю, что вы можете создать составной уникальный ключ. Я не уверен, что они помогают в вашей ситуации. –

ответ

7

На самом деле, почти я получил решение из документации:

User = sequelize.define('user', {}); 
Project = sequelize.define('project', {}); 
UserProjects = sequelize.define('userProjects', { 
    status: DataTypes.STRING 
}); 

User.belongsToMany(Project, { through: UserProjects }); 
Project.belongsToMany(User, { through: UserProjects }); 

по умолчанию код выше добавит ProjectID и USERID к столу UserProjects, и удалить все ранее определенный первичный ключ атрибута - таблица будет однозначно определить по ком бинация ключей двух таблиц, и нет причин иметь другие столбцы PK.

Source

+2

Но как это сделать при миграции с помощью sequelize-cli? –

+1

в миграции вы можете добавить этот объект после того, как вы определите структуру таблицы, например: 'uniqueKeys: [{ название: "UniqueUserPermissions", singleField: ложные, поля: [ "PermissionId", "UserId"], }] ' – YassinMK

0

Для тех, кто ищет для создания составного ключа индекса первичного на основе столбцов (ключи) в вашей таблице присоединиться при выполнении миграции. Вам нужно будет добавить ограничение первичного ключа для двух столбцов, которые вы хотите использовать в качестве комбинированного первичного ключа для таблицы.

module.exports = { 
    up: function (queryInterface, Sequelize) { 
    return queryInterface.createTable('itemtags', { 
     itemId: { 
     type: Sequelize.INTEGER, 
     references: { 
      model: 'items', 
      key: 'id', 
     }, 
     onDelete: 'CASCADE', 
     onUpdate: 'CASCADE', 
     allowNull: false 
     }, 
     tagId: { 
     type: Sequelize.INTEGER, 
     references: { 
      model: 'tags', 
      key: 'id', 
     }, 
     onDelete: 'CASCADE', 
     onUpdate: 'CASCADE', 
     allowNull: false 
     } 
    }) 
     .then(() => { 
     return queryInterface.addConstraint('itemtags', ['itemId', 'tagId'], { 
      type: 'primary key', 
      name: 'gametag_pkey' 
     }); 
     }); 
    }, 
    down: function (queryInterface, Sequelize) { 
    return queryInterface.dropTable('gametags'); 
    } 
}; 

что примерно так же, как делают ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2); в Postgres.

Смежные вопросы