Node.js Sequelize Database Normalization

时间:2014-03-12 10:35:35

标签: javascript mysql sql node.js sequelize.js

我正在尝试将PHP网站迁移到Node.js,我现在正在考虑使用Sequelize设置数据库。

大部分表格设置正常,但我无法弄清楚如何进行规范化。

E.g。我有1个数据库用户:

ID
Username
Email
Password

另一个名为Domains的表:

ID
Domain
RegisteredAt

现在我需要创建一个第3个表来链接到2个表一起进行查找,如下所示:

UserID
DomainID

我尝试过设置Sequelize文档中的OneToOne关联,但这似乎只是在原始的2个表中创建了一个额外的字段。有人可以解释一下我该怎么做?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

@ Samuel Neff

如果你仍然对答案感兴趣,那就是我使用一个用户和工作的例子来做这件事,截至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'});

希望有所帮助!