维持多对多关系的最佳方式是什么?

时间:2011-08-23 21:16:08

标签: php mysql codeigniter

我有一个tasks的集合,可以分配给任意数量的users。我正在使用assignments表来维护多对多关系:

tasks
- id
- title
- description
users
- id
- name
- email
assignments
- user_id
- task_id

每次更新任务时,我都会处理这样的任务......

function update_assignees($task_id, $user_ids)
{
    $this->db->where('task_id', $task_id);
    $this->db->delete('assignments');

    foreach ($user_ids as $new_id)
    {       
        $this->db->insert('assignments', array(
            'task_id'   => $task_id,
            'user_id'   => $new_id
        ));
    }
}

似乎我可以搜索和更新现有的assignments行,而不仅仅是删除和重新插入。另一方面,它也需要更多的查询,因此可能更昂贵。是一个比另一个好,还是我错过了一些更基本的东西?

4 个答案:

答案 0 :(得分:3)

最简单的方法是启动一个事务,删除旧的m:n关系,然后插入新的关系。

否则你会陷入设置操作以找出改变的内容,并最终删除/插入一堆记录。无论哪种方式,您至少有两个查询:删除旧记录,插入新记录。将它作为一个核心所有/重建所有序列可以节省计算开销,除非你处理“很多”关系,否则开销将是最小的。

答案 1 :(得分:2)

确定任何操作是否比另一个操作更昂贵的最佳方法是使用简单的独立应用程序对其进行测试。

另外,我想至少对你的关系和术语发表评论......:

如果确实说一个用户一次只能分配给一个任务,那么你确实拥有一对多的关系。如果是这种情况,除非您计划存储有关这些分配的其他属性(例如分配日期或由用户分配等),否则您不需要该分配表。删除表可能更有助于您可视化您要完成的任务。如果要删除分配表,则可以将task_id添加到users表。

如果可以将单个用户分配给多个任务,则您具有多对多关系,并且需要该分配表。如果是这种情况,我无法确认更新或删除/插入是否更快;再一次,我的建议就是测试它。

答案 2 :(得分:2)

首先,您应该使用此代码的事务。因为如果出现问题,您将丢失所有数据。其次,您应该检查并测量两种变体。

首先看看有必要通过task_id加载数据并仅为非现有用户插入数据,但在这种情况下,您应该删除带有where子句的查询(如user_id1,user_id2等)。此外,如果您的表很大,则需要花费大量时间来加载users_id,并且可能更有效地使用您的删除方法。无论如何,尝试两种解决方案并选择最快。

答案 3 :(得分:0)

除非性能有问题,否则应始终使用最简单的解决方案。