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

Posted

技术标签:

【中文标题】使用 PostgreSQL 进行一对多设计的 Sequelize.js 最佳实践 [关闭]【英文标题】:Sequelize.js best practice for one-to-many design using PostgreSQL [closed] 【发布时间】:2014-11-07 07:54:17 【问题描述】:

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

我试图了解如何在 PostgreSQL 中构建两个数据模型之间的关联。我有用户和广告系列,每个都是他们自己的表格,其中包含每个相关的列(例如用户的“用户名”和“电子邮件”,以及广告系列的“名称”和“消息”)。用户可以拥有多个活动;用户可以加入许多活动。活动可以由多个用户拥有;活动可以有很多用户加入。

我想我会包括两个额外的表来定义用户和活动之间的关系,一个称为“注册”,它告诉哪个用户加入了什么,另一个叫做“CampaignOwners”,它告诉哪个用户对什么活动具有管理角色。这两个表都有 UserId 和 CampaignId 列来定义关系。因此,您可以期望相同的 UserId 和 CampaignId 出现在这些表的许多行中。

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

我欢迎对我缺少的概念、我缺少的方法、我应该查看的文档提出建议......

更新

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

【问题讨论】:

【参考方案1】:

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

经过一番研究,我找到了前进所需的信息。

(这两个文件有点难以消化,但多读几遍就找到了我想要的答案)。https://github.com/sequelize/sequelize/wiki/API-Reference-Associations http://sequelizejs.com/docs/latest/associations#check-associations

关于架构:无需为用户、活动、注册和活动所有者创建数据库模型,只需为用户和活动创建模型。定义关联时,存储用户和活动之间关系的表将自动创建为联接表(对我来说是新术语)。我目前定义该关联的方式是这样的:

// '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 关系的“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);
              )
            )
          )
        )

【讨论】:

以上是关于使用 PostgreSQL 进行一对多设计的 Sequelize.js 最佳实践 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

架构迁移:PostgreSQL 中的一对多、多对多

如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

在 PostgreSQL 中存储一对多或多对多关系的最佳方式是啥?

如何使用PowerDesigner软件进行数据库设计(一对多关系)

一对多连接在 postgres 中返回单行

一对一、一对多、多对多,如何设计数据表?