在PostgreSQL中记录任意数量的条目

时间:2012-01-27 04:04:29

标签: sql postgresql

我在PostgreSQL中设计一个主要存储不同人信息的数据库。我想将日志与每个人相关联,包括日期和文本条目。日志可以包含任意数量的条目。以下是我玩过的想法:

  1. 我认为我想要的是这样的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...
    
  2. 但我不知道如何让row_num正确增加;它应默认为该person_id的最大当前row_num之一。换句话说,给定row_num的{​​{1}}应该是连续的。

    1. 或者,无论person_id如何,我都可以row_num递增,以便每个日志条目都有一个不同的行号。但是从第1行到第3行person_id 1的日志跳转似乎并不令人满意,这也可能使错误难以发现。

    2. 我的最后一个想法是通过制作复合类型person_id将日志直接包含在person表中。然后log_entry = (date, text)表中的列log可以存储数组:

      person
    3. 但这看起来很麻烦。

      所以我的问题是,a)哪种解决方案是好的设计; b)解决方案1的自动递增问题的任何方法?如果重要的话,这是一个供个人使用的小型数据库;我想要良好的结构,但我很有可能成为唯一的用户。非常感谢您的帮助!

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。