批量插入数据到MySQL父子表的方法与解析

引入

做父子表的架构是为了后续能够有较高的扩张性,维护性,安全性。把公用数据放在父表,再把差异化的数据放在子表,方便后续能够复用父表。
介绍如何快速把数据批量的插入到MySQL父子表中,而且父子表的数据是一一对应的。

难点

批量插入父子表的难点在于,当你拿到一条完整的数据,你要找到一个参数或者一个组合,来确定子表跟父表的对应关系。
而且因为是批量的原因,(以PHP为例)你不能用foreach语句一条一条插入,你要批量批量的插,而批量插入子表的时候,你需要把跟父表对应关系的数据插进来,所以这个对应关系的数据要预先写入。

解决宗旨

  1. 减少SQL运行次数
  2. 解决父子对应关系
  3. 尽量把循环操作放在PHP里做

具体方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                            抽出差异化数据
+--------------------------------------------------------------+
| v
+-------------+ 抽出公用数据 +------------------+ 父表ID +----------+
| TransferArr | -------------->| ParentArr | --------> | ChildArr |
+-------------+ +------------------+ +----------+
^ ^ |
| | |
| SELECT | INSERT & SELECT | INSERT
| v v
+-------------+ +------------------+ +----------+
| 数据来源 | | 父表 | | 子表 |
+-------------+ +------------------+ +----------+

[ 批量插入父子表数据-流程图 ]

(以PHP为例)
看到流程图,流程可以这么操作:

  1. 先从数据源抽出数据(或者你通过其他源头拿到原始数据),确定一个组合或者字段来保证每一条数据是唯一可以找的,然后保存到TransferArr数组中
  2. TransferArr数组中抽出公用数据,保存在ParentArr数组中,把ParentArr数据插入到父表数据表中。
  3. 插入后,通过SELECT从父表中拿出刚刚数据的ID,抽出来。
  4. 然后通过第一步用于确定每一条数据唯一的字段,去用PHP循环,给每一条数据配上数据在父表的ID,外加TransferArr中的差异化数据,组装成ChildArr数组,把数据插入到子表数据表中。
    Done~