Sequelize.js使用PostgreSQL进行一对多设计的最佳实践

时间:2014-09-13 05:25:18

标签: node.js postgresql orm associations sequelize.js

我正在使用express.js服务器和sequelize.js运行node.js.这是一个仅限API的应用程序,因此没有在节点中编写视图。

我试图了解如何在PostgreSQL中构建两个数据模型之间的关联。我有用户和广告系列,每个都有自己的表格,其中包含各自的列(例如'用户名''电子邮件'用户,'名称'和&#39 ;消息'适用于广告系列)。用户可以拥有多个广告系列;用户可以加入许多广告系列。广告系列可以由许多用户拥有;广告系列可以让很多用户加入。

我想我会包含两个额外的表来定义用户和广告系列之间的关系,其中一个叫做“注册”和“注册”。它告诉哪个用户加入了什么,另一个叫做“CampaignOwners”'它告诉哪个用户在什么Campaign上有管理角色。这两个表都有UserId和CampaignId列来定义关系。因此,您可以期望相同的UserId和CampaignId显示在这些表中的许多行中。

如何在sequelize架构中定义用户和广告系列之间的关系?我正在查看这些文档(http://sequelizejs.com/docs/latest/associations#block-2-line-0),但我处于陌生的领域,如果有人有时间从概念上解释你是如何使用续集来做这种事情的话,我将不胜感激。例如,我可以读取和写入注册表,但我已经通过将其建模为单独的数据库对象来完成它,并且它具有自己的API端点(' / api / register) /'并传入UserId和CampaignId)。所以现在我有一个用户,广告系列和注册模型。它有效,但对我来说似乎不对,所以我正在寻求澄清。

我欢迎有关我缺失的概念,缺少的方法,我应该查看的文档的建议......

更新

Sequelize的.hasMany和.belongsTo 摆弄这些方法,我想弄清楚如何创建新的"连接表"和the methods that area created from defining these relationships。 (这是我第一次接触ORM)。

1 个答案:

答案 0 :(得分:2)

(在我将自己的答案标记为正确之前,我等待几个小时,看看其他人是否回答了更好的信息)。

经过一番研究后,我发现了我需要前进的信息。

(这两个文件有点难以消化,但多次阅读它们给出了我所寻求的答案) https://github.com/sequelize/sequelize/wiki/API-Reference-Associations http://sequelizejs.com/docs/latest/associations#check-associations

关于架构:只需为用户和广告系列创建模型,而不是为用户,广告系列,注册和CampaignOwners创建数据库模型。存储用户和广告系列之间关系的表格将在定义关联时自动创建为连接表(我的新术语)。我目前定义该关联的方式是这样的:

// 'db' is an object that stores all the db models

  // User joins many campaigns. Campaign has many registered users.
db["User"].hasMany(db["Campaign"], { as: "Registration", through: "Registrations" });
db["Campaign"].hasMany(db["User"], { as: "Registration", through: "Registrations" });

  // Campaign has many owners (as users). Users own many campaigns.
db["Campaign"].hasMany(db["User"], { as: "Owner", through: "CampaignOwners" });
db["User"].hasMany(db["Campaign"], { as: "Owns", through: "CampaignOwners" });

关于魔术方法:当用户创建广告系列时,我可以将该用户注册为广告系列所有者,如下面的代码所示。 (下面的内容对我来说看起来很混乱。我确信这是组织这些功能的更好方法)。功能' getOwns'和' addOwner'帮助澄清一下ORM的作用以及它如何适用于Sequelize建模数据库的方式。名称' addOwner'并且' getOwns'由'定义为'上面定义的.hasMany关系的属性。

db.Campaign.create({
        name: req.body.name,
        target: req.body.target,
        callToAction: req.body.callToAction
      })
        .success(function(campaign){
          user
            .save()
            .complete(function(err, owner){
               // addOwner(), a method magically created by Sequelizer, will insert objects into the DB as owners of this campaign
               campaign
                   .addOwner(owner)
                   .success(function(campaignOwner){
                       campaignOwner
                          .getOwns()
                          .success(function(owns){
                             // getOwns(), a method magically created by Sequelizer, gets all campaigns owned by this user and returns it as the 'owns'
                             res.send(owns);
              })
            })
          })
        })