在删除 table 的同时在 Objection.js 中保留关系图

Keep a relation map in Objection.js while removing the table

我正在开发一个类似 reddit 的网站,其中投票存储每个用户(而不是每个 post)。这是我的相关架构:

我已经为 content table:

定义了一个 voteCount relation in Objection.js 模型
class Content extends Model {  
  static tableName = 'content';
  static relationMappings = {
    voteCount: {
      relation: Model.HasManyRelation,
      modelClass: VoteCount,
      join: {
        from: 'content.id',
        to: 'vote_count.content_id'
      }
    }
  }
}

但我最近(了解到并)决定我不需要保留(和更新)一个单独的 vote_count table,而实际上我可以查询 vote table 并且基本上得到相同的 table 作为结果:

SELECT content_id
     , category_id
     , COUNT(*) AS count
  FROM vote
GROUP 
    BY content_id
     , category_id

所以现在我想完全摆脱 vote_count table。

但这似乎会破坏我的 voteCount 关系,因为不会有 VoteCount 模型(此处未显示,但它是 vote_count 的对应模型 table) 也没有了。 (对吗?)

如何在摆脱 vote_count table 的同时保持 voteCount 关系(并因此 VoteCount 建立模型)?

有没有办法以某种方式在关系中指定而不是查看具体 table,它应该查看查询结果?或者是否可以为其定义一个模型 class?

如果有帮助,我在 PostgreSQL 中的基础数据库。

感谢@Belayer。视图正是这个问题的解决方案。

Objection.js supports 在模型 class 中使用视图(而不是 table),所以我所要做的就是根据上述查询创建一个视图.

我也在使用 Knex 的 migration strategy to create/version my database, and although it doesn't (yet) support 创建开箱即用的视图,我发现您可以只使用原始查询:

module.exports.up = async function(knex) {
  await knex.raw(`
    CREATE OR REPLACE VIEW "vote_count" AS (
      SELECT content_id
          , category_id
          , COUNT(*) AS count
        FROM vote
      GROUP
          BY content_id
          , category_id
    )
  `);
};
module.exports.down = async function(knex) {
    await knex.raw('DROP VIEW "vote_count";');
};

上述迁移步骤替换了我的 table vote_count 等效视图,Objection.js 模型 class (VoteCount) 用作通常不需要任何更改,Content class.

上的关系 voteCount 也是如此