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

我用express.js服务器和sequelize.js运行node.js。 这是一个仅用于API的应用程序,所以没有视图写在节点中。

我想了解如何构buildPostgreSQL中两个数据模型之间的关联。 我有用户和活动,每个都是自己的表,每列都有关于每个(如用户的“用户名”和“电子邮件”,以及活动的“名称”和“消息”)列。 用户可以拥有许多广告系列; 用户可以join许多广告系列。 活动可以由许多用户拥有; 广告系列可以有许多用户join。

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

如何在后续模式中定义用户和广告活动之间的关系? 我正在检查这些文档( http://sequelizejs.com/docs/latest/associations#block-2-line-0 ),但是我在陌生的领域,并且会感谢如果有人有时间来概念地解释你使用sequelize做这种事情。 例如,我可以读写registry,但是我已经通过将其build模为单独的DB对象来完成该操作,并且具有它自己的API端点('/ api / register /')并传入UserId和CampaignId )。 所以现在我有一个用户,活动和注册的模型。 它的作品,但似乎是错误的,所以我正在寻求澄清。

我欢迎关于我缺less的概念,我缺less的方法,我应该看看的文档的build议…

更新

Sequelize的.hasMany和.belongsTo摆弄这些方法,我正在弄清楚如何创build新的“连接表”以及定义这些关系所创build的区域的方法 。 (这是我第一次接触到ORM)。

(我会等几个小时,看看别人是否有更好的信息回答,然后将自己的答案标记为正确)。

经过一些研究,我发现了我需要向前迈进的信息。

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

关于架构 :不是为用户,广告系列,注册和CampaignOwner创build数据库模型,而是为用户和广告系列创build模型。 存储用户和广告活动之间关系的表格将在定义关联时自动创build为联结表格(新词)。 我目前正在定义该关联的方式如下所示:

// '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" }); 

关于神奇的方法 :当用户创build一个广告系列时,我可以将该用户注册为广告系列所有者,如下面的代码所示。 (下面的东西看起来很乱,我相信有更好的方法来组织这些function)。 函数“getOwns”和“addOwner”有助于为我阐明ORM的作用,以及它如何适用于build模数据库的Sequelize方法。 名称“addOwner”和“getOwns”由上面定义的.hasMany关系的'as'属性定义。

 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); }) }) }) })