2016-04-27 23 views
7

è possibile definire due chiavi esterne come chiave primaria composita di un modello?Sequenza, chiavi esterne come chiave primaria composta

Un utente può essere solo un membro di una famiglia, una famiglia può avere molti membri e la tabella-membri della famiglia hanno bisogno i riferimenti degli utenti e della famiglia

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

Non sono sicuro di poter creare una chiave primaria composita, ma so che è possibile creare una chiave univoca composta. Non sono sicuro se aiutano comunque la tua situazione. –

risposta

7

Infatti, quasi ho ottenuto la soluzione dalla documentazione:

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 }); 

di default il codice qui sopra aggiungerà ProjectID e userId al tavolo UserProjects, e rimuovere qualsiasi attributo chiave primaria definita in precedenza - la tabella verrà identificato in modo univoco dal com la combinazione delle chiavi delle due tabelle e non vi è motivo di avere altre colonne PK.

Source

+2

Ma come fare questo in una migrazione usando sequelize-cli? –

+1

in una migrazione è possibile aggiungere questo oggetto dopo aver definito la vostra struttura della tabella, ad esempio: 'uniqueKeys: [{ nome: "UniqueUserPermissions", singleField: falsi, campi: [ "PermissionId", "UserID"], }] ' – YassinMK

0

per chi cerca di creare una chiave indice primario composito a base delle colonne (chiavi) nella tabella unirsi quando si fa migrazioni. Sarà necessario aggiungere un vincolo di chiave primaria per le due colonne che si desidera agire come la chiave primaria combinata per la tabella.

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'); 
    } 
}; 

che è grosso modo lo stesso di fare ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2); in Postgres.

Problemi correlati