【问题标题】:Importing new data to master database versus temporary database?将新数据导入主数据库与临时数据库?
【发布时间】:2013-02-18 22:53:55
【问题描述】:

我正在为一个新项目设计一个 MySQL 数据库。我将每天导入 50-60 MB 的数据。

会有一个带有主键的主表。然后会有子表有自己的主键和指向主表的外键。

新数据必须从一个巨大的文本文件中解析出来,然后在导入主数据库之前进行一些小的操作。解析和导入操作可能涉及大量故障排除,因此我想将新数据导入临时数据库并确保其完整性,然后再添加到主数据库。

出于这个原因,我最初想每天解析新数据并将其导入一个单独的临时数据库。通过这种方式,我可以在添加到主数据库之前检查数据,同时我可以将每天的数据存储为一个单独的数据库,以便以后需要从各个临时数据库重建主数据库。

我正在考虑在 InnoDB 引擎中使用主键/外键,以保持跨表的关系完整性。这意味着当我每天导入新数据时,我必须担心自动增量 ID(主键)没有任何重复。

那么,在这种情况下,最好的选择是什么?

  1. 制作master的副本,每天直接导入master的副本。用新副本替换现有母版。

  2. 每天将新数据导入临时数据库,但将主键的自动增量起始值更改为大于主键中的最大值。然后我是否还要更改所有表(主表及其子表)的主键的自动增量值?

  3. 每天将新数据导入临时数据库,无需担心主键值。找到其他方法将临时数据库与主数据库合并而不会发生主键冲突?如果使用此策略,如何在确保与子表的所有关系保持正确的同时更新主表中的主键以获取新数据?

【问题讨论】:

  • 为什么不能在导入时检查数据?当一切看起来不错时使用事务并提交,或者如果您想中止则回滚。导入您可以验证的较小块,这样您就不必在未检查出某些内容时中止整个过程。
  • IMO 你列出的所有三个建议都太复杂了——它们的破解方法太多了。
  • @Gavin,但你不是说我应该在你的第一条评论中选择#1(“为什么你不能在导入数据时检查数据”)?一件事是我必须导入新数据并在本地环境中进行测试,然后才能在线发布。所以我必须离线使用数据库的副本......然后我只想将新数据导入在线主控而不是每天上传主控。每天有 50-60 MB 的新数据,数据库会很快变得很大……然后我必须每天将这个庞大的数据库上传到服务器。这将是很多带宽。
  • 我怀疑使用所有这三种方法,你会遇到冲突。如果你做了#1,如果实时数据库在你导入、测试和复制到主数据库之间发生变化会发生什么?我不会接受这三个想法中的任何一个。当您导入数据时,我会在事务内部进行测试,然后在数据良好时提交。
  • 啊,我明白了。我忘了提到数据库的在线版本是只读的......它不能在导入之间更改。

标签: mysql database database-design


【解决方案1】:

我不确定这是否像你说的那么复杂?

为什么不这样做:

  1. 将原始数据导入临时表(为什么它必须是一个单独的数据库?)
  2. 对临时表运行转换/完整性检查。
  3. 数据好后,直接插入主表。
  4. 在主表上使用自动递增的 ID,该 ID 依赖于您正在导入的数据。这允许您拥有一个唯一的 ID 您的导入中可能存在的原始 ID。
  5. 向您的主表添加一个字段,为您提供记录来自哪个导入的记录。
  6. 除了将数据复制到您的主表之外,还要创建一个与您合并的数据相关联的日志。如果您发现数据有误/错误,可帮助您撤销数据,并为您提供审计跟踪。

最后只是建立了一个沙盒数据库,编写了一堆存储过程并测试了它的废话。 =)

【讨论】:

  • 我认为新数据可以导入到临时表中……尽管我可能有 12 个左右的表,所以我必须为所有这些表创建临时版本。但是维护子表和父表之间的关系呢?当我从临时父表插入主父表时,我还必须担心将新主键与子表匹配...如何将临时表(父+子)中的所有内容复制到主表表(父+子)同时保持关系完整性?
  • 为了澄清......您正在导入一个内部有关系的大表?还是导入很多文件?
  • 我将导入大约十几个表。一个表是父表,其他表是子表……每个子表都有一个指向父表的外键。
  • 是的,这是有道理的。我会将它们全部导入临时表。应该很容易实现自动化。您可以编写一个充当游标的存储过程来遍历主临时记录 - 找到所有子记录 - 然后将它们复制到活动表中。请记住,您可以获取已插入记录的 ID,并将其用作活动子表的新主外键。
  • 只使用 MySQL 几个月,我不得不重新阅读该段落大约 5 次才得到它。 =) 我得到了一般的要点,但不知道如何创建这样的存储过程......你能给我指出一个资源,比如一个能让我走上正确道路的教程吗?谢谢。
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 2015-05-21
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-06-24
  • 2018-02-05
相关资源
最近更新 更多