我希望为我的应用添加VALIDTIME
时间支持,并希望得到一些反馈。看起来Postgres还没有原生的时态支持(我知道有扩展),所以我现在必须采用手动策略。从逻辑上讲,这就是我所追求的:
CREATE TABLE MyPartitionedTable(
c1 int,
ValidTS tstzrange -- VALIDTIME field
)
PARTITION BY LIST (
(
CASE WHEN CAST(UPPER(ValidTS) AS DATE) = DATE '9999-12-31' THEN 1 -- Store all current rows in one partition
ELSE 0 -- Store everything else in another partition
END
)
)
时空
当前行:UPPER(ValidTS) = '9999-12-31 23:59:59.999999'
旧行:UPPER(ValidTS) <> '9999-12-31 23:59:59.999999'
Temporal DELETE :UPDATE
“当前行”和set UPPER(ValidTS) = current_timestamp
Temporal INSERT :INSERT
“当前行”
时间更新:时间DELETE
+时间INSERT
(必须在同一交易中完成)
时间选择(当前):SELECT "Current row"
时间选择(AS OF):SELECT ... WHERE ValidTS @> <AS_OF_TS>
分区
Postgres 10支持本机表分区,所以我想利用它:
我一直在玩它,似乎有一些限制。例如,我不能使用上面示例中的CASE
语句 - 关于IMMUTABLE
表达式的错误。我认为这与使用TIMESTAMP WITH TIME ZONE
有关。此外,文档说您无法在分区表上定义UNIQUE
/ PRIMARY KEY
约束。
我的问题
答案 0 :(得分:1)
有关您的设置的一些评论:
PostgreSQL无法在分区之间自动移动行。(
我希望有<link rel="stylesheet">
和validfrom
时间戳,但我只能在您的说明中看到一个时间戳。您想如何实施validto
?
我认为将时间戳存储为文本不是一个好主意。将其存储为AS OF
或date
,然后您对非timestamptz
函数没有任何问题。然后我会使用IMMUTABLE
而不是像infinity
这样的任意日期用于活动行。
我不会对表进行分区,而是使用索引。如有必要,您可以使用9999-12-31
创建部分索引。如果对当前数据的所有查询都包含相同的条件,则将使用这些索引。我想这取决于你的查询什么是最好的方法。当然,为了加快顺序扫描,只有分区才有用。