在现场计算机上更新(或替换)整个数据库表的最佳方法是什么?

Dan*_*Lew 8 mysql database postgresql

我每周都会收到一份数据源,我将解析并放入数据库.数据每周都不会有太大变化,但我应该定期更新数据库.除了每周更新,数据是静态的.

目前重建整个数据库不是问题,但最终这个数据库将是实时的,人们可能在重建数据库时查询数据库.数据量不小(几百兆字节),因此它不会立即加载,而且我个人想要一个比"我希望没有人在数据库处于混乱状态时查询"的简单系统.

我想到了解决这个问题的几种不同方法,并想知道最好的方法是什么.到目前为止,这是我的想法:

  1. 而不是替换整个表,查询我当前数据库与我想要放在数据库中的区别.但这似乎可能是一项不必要的工作量.

  2. 创建虚拟数据表,然后执行表重命名(或使服务器代码指向新数据表).

  3. 只是告诉用户该网站正在进行维护并将系统脱机几分钟.(由于显而易见的原因,这不是优选的,但如果它是最好的答案,我愿意接受它.)

思考?

kqu*_*inn 6

我不能说MySQL,但PostgreSQL有事务DDL.这是一个很棒的功能,这意味着您的第二个选项,即将新数据加载到虚拟表中,然后执行表重命名,应该很有效.如果您想更换表foofoo_new,你只需要新的数据加载到foo_new并运行一个脚本来执行重命名.该脚本应该在自己的事务执行,因此,如果一些关于命名变坏,都foofoo_new当它回滚将保持不变.

这种方法的主要问题是,从其他关键表中处理外键可能会有点麻烦foo.但至少可以保证您的数据保持一致.

我认为,从长远来看,更好的方法就是直接对数据进行更新(您的第一个选择).再次,您可以将所有更新保留在单个事务中,因此您可以保证全有或全无语义.更好的是在线更新,只是在新信息可用时直接更新数据.如果您需要其他人的批处理作业的结果,这可能不是您的选择,但如果您可以这样做,那么这是最佳选择.