簡體   English   中英

Node.js序列化數據庫規范化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM