跟踪SQL数据库中的重新分区

时间:2014-08-19 14:20:36

标签: sql database-design relational-database

我正在开发一个跟踪三个级别的健康数据的项目:

Country -> Region -> District

由于重新划分,有时区域分为两个或更多区域或两个或更多区域合并为一个区域。

数据库的报告目标之一是能够在10年或更长时间内跟踪数据。在地区一级,工作人员必须能够看到他们所在地区的历史,无论它是否与多年前的状态相同。

例如,我们假设我们有以下内容,每年我们都有一个有效的人口编号,以及一些疾病监测数据。在此示例中,DA在2010年分为DCDD,而DCDE在2013年合并。

2008: DA, DB
2009: DA, DB
2010: DA -> (DC,DD), DB
2011: DC, DD, DB -> (DE, DF)
2012: DC, DD, DE, DF
2013: (DC,DE) -> DG, DD, DF
2014: DG, DD, DF
2015: DG, DD, DF

从表面看,使用某种图表似乎是跟踪它的最佳方式。

您如何在SQL数据库中跟踪这些更改,以便在2008-2015期间可以尝试查看区域DG的历史记录?

(我知道DF在2008年并不存在,但是使用人口数据,我们可以重新计算数字,以估算其所涵盖地区特定疾病的患病率...)

1 个答案:

答案 0 :(得分:1)

它总是取决于最终预期结果应包含的内容,但根据问题中给出的内容,我可能会使每个健康数据条目与区域ID相关,并标记每个健康的时间戳 - 数据记录。

因此,当DA拆分为DC和DD时,会创建2个具有新唯一ID的新区域。 此外,地区名称不应该是唯一的。因此,当DC与DD合并并再次成为DA时,DA再次成为具有新ID的全新实体。

为了跟踪旧区,我有一张桌子,如下:

district_history_relation
---------------------------
district_id | old_district_id | timestamp

所以假设DA = 1.它分裂并变为DC = 2和DD = 3.为了跟踪这一点,我们添加

INSERT INTO district_history_relation (district_id, old_district_id) VALUES (2,1);
INSERT INTO district_history_relation (district_id, old_district_id) VALUES (3,1);

当他们再次合并并成为DA = 4时,我们去

INSERT INTO district_history_relation (district_id, old_district_id) VALUES (4,2);
INSERT INTO district_history_relation (district_id, old_district_id) VALUES (4,3);

数据保存为

INSERT INTO health_data (district_id,data,timestamp) VALUES (4,'whatever',NOW());

然后你作为一个独特的实体完全可以加入区,一个很好的district_history_relation来查询foreach区的变化。如果你希望经常遍历“历史树”,那么我会在分区表中添加一个“缓存表”,因为传统的RDBMS不处理真正的树查询。 像这样:

district_tree_cache
--------------------- 
district_id | tree
INSERT INTO district_tree_cache (district_id,tree) VALUES (4,'1|2,3|4');

然后可以拆分“|”并将包含历史中的每个“步骤”。这将是可连接的,因此您可以在1个查询中执行此操作。当然,每当盘区发生变化时,都需要重新计算缓存。