如何首次填充具有多个表的 SQL 数据库

How to fill for the first time a SQL database with multiple tables

我有一个关于如何第一次填充数据库的方法的一般性问题。实际上,我在 R 中处理 "raw" 数据集(我构建的数据框可以快速工作并提供见解),但我现在需要在关系数据库中构建和加载所有内容。

对于数据库设计,一切正常(=> 概念、逻辑和 3NF)。结果是一个相当 "complex"(都是相对的)数据模型,其中有许多连接 tables 和 tables 内的外键。

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

我的方法是从 R 中的 "raw" 数据帧开始为每个 table 生成一个 .csv,然后在数据库中按 table 加载它们 table . 这是好的方法还是您有更简单的方法?。另一点是,如何在填充时不与 FK 约束斗争?

非常感谢您的回答。我意识到这是非常 "methodological" 的问题,但我找不到任何 tutorial/thread 相关的

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

例如,一个严肃的 relational database, such as Postgres 将提供用于填充大型数据库的功能。

批量加载

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

在 Postgres 中,这将是 COPY 命令。

暂时禁用referential-integrity

查找将执行外键关系规则推迟到加载数据之后的命令。

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

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

其他问题

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

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

数据库迁移

顺便说一句,您可能会发现数据库迁移工具有助于创建 table 和列,并且可能有助于加载数据。考虑 Flyway or Liquibase.

等工具