java - 使用 JDBC 批量插入具有外键的多个表
问题描述
我正在编写一个接收树结构并将其插入数据库的方法,其中每个分支都是另一个数据库表。例如:
tree = {
"_id": "111",
"field1": "",
"field2": "",
"field3": {
"_id": "333",
"_parent_id": "111",
"field3_1": "",
"field3_2": "",
"field3_3": [
{
"_id": "1",
"_parent_id": "333",
"field3_3_1": ""
},
{
"_id": "2",
"_parent_id": "333",
"field3_3_1": ""
},
{
"_id": "3",
"_parent_id": "333",
"field3_3_1": ""
}
]
}
}
应对应于 3 个表:tree、field3 和 field3_3 - 与 _id 和 _parent_id 有关系。每个分支可以是单个值、表或对象,基本上树是对应于 PostgreSQL 数据库中某些数据结构的动态结构。我正在使用 jdbc 将数据插入数据库。当用户可能会提供具有多个分支或多个分支值的大树时,插入此类数据的最佳方法是什么?我在想这样的声明:
with first_insert as(
insert into sample(firstname, lastname)
values('fai55', 'shaggk')
RETURNING id
),
second_insert as(
insert into sample1(id, adddetails)
values
((select id from first_insert), 'ss')
RETURNING user_id
)
但是如果内部插入应该在大批量记录上工作(field3_3 将包含每个数据行的 100k 条记录),问题就会出现。
我已经使用 PreparedStatement 和 executeBatch() 在单个数据库级别实现了接受表和插入的方法,并且效果很好。像这种方法一样,可用于树木吗?
解决方案
我已经通过以下方式解决了这个问题:我从树的一层中获取元素,并将其所有非对象值插入到preparedStatement 批处理中(它们在一个表中),返回插入的记录ID。然后我获取每个插入元素的子元素,分配正确的 parent_id 并将它们批量插入另一个表和另一个表。效果很好!
推荐阅读
- google-app-maker - 重复条目唯一键....我的错误捕获失败
- node.js - 从控制器填写日历
- phaser-framework - 向场景添加补间但不立即播放
- flutter - 对象属性可以用作函数参数吗?
- python - 如何遍历数据框
- ios - 我在 UICollectionViewController 中的单元格消失了
- java - 如何在java中按字符串的数据类型拆分字符串?
- amazon-web-services - 无法创建 CloudFormation 堆栈
- ios - 在运行主要目标 Xcode 之前构建所有框架
- ansible - 列出将被“yum autoremove”删除的包?