删除表时在objective.js中保留关系Map

ilmyapht  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(353)

我正在开发一个类似reddit的站点,每个用户(而不是每个帖子)都可以存储投票。以下是我的相关模式:
内容

id | author_id | title       | text
---|-----------|-------------|---
1  | 1 (adam)  | First Post  | This is a test post by adam

投票:任何人在任何职位上投过的所有票

id | voter_id    | content_id       | category_id
---|-------------|------------------|------------
1  | 1 (adam)    | 1 ("First Post") | 1 (upvote)
2  | 2 (bob)     | 1 ("First Post") | 1 (upvote)

投票计数:当前计数(“计数”)的总票数收到一个职位的所有用户

id | content_id       | category_id  | count
---|------------------|--------------|-------
1  | 1 ("First Post") | 1 (upvote)   | 2

我已经定义了一个 voteCount Objective.js模型中的关系 content 表格:

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 表,而实际上我可以查询 vote 表的结果基本相同:

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

所以现在我想摆脱 vote_count 整个table。
但这似乎会打破我的记忆 voteCount 因为不会有 VoteCount 模型(此处未显示,但它与 vote_count 表)也没有了(是吗?)
我该如何保持 voteCount 摆脱关系 vote_count 表(因此 VoteCount 模特(用它)?
有没有办法在关系中指定它应该查看查询的结果,而不是查看具体的表?或者可以为同一个类定义一个模型类吗?
我在postgresql中的底层数据库。

htzpubme

htzpubme1#

感谢@belayer。观点正是解决这个问题的方法。
js支持在模型类中使用视图(而不是表),所以我所要做的就是基于上述查询创建一个视图。
我还使用knex的迁移策略来创建/版本数据库,尽管它(目前)不支持创建现成的视图,但我发现您可以只使用原始查询:

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

上面的迁移步骤将替换我的表 vote_count 对于等效视图,以及objective.js模型类( VoteCount )像往常一样工作,不需要任何改变,关系也一样 voteCountContent 班级。

相关问题