【发布时间】:2013-02-18 22:53:55
【问题描述】:
我正在为一个新项目设计一个 MySQL 数据库。我将每天导入 50-60 MB 的数据。
会有一个带有主键的主表。然后会有子表有自己的主键和指向主表的外键。
新数据必须从一个巨大的文本文件中解析出来,然后在导入主数据库之前进行一些小的操作。解析和导入操作可能涉及大量故障排除,因此我想将新数据导入临时数据库并确保其完整性,然后再添加到主数据库。
出于这个原因,我最初想每天解析新数据并将其导入一个单独的临时数据库。通过这种方式,我可以在添加到主数据库之前检查数据,同时我可以将每天的数据存储为一个单独的数据库,以便以后需要从各个临时数据库重建主数据库。
我正在考虑在 InnoDB 引擎中使用主键/外键,以保持跨表的关系完整性。这意味着当我每天导入新数据时,我必须担心自动增量 ID(主键)没有任何重复。
那么,在这种情况下,最好的选择是什么?
制作master的副本,每天直接导入master的副本。用新副本替换现有母版。
每天将新数据导入临时数据库,但将主键的自动增量起始值更改为大于主键中的最大值。然后我是否还要更改所有表(主表及其子表)的主键的自动增量值?
每天将新数据导入临时数据库,无需担心主键值。找到其他方法将临时数据库与主数据库合并而不会发生主键冲突?如果使用此策略,如何在确保与子表的所有关系保持正确的同时更新主表中的主键以获取新数据?
【问题讨论】:
-
为什么不能在导入时检查数据?当一切看起来不错时使用事务并提交,或者如果您想中止则回滚。导入您可以验证的较小块,这样您就不必在未检查出某些内容时中止整个过程。
-
IMO 你列出的所有三个建议都太复杂了——它们的破解方法太多了。
-
@Gavin,但你不是说我应该在你的第一条评论中选择#1(“为什么你不能在导入数据时检查数据”)?一件事是我必须导入新数据并在本地环境中进行测试,然后才能在线发布。所以我必须离线使用数据库的副本......然后我只想将新数据导入在线主控而不是每天上传主控。每天有 50-60 MB 的新数据,数据库会很快变得很大……然后我必须每天将这个庞大的数据库上传到服务器。这将是很多带宽。
-
我怀疑使用所有这三种方法,你会遇到冲突。如果你做了#1,如果实时数据库在你导入、测试和复制到主数据库之间发生变化会发生什么?我不会接受这三个想法中的任何一个。当您导入数据时,我会在事务内部进行测试,然后在数据良好时提交。
-
啊,我明白了。我忘了提到数据库的在线版本是只读的......它不能在导入之间更改。
标签: mysql database database-design