在SQL中有效协调更改标识符?

时间:2017-09-16 13:08:39

标签: sql database postgresql

我正在使用用户标识符更改的数据。用户标识符是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表,增加了将identifieridentifier_old映射到{{id中的同一整数users的复杂性1}}表。

每天,大约有1000万条记录被加载到activity表中,必须进行协调和汇总。有数百万的唯一identifiers,所以我试图尽可能高效地协调标识符和聚合步骤。

我对如何处理这个问题有两个想法,但在考虑activity表上的聚合和连接时,它们似乎都没有特别有效。

1)创建一个包含identifiersididentifier列的user_id表格。 users表不再存储identifier。然后执行以下操作:a)检查identifier_old是否在identifiers表中。如果没有,请添加它并在users表中创建一个条目以生成ID。将该id添加到identifiers表中的正确记录中。 b)在activity表中查看identifierold_identifier都有值的记录。将这些记录中的identifier添加到identifiers表,然后使用user_idold_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表会被刷新。

鉴于这种情况,处理此问题的最有效方法是什么?

0 个答案:

没有答案