[英]Node.js Sequelize Database Normalization
我正在嘗試將PHP網站遷移到Node.js,現在我正在考慮使用Sequelize設置數據庫。
大多數表都設置正確,但是我在弄清楚如何進行規范化時遇到了麻煩。
例如,我有1個數據庫用戶:
ID
Username
Email
Password
還有另一個表稱為“域”:
ID
Domain
RegisteredAt
現在,我需要創建第三個表以將兩個表鏈接在一起以進行查找,如下所示:
UserID
DomainID
我嘗試從Sequelize文檔中設置OneToOne關聯,但這似乎只是在原始2個表中創建了一個額外的字段。 有人可以解釋一下我該怎么做嗎?
謝謝你的幫助
@ 塞繆爾·內夫
如果您仍然對答案感興趣,從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個表: users,jobs和job_users ,后者包含userId和jobId以進行標准化。
您不一定需要 _userjobs.js文件,但是如果您想向表中添加其他字段,例如在我的示例中為“ custom_field ”,則需要此文件。 如果您不需要其他字段,只需刪除該文件並更改:
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'});
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.