首页 > 解决方案 > 在 SQL 中维护多个数据提供者和迁移方法

问题描述

考虑来自外部提供商的篮球比赛同步。为此,我有两个表,match表:

+----+----------------------+-----------+-----------+
| id |         date         | home_team | away_team |
+----+----------------------+-----------+-----------+
| 67 | 2021-07-28 19:45:002 | France    | USA       |
+----+----------------------+-----------+-----------+

还有一张external_match桌子:

+-----------------+----+
|   external_id   | id |
+-----------------+----+
| 8e73rekk0lreppj | 67 |
+-----------------+----+

现在我想引入第二个提供者,它也有这个完全匹配,但具有不同的属性,如国家等。然后,想法是有一个实现“开关”,能够随时改变提供者。我的解决方案是match通过以下方式更新表:

+----+--------------+---------------------+-----------+-----------+---------+----------+
| id | universal_id |        date         | home_team | away_team | country | provider |
+----+--------------+---------------------+-----------+-----------+---------+----------+
| 67 | 62fef7b1770a | 2021-07-28 19:45:00 | France    | USA       |         |        1 |
| 68 | 62fef7b1770a | 2021-07-28 19:45:00 | France    | USA       | Japan   |        2 |
+----+--------------+---------------------+-----------+-----------+---------+----------+

然后external_match表格可能会变成:

+-----------------+----+
|   external_id   | id |
+-----------------+----+
| 8e73rekk0lreppj | 67 |
| 18072481        | 68 |
+-----------------+----+

现在有一个universal_id,它id对于跨不同提供者的完全相同的匹配是唯一的,并且还有一个provider用于按提供者过滤的列。注意external_id列中的不同值,因为这些条目来自不同的提供者。然后,按提供者查询所有匹配项:

select * from match
...
where provider = ?

我认为它有效。但是,目前还不清楚如何生成universal_idmatch,除了表之外还有很多实体,比如teamplayer等等。肯定有某种数据匹配逻辑,对吧?但它通常是如何完成的?并在 SQL 方面?

此外,考虑一些由表id列索引的用户相关数据match现在,这个内容需要迁移才能使用universal_id吗?否则它只会显示是否为其中一个提供者设置了“开关”。

你有什么建议吗?谢谢

这是此Database Administrators Stack Exchange 帖子的转贴

标签: database-design

解决方案


如果您有一个始终可用的数据库,那么它可能有一个类似的表

匹配(id,prov1id,prov2id)

并且每当您需要匹配 prov1id 和 prov2id 时,您都可以参考此表。如果您需要始终在提供者之间切换,那么您可以发明一个生成唯一可识别密钥的公式,可能分别对比赛地点、时间和团队进行编码,并使用该编码来生成自动匹配的 id。不过,您需要定期同步您的提供者信息,因为在此期间可能已经创建/修改/删除了一些匹配项。


推荐阅读