2017-01-03 1 views
0

ich viele Dinge über Assoziationen, aber nichts zu meinem speziellen Fall gefunden,
i erstellt einige Modelle und ich versuche, sie zu assoziieren,
so denke ich, es eine Frage des Verstehens Datenbankmodellierung auch.Sequelize cli Schaffung Verein belongsto Benutzer oder Mitarbeiter

Ich habe die Modelle Benutzer und Mitarbeiter, beide teilen ein Attribut user_id.

user.js

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var User = sequelize.define('User', { 
    user_id: DataTypes.STRING, 
    fullname: DataTypes.STRING, 
    username: DataTypes.STRING, 
    comment: DataTypes.TEXT 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     User.hasMany(models.Sshkey, {foreignKey: 'sshkey_id'}) 
     } 
    } 
    }); 
    return User; 
}; 

staff.js

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Staff = sequelize.define('Staff', { 
    user_id: DataTypes.STRING, 
    fullname: DataTypes.STRING, 
    username: DataTypes.STRING, 
    password: DataTypes.STRING, 
    isAdmin: DataTypes.BOOLEAN 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     Staff.hasMany(models.Sshkey, {foreignKey: 'sshkey_id'}) 
     } 
    } 
    }); 
    return Staff; 
}; 

und ich habe ein Modell sshkey bekam, die entweder zu einem Benutzer oder einem Mitarbeiter gehören.
Ich benutze Sequelize cli und habe noch keine Migrationen durchgeführt.
Und ich bin ziemlich neu in Js und Erstellen von Datenbanken, über die Datenbankmodelle und die Verbände zu denken, und ich bin Kuriosität, wenn ich oder so etwas wie tun schreiben kann:

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Sshkey = sequelize.define('Sshkey', { 
    sshkey_id: DataTypes.STRING, 
    sshkey: DataTypes.TEXT 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 

     // My Problem starts here | 
     // Should i write   | 
     //      | 
     //      V 

     Sshkey.hasOne(models.User || models.Staff, {foreignKey: 'user_id'}) 

     // Or maybe: 
     // Sshkey.hasOne(models.User, {foreignKey: 'user_id'}) || 
     // Sshkey.hasOne(models.Staff, {foreignKey: 'user_id'}) 
     // Should i rather rename models.Staffs foreignKey user_id to staff_id? 

     // Or maybe: 
     // Sshkey.hasOne(models.User, {as: 'userkey', foreignKey: 'user_id'}) 
     // Sshkey.hasOne(models.Staff, {as: 'staffkey', foreignKey: 'user_id'}) 

     } 
    } 
    }); 
    return Sshkey; 
}; 

Was ein richtig wäre, Lösung für das Problem, wenn ich später einen sshkey entweder an einen Benutzer oder an einen Mitarbeiter referenzieren möchte?
Zwei Modelle mit Staffkeys und Userkeys erstellen?
Vielen Dank im Voraus,

bigz

Antwort

1

Wenn Sie eine 1: m-Beziehung, wo der Fremdschlüssel user_id zum Sshkey Modell hinzugefügt wird, soll sein:

User.hasMany(models.Sshkey, {foreignKey: 'user_id'}); 
Staff.hasMany(models.Sshkey, {foreignKey: 'user_id'}); 
Sshkey.belongsTo(models.User, {foreignKey: 'user_id'}); 
Sshkey.belongsTo(models.Staff, {foreignKey: 'user_id'}); 

Ein Problem, das ich mit habe Ihr Beispiel ist, dass user_id und sshkey_id sind beide Zeichenfolgen ohne Einschränkungen um sie herum, was sie sehr schlecht macht foreignKey und schrecklich für den Entwurf von Datenbanken. Um einen Benutzer und ihre SSHKEY:

User.findAll({ 
    where: {}, 
    include: [ { model: Sshkey } ] 
}); 
+0

Gibt es eine Möglichkeit i-Modelle erstellen können sequelize aus und mit Command Eigenschaften hinzufügen wie 'primaryKey: true',' allowNull: false' und 'onDelete:‚cascade'' zu das Feld Benutzer-ID? Oder kann/sollte ich nur das erstellte Modell bearbeiten, wenn ich es brauche? Ich habe gerade './sequelize verwendet: create --name User --attributes user_id: string, fullname: string, benutzername: string, kommentar: text' , um das Modell zu erstellen. – BigZ

+0

Ich gehe davon aus, dass es einen Weg gibt, aber ich habe nicht wirklich Sequelize CLI zuvor verwendet. – jjbskir