处理一对多关系更新的最佳方式



给定下面的两个表,每个球可以有一种或多种颜色。在UI中进行更改时,更新ball_color_mapping表的最有效方法是什么?

例如,ball_id = 1具有1,2,3color_ids,并且在更新之后应该仅具有color_id = 2

我看到的可能选项:

  1. 删除所有与ball_id匹配的行,然后插入新值
  2. 获取现有的color_ids,比较新值和旧值并删除/插入

选项1看起来是最简单的,但如果数据没有更改,也会导致删除和插入。选项2将增加更多的操作和复杂性,因为数据需要提取,然后根据标准删除,并插入新值(3个操作+逻辑与2个操作(

对于其他遇到这种情况的人来说,哪种选择更有效,有更好的方法吗?

球台:

brand_id1<1>
ball_id 名称
1 网球
2 台球 2
3 乒乓球

我会这样做:

DELETE FROM ball_color_mapping WHERE ball_id = ? AND color_id NOT IN (?, ?, ?);
INSERT INTO ball_color_mapping VALUES (?, ?), ... 
ON DUPLICATE KEY UPDATE color_id=VALUES(color_id);

它处理从球的颜色集中删除颜色的情况,然后在必要的地方插入,如果颜色已经在数据库中,则执行不操作的UPDATE。

这假设ball_color_mapping中的一对列是其主键,以触发ON DUPLICATE子句。

color_idcolor之间有映射吗?我会考虑去掉它。除非这种"正常化"有一些不言而喻的原因,否则我认为它是"正常化的";过度规范化";。

由于删除和插入任务既简单又快速,而且您将拥有适当的索引(您会的,不是吗?(,所以请选择最简单的方法。这可能总是做这两个步骤:

  1. 删除正在编辑的球的所有颜色
  2. 插入新的一组颜色

您最终将如何处理这些颜色?如果您只需根据请求将它们反序列化,那么它们可以存储在Balls表中的一个简单的VARCHAR(191)列中。如果你需要";查找所有"蓝色"球";,最好是每种颜色有一行。(再说一遍,我建议简单地说"蓝色",而不是color_id。(

如果你不是在谈论一个球上的数百种颜色或数千个球,那么考虑FIND_IN_SET('blue', "red,white,black,blue")类型测试。(这将需要检查所有行,但对于小数据集,这是可以容忍的。(

最新更新