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

标签 mysql sql postgresql sqlalchemy rdbms

我有一个 PostgreSQL 表(居民表)来存储有关公寓大楼居民的信息。假设有 50 套公寓。我有住在这里的每个家庭的详细信息。其中一些列是——Resident_type(租用、拥有、..)、Members_count、Pets..等。

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

比如说,有些事情发生了变化。 23号家庭在2016年3月10日有了一只新狗。我将更新相应的列,例如Pet_count从0到1,Pet_type从None到Dog。

您可以看到类似的事件是随机发生的。一年中的大部分时间都没有任何变化。因此,如果我想跟踪这些随机变化,该怎么办?

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

此外,我正在将 sqlalchemy 与 postgresql 一起使用。但这是一个一般的数据库问题。!

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

我要把我的数据分成两组。随时间变化的数据(如居民详细信息、房屋成员、宠物状态...)和永久数据(如门牌号、公寓位置、房间...)。我将把时间可变的列放入一个表中,该表有一个弱数字列。我确信有更好的解决方案。

最佳答案

这里有一个用于记录更改数据的设计模式,我见过它的两个不同版本。

第一个版本涉及一个表和该表上的 View 。该表由所有表列以及时间戳列构成。每次插入和更新都有一行——如果 23 号家庭养了一只狗,则有一行他们没有养狗(日期可以追溯到 2013 年或其他时间),而另一行他们确实有狗(日期为 3 月 10 日) ,2016)。该表包含每个家族的完整历史。

该 View 仅选择每个系列的最新行——它是“现在”的快照。

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

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

在我看来,第二个版本很适合你。它更适合经常读取、偶尔写入的设置(这就是您所描述的),并且因为您可以使用触发器,所以您可能能够仅在数据库层上实现它,而无需更改应用程序.

<小时/>

以下是第一种方法中 View 所需的 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;

关于mysql - 跟踪关系数据库表中的随机列数据更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009084/

相关文章:

php - mysql中打印表后导出为csv

mysql - 我可以将此模式用于 where 子句的可选部分吗?

java - 为什么我的查询结果返回 false

mysql - 排除列中的某些值

postgresql - 如何将 count(*) 结果加总?

sql - 在 Postgres 上的关系表上聚合 Json 对象

mysql - 如何在 XAMPP 中将默认存储引擎设置为 InnoDB

java.sql.SQLException 时区

mysql - 从另一个没有连接的表中选择

ruby-on-rails - 如何使用准备好的语句插入多行