数据库中的递归保存

时间:2017-03-30 04:00:33

标签: php database recursion

概述:

我已经在每个使用Slim 3的项目中创建了一个适合我需求的仪表板框架。我想要实现的功能之一是工作台功能。这可以创建具有用户可以包括的小部件的多个工作台。 (统计,单数据[计数],表数据等。)

数据库表格结构:

enter image description here

  • user_workbench_id =主键|自动增量
  • user_id =连接到sys_user(用户表)的外键
  • workbench_id =用户ID中的唯一工作台标识符。 (意思是2个不同的用户可以拥有相同的workbench_id,但是单个用户可以拥有相同的多个workbench_id)
  • workbench_parent_id = workbench_id的父ID
  • layout_type =工作台布局类型。参数:blank / null,split-horizo​​ntal,split-vertical,grid

前端视图

enter image description here

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

enter image description here

说了这么多,就是为了让大家了解如何根据用户体验生成数据。我也担心数据的速度会以某种方式被保存或删除。

现在将工作台存储在我的数据库中我正在调用控制器的方法。

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']);
        }
    }
}

我在这里做的就是每当我保存工作台时。我删除了所有用户工作台(按保存/删除工作台的用户截断)。然后使用递归方法再次循环以获取用户生成的相同数据。

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

如果这是不可接受的,那么任何解决方案/建议对我来说都是好方法吗?我一直以为我会更新/删除特定的工作台,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

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

其次,性能方面,更新更改而不是完全删除和重新创建树更好。但它真的取决于你,这主要取决于数据量是否很大以及此操作的频率是否很高。如果不是,请将其保留原样。 "过早的优化是所有邪恶的根源(c)Donald Knuth"。 还有一件事,请确保在单个事务中执行所有数据库查询。