(tldr;我认为定期更新会强制表使用自然键。所以我必须迁移我的数据库模式。)
我有一个生产数据库,其中有一个类似planets的表,尽管它具有很好的潜在自然键(例如,永远不会真正改变的行星名称),但它使用典型的递增整数作为主键。行星表有一个或两个自引用列,例如 *parent_planet_id*。
现在我正在构建离线的基于云的工作人员,每周重新创建行星记录的子集,并且它们需要与主服务器集成。我的计划是:
- 一个工作实例有一个迷你版的数据库(相同的模式,但没有行星记录)
- 每周一次,工作人员启动,完成所有处理,创建其 100,000 左右的行星记录,并导出数据。(我认为导出格式对于这个特定问题并不重要:可能是 mysqldump、yaml 等)
- 然后,生产服务器导入记录:一些是新记录,大多数是更新。
最后一步是我不知道如何解决的问题。我不是每次都完全替换行星表,所以问题是两个数据库都有自己的递增整数 PK。所以我不能只做一个简单的导入。
我考虑过在没有 id 列的情况下导出,但后来我意识到自引用列会阻止这种情况。
我看到两种可能的解决方案:
- 重新设计架构以对行星表使用自然键。这会很痛苦。
- 使用 UUID 而不是键的递增整数。我认为搬到那里会更容易。id 将是唯一的,并且可以安全地导入新行。这也避免了依赖于键中的自然数据的问题。