如何首次填充具有多个表的 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.
等工具
我有一个关于如何第一次填充数据库的方法的一般性问题。实际上,我在 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.
等工具