这是在Sequelize中定义表关系的正确方法吗?

时间:2016-05-18 11:07:46

标签: sequelize.js

如果您使用的表格不符合惯例,我发现Sequelize docs很长很难理解。

如果我有两张桌子:

people
(
  people_id - uuid
  name - text
)

parties
(
  parties_id - uuid 
  people_id - uuid  (foreign key)
)

我是否正确定义我的模型?

function getPeople()
{
  let entity = {};
  entity['people_id'] = {type: Sequelize.UUID, primaryKey: true, allowNull : false};
  entity['name'] = Sequelize.TEXT;
  return sequelize.define('dbo.people', entity, options);
}

function getParties()
{
  let entity = {};
  entity['parties_id'] = {type: Sequelize.UUID, primaryKey: true, allowNull : false};
  entity['people_id'] = 
  {
    type: Sequelize.UUID,
    references: {model: getPeople(), key: 'people_id', deferrable: Sequelize.Deferrable.INITIALLY_DEFERRED}
  };      
  const parties = sequelize.define('dbo.parties', entity, options);
  parties.belongsTo(this.getPeople(), {foreignKey: 'people_id'});
  return parties;
}

假设:

  • 如果我遗漏了'belongsTo'部分,那么我理解文档它实际上不会是一个关联,所以我无法使用include来提取查询中的相关数据:[]
  • 如果我遗漏了'参考'部分,那么我无法指定本地字段名称'people_id'与常规'peopleId'不同,也不能设置'deferrable'
  • 我假设我可以使用getPeople()返回一个用于外键的类,它不必是一个单例

1 个答案:

答案 0 :(得分:2)

  

如果我遗漏'belongsTo'部分,那么我理解文档它实际上不会是一个关联,所以我无法使用include来提取查询中的相关数据:[]

正确 - 只有属于你只能做Parties.findAll(include People) - 反过来你也需要设置反向关联。

  

如果我遗漏了'参考'部分,那么我无法指定本地字段名称'people_id'与常规'peopleId'不同,也不能设置'deferrable'

是的

  

我假设我可以使用getPeople()返回一个用于外键的类,它不必是一个单例

如果您有多个相同模型的实例,则可能会遇到细微问题 - 一般模式是将每个模型定义在单独的文件中并要求它一次。您需要访问模型的任何地方都可以从续集实例访问它 - 请参阅https://github.com/sequelize/express-example