我有一个关于如何第一次填充数据库的一般性问题。实际上,我在r中处理“原始”数据集(我构建的数据框架可以快速工作并提供见解),但现在我需要在关系数据库中构建和加载所有内容。
对于db设计,一切正常(=>概念、逻辑和3nf)。结果是一个相当“复杂”(都是相对的)数据模型,其中有许多连接表和表中的外键。
我的问题是:现在,对我来说,填充这个数据库最简单的方法是什么?
我的方法是从r中的“原始”Dataframe开始为每个表生成一个.csv,然后在db中的每个表中加载它们。这是个好方法还是有更简单的方法。另一点是,如何在填充时不受fk约束的约束?
非常感谢你的回答。我知道这是非常“方法论”的问题,但我找不到任何教程/线程相关
注意:我使用r(dplyr等)和mysql
1条答案
按热度按时间vc6uscn91#
一个严肃的关系数据库,例如postgres,将提供填充大型数据库的特性。
散装货物
查找读入外部数据的命令以加载到具有匹配字段结构的表中。数据直接从操作系统的文件系统文件移动到表中。这比用通常的sql加载单个行要快得多
INSERT
. 这样的命令不是标准化的,所以您必须在特定的数据库引擎中查找专有命令。在博士后,这将是
COPY
命令。临时禁用引用完整性
查找将强制执行外键关系规则推迟到加载数据之后的命令。
在postgres中,使用
SET CONSTRAINTS … DEFERRED
在每个语句期间不检查约束,而是等到事务结束。或者,如果您的数据库缺少这样的功能(作为批量导入例程的一部分),则可以在之前删除约束,然后在之后重新建立约束。但请注意,这可能会影响所有其他数据库连接中的所有其他事务。如果您知道数据库没有其他用户,那么也许这是可行的。
其他问题
有关要考虑的其他问题,请参阅postgres文档中的填充数据库(无论是否使用postgres)。
禁用自动提交
使用
COPY
(用于大规模导入,如上所述)删除索引
删除外键约束(如上所述)
增加
maintenance_work_mem
(更改数据库引擎的内存分配)增加max\u wal\u size(更改数据库引擎的预写日志的配置)
禁用wal存档和流式复制(考虑将数据库的副本移动到Replicat服务器,而不是让复制移动大量数据)
之后运行analyze(提醒数据库引擎调查数据的新状态,以供其查询计划器使用)
数据库迁移
顺便说一下,您可能会发现数据库迁移工具在创建表和列以及加载数据方面很有帮助。考虑flyway或liquibase等工具。