我为我的项目发布了帖子。数据库目前看起来像这样:
posts
bigint id
datetime created_at
post_versions
bigint id
int major_version
int minor_version
bigint post_id
string title
text contents
我希望能够始终获得给定帖子的当前版本。当前版本定义为:
给定帖子的最大主要版本和次要版本的帖子版本
我认为包含"当前版本的数据库视图"将是一个不错的选择,但我不知道从哪里开始。每次创建新版本时,数据库视图都会更新以引用给定帖子的最新版本。
使用该视图,我可以轻松查询给定帖子的当前版本。
任何想法从哪里开始?
答案 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存储在另一个表中。