跟踪关系数据库表中的随机列数据更改

时间:2016-05-03 16:06:42

标签: mysql sql postgresql sqlalchemy rdbms

我有一个PostgreSQL表(居民表),用于存储有关公寓楼内居民的信息。说有50个单位。我有关于住在这里的每个家庭的详细信息。一些列是 - Resident_type(租用,拥有,..),Members_count,Pets..etc。

我在大约50条记录中有超过300列(尝试包含每个微小的细节)。所以这就像一个记分板,记录了一些州居民。

说,有些事情发生了变化。家庭号码:23日有一只新狗,2016年3月10日。我会将Pet_count从0到1更新各自的列,并将Pet_type从无更新到狗。

你可以看到这样的事件是随机发生的。一年中的大部分时间都没有变化。所以如果我想跟踪这些随机变化,那该怎么做。?

请记住,我的记录数量较少,但列数太多。

另外,我正在使用sqlalchemy和postgresql。但它是一个普通的数据库问题。!

我的计划B,如果没有机构给我更好的选择:

我要把我的数据分成两组。时间可变的数据(如居民,房屋成员,宠物......)和永久数据(如房屋号码,公寓位置,房间......)。我将把Time-changeable列变成一个表,它有一个弱数列。我确信有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

这里有一个用于记录变化数据的设计模式,我已经看到了它的两个不同版本。

第一个版本涉及该表和该表的视图。该表由所有表列和时间戳列组成。每个插入和更新有一行 - 如果家庭23有一只狗,有一排他们没有狗(可追溯到2013年或其他什么),还有一排他们有一只狗(日期为3月10日) ,2016)。该表包含每个家庭的完整历史。

视图仅选择每个系列的最新行 - 它是“now”的快照。

此模式的第二个版本涉及两个表和一个触发器。主表就像你目前一样 - 每个家庭一排。该表上有一个触发器:每次更新时,触发器都会在第二个表中插入带时间戳的行。

在这两个版本中,您都有一个包含存档更改的表,以及当前状态的表或视图。

听起来我觉得第二个版本适合你。它更适合于经常阅读,偶尔写入设置(这是您所描述的),并且因为您可以使用触发器,您可能只能在数据库层上实现它而无需更改应用程序

以下是第一种方法中视图所需的sql类型的示例:

CREATE VIEW current_data AS
  SELECT c.family_no, c.dog, ....
  FROM ( SELECT family_no,
                MAX(changed_timestamp) as most_recent
         FROM historical_data
         GROUP BY family_no ) h,
       historical_data c
  WHERE
    c.family_no = h.family_no AND
    c.changed_timestamp = h.most_recent;