首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在RDBMS中保存具有不同键的嵌套关联数组?

如何在RDBMS中保存具有不同键的嵌套关联数组?
EN

Stack Overflow用户
提问于 2020-06-22 09:24:02
回答 1查看 85关注 0票数 0

我在JSON中有一个响应,它被转换为php中的关联array (Wordpress)。

我想把它保存在不同的table中,这个结构大约有9个层次,每个级别上都有不同的key,尝试用foreach来实现,但是它会导致大约5个嵌套循环得到最深的值。

它是一个相关的结构,因此每个嵌套数组在保存到DB中时都需要从其父数组中提取foreign key

这是一段摘录。

代码语言:javascript
复制
array(
    'data' => array(
        0 => array(
            'p_a' => array(
                1 => array(
                    'child' => array(
                        254 => array(
                            'b_c' => array(
                                'm' => array(
                                    'c' => array(
                                        'USD' => array(
                                            'price' => '0.99',
                                        ),
                                    ),
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

所以每个级别都有多个key,但是我只包含了嵌套的,每个命名的键都可以有多个array'p_a',也可以有多个包含'child' arrayarrays,我不知道像data这样的索引可以从1或0开始,但是不知道它将包含多少个子级。其他嵌套的也是类似的。

我尝试将它们保存在其他array中以简化它,但它仍然使其复杂化,我考虑了recursion,但我认为它会为每个级别创建许多if,因为它们在每个级别上并不相同。

有什么好的data-structure可以将它转换成?我认为树,但每个node是不同的,我不知道任何好的树结构,可以帮助这一点?

编辑,我正在做批量insert,所以我想首先保存父母,然后是孩子,但是如果DFS是唯一的方法,那么也许我会一个接一个地做。

编辑如何从上面的数据中插入行

data

代码语言:javascript
复制
id | attributes ...

p_a

代码语言:javascript
复制
id | data_id | attributes ...

child

代码语言:javascript
复制
id | p_a_id | attributes ...

b_c

代码语言:javascript
复制
id | child_id | attributes ...
EN

回答 1

Stack Overflow用户

发布于 2020-06-22 13:58:28

递归函数如何保存:

代码语言:javascript
复制
function save_recursive(array $array, int $parentId = null)
{
    foreach ($array as $key => $value) {
        echo "Save '$key' key with parent id (if it is not null) and with needed attributes and get the last insert id (it will be parent id for the next item)\n";
        // $parentId = {last_insert_id};
    
        if (is_array($value)) {
            save_recursive($value, $parentId);
        }
    }
}

save_recursive($array);

但在这种情况下,您将无法像一个INSERT语句(大容量)一样,一个接一个地保存它。

替代方案:要执行大容量插入,可以尝试使用以下方案:

  • 从表中获取当前的AUTO_INCREMENT值,并尝试在递归函数中手动增加它,以构建一个插入查询
  • ,使用临时表作为现有表的副本,并将AUTO_INCREMENT设置为实表。在一个查询中将所有项插入没有parentId的临时表中,而在另一个查询中只将数据从临时表插入到实际表中,并添加其他子查询以填充parentId列(因为您知道所有ids)。

但在此之前,必须对其他案件进行检查。也许它们不如一个接一个的插入更有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62511226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档