检索给定帖子的当前版本

时间:2017-08-14 09:19:34

标签: database postgresql

我为我的项目发布了帖子。数据库目前看起来像这样:

posts
  bigint id
  datetime created_at

post_versions
    bigint id
    int major_version
    int minor_version
    bigint post_id
    string title
    text contents

我希望能够始终获得给定帖子的当前版本。当前版本定义为:

  

给定帖子的最大主要版本和次要版本的帖子版本

我认为包含"当前版本的数据库视图"将是一个不错的选择,但我不知道从哪里开始。每次创建新版本时,数据库视图都会更新以引用给定帖子的最新版本。

使用该视图,我可以轻松查询给定帖子的当前版本。

任何想法从哪里开始?

1 个答案:

答案 0 :(得分:1)

分享主要&次要版本将使您的查询逻辑非常复杂。你的专业和专业次要版本是32位有符号整数。因此,我创建了一个函数,将它们组合成一个64位有符号整数,可以用作单个值进行比较。例如:

CREATE FUNCTION version(int, int) RETURNS bigint AS
'SELECT ($1::bigint << 32) + $2'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

这将使视图逻辑更容易。然后,您只需创建一个视图,返回每个帖子的最大版本。例如:

CREATE VIEW post_latest_versions AS
SELECT *
FROM post_versions p1
WHERE version(major_version,minor_version)=(
    SELECT MAX(version(p2.major_version,p2.minor_version)) 
    FROM post_versions p2 WHERE p2.post_id=p1.post_id
)

然后,您可以根据需要使用post_latest_versions。您应该考虑是否应该将其设为materialised view以提高性能。

如果控制持久层,可以使用许多替代方法。例如,您可以将每个帖子ID的最新发布版本的ID存储在另一个表中。