如何首次使用多个表填充SQL数据库

时间:2018-11-16 08:06:33

标签: mysql r database data-modeling data-science

关于如何首次填充数据库的方法,我有一个一般性的问题。实际上,我正在处理R内的“原始”数据集(我已构建该数据帧是为了能够正常工作并快速提供见解),但现在我需要在关系数据库中构建和加载所有内容。

对于数据库设计,一切正常(=>概念,逻辑和3NF)。结果是一个非常“复杂”(都是相对的)数据模型,其中包含许多联结表和表中的外键。

我的问题是:现在,对我来说填充数据库最简单的方法是什么?

我的方法是从R中的“原始”数据帧开始为每个表生成一个.csv,然后在数据库中的每个表中加载它们。 是执行此操作的好方法还是您有任何更简单的方法?。另一点是,如何在填充时不与FK约束斗争?

非常感谢您的回答。我意识到这是非常“方法上的”问题,但找不到任何与教程/线程相关的问题

注意:我使用R(dplyr等)和MySQL

1 个答案:

答案 0 :(得分:2)

严重的relational database,例如Postgres,将提供用于填充大型数据库的功能。

批量加载

查找读取外部数据的命令,以将它们加载到具有匹配字段结构的表中。数据直接从操作系统的文件系统文件直接移到表中。这比使用通常的SQL INSERT加载单个行要快得多。此类命令尚未标准化,因此您必须在特定的数据库引擎中查找专有命令。

在Postgres中,这将是COPY命令。

暂时禁用referential-integrity

寻找延迟执行外键关系规则的命令,直到加载数据为止。

在Postgres中,使用SET CONSTRAINTS … DEFERRED在每个语句期间不检查约束,而要等到事务结束。

或者,如果您的数据库缺少此功能,则作为批量导入例程的一部分,您可以在删除约束之前先删除约束,然后在之后重新建立约束。但是请注意,这可能会影响所有其他数据库连接中的所有其他事务。如果您知道该数据库没有其他用户,那么也许这是可行的。

其他问题

要考虑的其他问题,请参阅Postgres文档中的Populating a Database(是否使用Postgres)。

  • 禁用自动提交
  • 使用COPY(用于批量导入,如上所述)
  • 删除索引
  • 删除外键约束(如上所述)
  • 增加maintenance_work_mem(更改数据库引擎的内存分配)
  • 增加max_wal_size(更改数据库引擎的预写日志的配置)
  • 禁用WAL归档和流复制(考虑将数据库的副本移动到复制服务器,而不是让复制移动海量数据)
  • 随后运行ANALYZE(提醒您的数据库引擎调查数据的新状态,以供其查询计划者使用)

数据库迁移

顺便说一句,您可能会发现一个数据库迁移工具,该工具有助于创建表和列,并可能有助于加载数据。考虑使用诸如FlywayLiquibase之类的工具。