我正在使用用户标识符更改的数据。用户标识符是GUID,因此不应在不同用户之间重复。当标识符改变时,我在表中的同一行上提供旧用户标识符和当前用户标识符。我需要协调这些值,并将它们分配给相同的数据库生成的整数ID,这是我用来引用数据库中其他位置的用户的值。
不久前,用户标识符不会更改。我有以下设置:
users table
id | identifier
---------------
1 | ABC
2 | DEF
etc ...
activity table
id | timestamp | identifier | other_data
---------------------------------------------
...
29 | 1 | ABC | more data
30 | 2 | ABC | even more data
31 | 3 | ABC | etc
32 | 4 | DEF | etc
33 | 5 | DEF | etc
34 | 6 | ABC | more data
...
我的目标仍然是将activity
表中的活动聚合到activity_daily
表中。在之前的设置中,这相对简单,因为我可以预期每个用户identifier
是一致的。
我的输出聚合activity_daily
表具有以下结构:
id | user_id | date | other_stuff
--------------------------------------
1 | 1 | 9/10/2017 | etc
2 | 1 | 9/11/2017 | etc
3 | 2 | 9/08/2017 | etc
4 | 2 | 9/09/2017 | etc
5 | 1 | 9/12/2017 | etc
...
但是,现在,activity
表已更改。对于identifier
更改的第一个活动记录,我在名为identifier_old
的列中获取值。活动表现在如下所示:
activity table
id | timestamp | identifier | identifier_old | other_data
-------------------------------------------------------------------
...
29 | 110 | ABC | | more data
30 | 111 | GHI | ABC | other data
31 | 112 | GHI | | etc
32 | 114 | DEF | | etc
33 | 115 | DEF | | etc
34 | 116 | JKL | DEF | etc
35 | 117 | GHI | | etc
36 | 118 | JKL | | etc
37 | 119 | JKL | | etc
38 | 120 | GHI | | etc
...
现在,我需要创建相同的聚合activity_daily
表,增加了将identifier
和identifier_old
映射到{{id
中的同一整数users
的复杂性1}}表。
每天,大约有1000万条记录被加载到activity
表中,必须进行协调和汇总。有数百万的唯一identifiers
,所以我试图尽可能高效地协调标识符和聚合步骤。
我对如何处理这个问题有两个想法,但在考虑activity
表上的聚合和连接时,它们似乎都没有特别有效。
1)创建一个包含identifiers
,id
和identifier
列的user_id
表格。 users
表不再存储identifier
。然后执行以下操作:a)检查identifier_old
是否在identifiers
表中。如果没有,请添加它并在users
表中创建一个条目以生成ID。将该id添加到identifiers
表中的正确记录中。 b)在activity
表中查看identifier
和old_identifier
都有值的记录。将这些记录中的identifier
添加到identifiers
表,然后使用user_id
中old_identifier
值中的相应identifier
值更新这些记录表。 c)根据identifier
表中的activity
列进行聚合等。
2)类似,但不保持单独的identifiers
表。而是将第三列添加到名为users
(或其他)的user_static_id
表中。所有identifier
值都会进入users
表,但那些引用同一个人的值共享相同的user_static_id
,而聚合表具有user_static_id
的外键,而不是id
users
表中的identifier
列。
这些似乎都不是一个很好的方法,似乎它们可能会大大减慢协调和聚合过程。
注意:我无法肯定地说,更改后的timestamp
值不会恢复为之前的值。对于每个用户,他们可能会定期更改,他们可能会还原,或者他们可能永远保持静态。 activity
表中的identifier
列允许我对记录进行排序,以便在遇到同时具有{{1}的记录之前,我不会遇到带有新identifier
的记录}和identifier_old
。
值得注意的是,在聚合发生后,activity
表会被刷新。
鉴于这种情况,处理此问题的最有效方法是什么?