使用关联数据创建复合索引?

Posted

技术标签:

【中文标题】使用关联数据创建复合索引?【英文标题】: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 中,如果我错了,请纠正我。在您提供的以下代码中,我可以看到新字段“值”,我不确定它的含义,您能提供更多信息吗?或解释我在哪里遗漏了问题上下文? 【参考方案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'
  //   );
  // )

【讨论】:

以上是关于使用关联数据创建复合索引?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 复合 唯一 索引

关于MySQL复合索引的使用方法有哪些?

FeathersJS 为集合创建复合索引

核心数据:未在子实体上创建复合索引

SQL Server的复合索引学习转载

MySQL创建复合索引