我在PostgreSQL中设计一个主要存储不同人信息的数据库。我想将日志与每个人相关联,包括日期和文本条目。日志可以包含任意数量的条目。以下是我玩过的想法:
我认为我想要的是这样的log_table
:
person_id | row_num | row_date | row_text
-----------------------------------------
1 | 1 | 01/01/12 | Blah...
2 | 1 | 01/02/12 | Foo...
1 | 2 | 01/04/12 | Bar...
但我不知道如何让row_num
正确增加;它应默认为该person_id的最大当前row_num
之一。换句话说,给定row_num
的{{1}}应该是连续的。
或者,无论person_id
如何,我都可以row_num
递增,以便每个日志条目都有一个不同的行号。但是从第1行到第3行person_id
1的日志跳转似乎并不令人满意,这也可能使错误难以发现。
我的最后一个想法是通过制作复合类型person_id
将日志直接包含在person
表中。然后log_entry = (date, text)
表中的列log
可以存储数组:
person
但这看起来很麻烦。
所以我的问题是,a)哪种解决方案是好的设计; b)解决方案1的自动递增问题的任何方法?如果重要的话,这是一个供个人使用的小型数据库;我想要良好的结构,但我很有可能成为唯一的用户。非常感谢您的帮助!
答案 0 :(得分:1)
为什么不使用时间戳来存储插入行的时间?
这样你就不需要表中额外的row_num列了,你可以随时“计算”它:
SELECT person_id,
row_number() over (partition by person_id order by row_timestamp) as row_num,
row_timestamp,
row_text
FROM log_table
当然,如果用户有可能每个 micro 秒生成多个条目,那么您最终可能会得到具有完全相同时间戳的日志条目。
但即使在繁忙的系统中,这也不太可能(但并非不可能)。
如果您不能(或不想)使用时间戳,您可以始终使用为所有用户递增的序列,然后使用row_number()函数在检索期间生成无间隙行号(如如上所示,只需在序列填充的列上使用order by。