我有一个PostgreSQL表(residents表)来存储有关公寓楼中居民的信息。假设有50个单位。我有关于住在这里的每个家庭的详细信息。其中一些列是-Resident_type(出租,拥有,..),Members_count,Pets..etc。
我在大约50条记录中有300列(试图包括每个微小的细节)。因此,这就像记分板,其中记录了一些州居民。
说,有些变化。家族编号:23在2016年3月10日有了一只新狗,我会将Pet_count等列从0更新为1,将Pet_type从None列更新为Dog。
您可以看到这样的事件是随机发生的。一年中的大多数时间都没有变化。因此,如果我想跟踪这些随机变化,该怎么办。
请记住,我的记录数较少,但列数过多。
另外,我在PostgreSQL中使用sqlalchemy。但是,这是一个普遍的数据库问题。
我的B计划,如果没有人可以给我更好的选择:
我要把我的数据分成两组。随时间变化的数据(例如居民资产,房屋成员,宠物状态...)和永久性数据(例如门牌号,固定位置,房间...)。他们将使“时变”列成为一个表,该表具有一个弱数列。我确信有更好的解决方案。
最佳答案
这里有一个记录变更数据的设计模式,我已经看到了它的两个不同版本。
第一个版本涉及一个表和该表上的视图。该表由所有表列以及一个时间戳列构成。每次插入和更新都有一行-如果23号家庭养了一条狗,则有一行他们没有狗(早在2013年左右),有一行他们有狗(3月10日前后) ,2016)。该表包含每个家庭的完整历史记录。
该视图仅选择每个家庭的最新行-这是“现在”的快照。
此模式的第二个版本涉及两个表和一个触发器。主表就像您当前拥有的一样-每个家庭一行。该表上有一个触发器:每次更新时,触发器都会在第二张表中插入带有时间戳的行。
在这两个版本中,您都有一个包含已归档更改的表以及一个当前状态的表或视图。
在我看来,第二个版本很适合您。它更适合于经常读取,偶尔写入的设置(这就是您所描述的),并且由于可以使用触发器,因此很可能能够仅在数据库层上实现它,而无需更改应用程序。
这是第一种方法中视图所需的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;