Php 数据库中的递归存储

Php 数据库中的递归存储,php,database,recursion,Php,Database,Recursion,概述: 在使用Slim 3的每个项目中,我都在创建一个适合我需要的仪表板框架。我想要实现的特性之一是工作台特性。它可以使用用户可以包含的小部件创建多个工作台。(统计、单个数据[计数]、表格数据等) 数据库表结构: 用户_工作台_id=主键|自动递增 用户id=连接到系统用户的外键(用户表) 工作台id=用户id中唯一的工作台标识符(意味着两个不同的用户可以有相同的工作台id,但单个用户不能有相同的多个工作台id) 工作台\u父级\u id=工作台\u id的父级id 布局类型=工作台布局类型

概述:

在使用Slim 3的每个项目中,我都在创建一个适合我需要的仪表板框架。我想要实现的特性之一是工作台特性。它可以使用用户可以包含的小部件创建多个工作台。(统计、单个数据[计数]、表格数据等)

数据库表结构:

  • 用户_工作台_id=主键|自动递增
  • 用户id=连接到系统用户的外键(用户表)
  • 工作台id=用户id中唯一的工作台标识符(意味着两个不同的用户可以有相同的工作台id,但单个用户不能有相同的多个工作台id)
  • 工作台\u父级\u id=工作台\u id的父级id
  • 布局类型=工作台布局类型。参数:空白/空、水平拆分、垂直拆分、栅格
前端视图:

要生成递归数据,必须至少有两个工作台

说了这么多,我想给大家一个关于如何利用用户体验生成数据的概述。我还担心数据以某种方式保存或删除的速度

现在,为了将工作台存储在我的数据库中,我将向我的控制器调用一个方法

public function saveWorkBench($request, $response, $args, $workbench_parent_id = 0, $workbenches = []) {

    if ($workbench_parent_id == 0 && empty($workbenches)) {
        $this->auth->user()->userWorkbench()->delete();
        $workbenches = $request->getParam('workbenches');
    }

    foreach ($workbenches as $workbench) {

        $this->auth->user()->userWorkbench()->create([
            'workbench_id'        => $workbench['workbench_id'],
            'workbench_parent_id' => $workbench_parent_id,
            'layout_type'         => $workbench['layout_type']
        ]);

        if (!empty($workbench['workbenches'])) {
            $this->saveWorkBench($request, $response, $args, $workbench['workbench_id'], $workbench['workbenches']);
        }
    }
}
我在这里做的是每当我保存工作台时。我正在删除所有用户工作台(根据保存/删除工作台的用户截断它)。然后使用递归方法再次循环,以获得用户生成的相同数据

问题是,这是否可以接受?我觉得再次截断和循环是不好的,但是我已经在很多数据中见过这种方法好几次了


如果这是不可接受的,有什么解决方案/建议可以让我这样做吗?我一直在想,我将只更新/删除特定的工作台,但我不知道如何做。

首先,递归调用控制器操作似乎不是一个优雅的解决方案。在单独的模型中移动“保存工作台树”逻辑

其次,就性能而言,最好更新更改,而不是完全删除和重新创建树。但这真的取决于您,主要取决于数据量是否大以及此操作的频率是否高。如果不是,就让它保持原样。“过早优化是万恶之源(c)Donald Knuth”。 还有一件事,确保在单个事务中执行所有DB查询