使用关联数据创建复合索引?
Posted
技术标签:
【中文标题】使用关联数据创建复合索引?【英文标题】:Create a composite index with associated data? 【发布时间】:2016-11-03 21:11:28 【问题描述】:我有一个 User-table 和一个 userAttributes 表。每个用户只能有每个 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'
// );
// )
【讨论】:
以上是关于使用关联数据创建复合索引?的主要内容,如果未能解决你的问题,请参考以下文章