【问题标题】:Create a composite index with associated data?使用关联数据创建复合索引?
【发布时间】:2016-11-03 21:11:28
【问题描述】:

我有一个用户表和一个用户属性表。每个用户只能有每个 userAttribute 的一个实例,所以我想为列 name 和 userId 创建一个复合唯一索引(由 userAttributes.belongsTo 创建。)如何做到这一点?

UserAttribute = sequelize.define('userAttributes', {
    name: {
        type:       Sequelize.STRING,
        allowNull:  false,
        unique: 'nameIndex',
        validate: {
            isIn: [['phone', 'name','driverRequest']],
        }
    },
    value: {
        type:       Sequelize.STRING,
        allowNull:  false
    },
});


User.hasMany(userAttributes, {unique: 'nameIndex'});
userAttributes.belongsTo(User, {unique: 'nameIndex'});

我尝试添加唯一的nameIndex但没有成功,它似乎只适用于name-column。

【问题讨论】:

  • 我已经修改了下面的示例以使用复合索引,我认为它应该可以工作,如果它没有,请告诉我
  • 您在数据模型中手动添加了 useId 吗?我也缺少价值属性?
  • 有些东西我真的看不懂。您写道:“每个用户只能拥有每个 userAttribute 的一个实例,因此我想为列 name 和 userId 创建一个复合唯一索引”。我相信这两个索引(userId 和 name)保存在 userAttribute 中,如果我错了,请纠正我。在您提供的以下代码中,我可以看到新字段“值”,我不确定它的含义,您能提供更多信息吗?或解释我在哪里遗漏了问题上下文?

标签: node.js sequelize.js


【解决方案1】:
var Sequelize = require('sequelize');
var sequelize = new Sequelize('<yourDatabaseName>', '<yourUserName>', '<yourPassword', {
  host: '<ip>'
});

var User = sequelize.define('user', {
  id: {
    type: Sequelize.STRING,
    allowNull: false,
    primaryKey: true
  },
});
var UserAttribute = sequelize.define('userattribute', {
  userId: {
    type: Sequelize.STRING,
    allowNull: false,
    unique: 'compositeIndex',
    references: {
      model: User,
      key: "id"
    }
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
    unique: 'compositeIndex'
  }
});

User.hasOne(UserAttribute, {
  as: "UserAttribute"
})

UserAttribute.belongsTo(User, {
  foreignKey: "userId",
  as: 'UserId'
})


sequelize.sync({
  // use force to delete tables before generating them
  force: true
}).then(function() {
  console.log('tables have been created');
  return User.create({
    id: 'randomId1'
  });
})
  .then(function() {
    console.log('tables have been created');
    return User.create({
      id: 'randomId2'
    });
  })
  .then(function() {
    return UserAttribute.create({
      userId: 'randomId1',
      name: 'name1'
    });
  })
  .then(function() {
    return UserAttribute.create({
      userId: 'randomId2',
      name: 'name1'
    });
  })
  // // generates Validation Error
  // .then(function() {
  //   return UserAttribute.create({
  //     userId: 'randomId1',
  //     name: 'name1'
  //   });
  // })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2019-04-16
    • 2019-08-20
    • 2021-06-21
    • 1970-01-01
    • 2017-11-16
    • 2013-02-01
    相关资源
    最近更新 更多