我正在开发一个跟踪三个级别的健康数据的项目:
Country -> Region -> District
由于重新划分,有时区域分为两个或更多区域或两个或更多区域合并为一个区域。
数据库的报告目标之一是能够在10年或更长时间内跟踪数据。在地区一级,工作人员必须能够看到他们所在地区的历史,无论它是否与多年前的状态相同。
例如,我们假设我们有以下内容,每年我们都有一个有效的人口编号,以及一些疾病监测数据。在此示例中,DA
在2010年分为DC
和DD
,而DC
和DE
在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年并不存在,但是使用人口数据,我们可以重新计算数字,以估算其所涵盖地区特定疾病的患病率...)
答案 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个查询中执行此操作。当然,每当盘区发生变化时,都需要重新计算缓存。