我正在尝试将PHP网站迁移到Node.js,我现在正在考虑使用Sequelize设置数据库。
大部分表格设置正常,但我无法弄清楚如何进行规范化。
E.g。我有1个数据库用户:
ID
Username
Email
Password
另一个名为Domains的表:
ID
Domain
RegisteredAt
现在我需要创建一个第3个表来链接到2个表一起进行查找,如下所示:
UserID
DomainID
我尝试过设置Sequelize文档中的OneToOne关联,但这似乎只是在原始的2个表中创建了一个额外的字段。有人可以解释一下我该怎么做?
感谢您的帮助
答案 0 :(得分:1)
如果你仍然对答案感兴趣,那就是我使用一个用户和工作的例子来做这件事,截至Sequelize版本2.0.0-rc2:
<强> index.js 强>
这是从Sequelize网站上获取的,虽然我现在似乎无法在那里找到它,但它仍然可以正常工作。它扫描模型目录并加载保存在单独文件中的所有模型。
var fs = require('fs')
, path = require('path')
, Sequelize = require('sequelize')
, lodash = require('lodash')
, db_config = require('../../config').database
, sequelize = new Sequelize(db_config.db_name, db_config.db_user, db_config.db_password)
, db = {}
fs
.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf('.') !== 0) && (file !== 'index.js')
})
.forEach(function(file) {
var model = sequelize.import(path.join(__dirname, file))
db[model.name] = model
})
Object.keys(db).forEach(function(modelName) {
if ('associate' in db[modelName]) {
db[modelName].associate(db)
}
})
module.exports = lodash.extend({
sequelize: sequelize,
Sequelize: Sequelize
}, db)
<强> _userjobs.js 强>
此文件名以下划线开头,因为它首先被加载,因为它是规范化表。
module.exports = function(sequelize, DataTypes) {
var job_user = sequelize.define('job_user', {
custom_field: DataTypes.STRING
});
return job_user;
}
<强> user.js的强>
一个简单的模型声明,定义了一个关联。
module.exports = function(sequelize, DataTypes) {
var user = sequelize.define('user', {
username: DataTypes.STRING,
password: DataTypes.STRING,
email: DataTypes.STRING,
first_name: DataTypes.STRING,
surname: DataTypes.STRING,
postcode: DataTypes.STRING,
gender: DataTypes.STRING,
facebook_id: DataTypes.STRING,
twitter_id: DataTypes.STRING,
user_rank: DataTypes.STRING,
generated_username: DataTypes.BOOLEAN,
forgot_password: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
user.hasMany(models.job, {through: models.job_user});
}
}
});
return user;
}
<强> jobs.js 强>
另一个简单的模型声明。
module.exports = function(sequelize, DataTypes) {
var job = sequelize.define('job', {
name: DataTypes.STRING,
description: DataTypes.TEXT
}, {
classMethods: {
associate: function(models) {
job.hasMany(models.user, {through: models.job_user});
}
}
});
return job;
}
如果您运行自己的应用,最终会得到3个表格:用户,工作&amp; job_users ,后者同时包含userId和jobId以进行规范化。
您不一定需要 _userjobs.js文件,但如果您想在表格中添加额外字段,则需要这样做,例如&#39; custom_field < / EM>&#39;在我的例子中。如果您不需要其他字段,只需删除该文件并更改:
user.hasMany(models.job, {through: models.job_user});
和
job.hasMany(models.user, {through: models.job_user});
为:
user.hasMany(models.job, {through: 'job_users'});
和
job.hasMany(models.user, {through: 'job_users'});
希望有所帮助!