Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何在mysql中插入/更新/删除大型列表?_Mysql_List_Many To Many - Fatal编程技术网

我应该如何在mysql中插入/更新/删除大型列表?

我应该如何在mysql中插入/更新/删除大型列表?,mysql,list,many-to-many,Mysql,List,Many To Many,我正在试图找出处理插入/更新/删除大型列表的最佳方法 具体来说,我的用户需要选择大量的产品列表,他们每天晚上都会收到关于这些产品的报告 为了简化它,这里是数据模型(简单的多对多) 问题是产品是批量选择的,因此如果用户单击全选(他们经常这样做),他们将选择大约6000个产品,这相当于一个大型插入查询 此外,他们可以根据一系列不同的标准更新和删除这些列表,例如它们属于什么类别、价格点等 每次他们想要更新他们的列表时,我必须检索他们选择的产品,删除他们取消选择的产品,然后插入任何新产品 这个过程看起来

我正在试图找出处理插入/更新/删除大型列表的最佳方法

具体来说,我的用户需要选择大量的产品列表,他们每天晚上都会收到关于这些产品的报告

为了简化它,这里是数据模型(简单的多对多)

问题是产品是批量选择的,因此如果用户单击全选(他们经常这样做),他们将选择大约6000个产品,这相当于一个大型插入查询

此外,他们可以根据一系列不同的标准更新和删除这些列表,例如它们属于什么类别、价格点等

每次他们想要更新他们的列表时,我必须检索他们选择的产品,删除他们取消选择的产品,然后插入任何新产品

这个过程看起来很麻烦,我想知道是否有更好的解决方案

我考虑不存储用户想要的产品,而是只存储用户不想要的产品,从而限制频繁的大型插入/更新查询的开销。 这样,默认情况下,每个用户都可以获得所有可用的产品

该解决方案的问题是,当新项目到达时,用户可能不希望报告中包含这些项目,因此我必须维护一个单独的表,其中规定默认项目是什么

非常感谢能帮助我的人


编辑:只是为了澄清,用户不限于选择标准。他们还可以直接选择产品和产品组。用户的独特之处在于他们都非常熟悉产品(几乎所有6000种产品中,大多数都知道)

另一种可能是对用户产品表进行分区。MySQL 5.1增加了表分区支持:

每次他们想要更新他们的列表时,我必须检索他们选择的产品,删除他们取消选择的产品,然后插入任何新产品


我想指出的是,我认为最终会发生的是,实际数据将分散在整个存储空间中,因为您不会删除所有内容,然后重新添加。优化器可能会发现,使用索引进行全扫描比随机搜索更有效。但我不确定这一点。

您可能希望尝试存储选择标准,而不是产品本身。例如,存储“价格<10且类别=‘运动’”,而不是存储符合这些标准的产品(可能很长)列表。然后,您可以通过将选择条件应用于当前产品列表来重新创建列表

您必须弄清楚应该使用什么语法来存储条件。也许SQL会起作用,也许你会想要别的东西。修改可能很棘手,您需要强制执行一些简单的逻辑来缓解这种情况,例如,标准必须是简单字段/值比较的OR


这种方法的问题在于,您需要将用户限制在特定的选择标准上,如果您不小心,这可能会造成很大的麻烦(许多用户要求您实现他们自己的定制标准)。我不确定我会向大家推荐这个方法,但这是另一个选择。

< P>你可以在你的关联表中添加一个额外的<代码> RePotox < <代码> >列吗?然后,该表中的行将或多或少保持静态,当用户主动更改条件时,您只需更新单个行和一批行。

这需要使用动态SQL来使用选择条件,如果产品/etc添加超出该限制,则风险很大。如果客户购买了特定的产品,也会非常痛苦地进行检索……我会考虑这种方法,但用户的选择不仅仅基于标准。他们还可以按产品ID选择单个产品。您的标准之一可以是“productId=”。你只是希望用户只选择少数几种产品,而不是全部6000.OMG,你是对的,如果你需要查找哪些用户选择了特定的产品,那么这将不起作用。对不起,我没有完全理解。你是建议我创建第三列来指定是否包含该项目吗?@Bill H:是的,这正是我的建议。
~ 5000 records total
+----------+------------+
| user_id  | user_name  |
+----------+------------+
|        1 | Ralph      |
|        2 | Bill       |
|        3 | Joe        |
|        4 | Mike       |
|        5 | Brian      |
|        6 | Jose       |
+----------+------------+

~ 6000 records total
+------------+------------+
| product_id |   product  |
+------------+------------+
|          1 | Widget A   |
|          2 | Widget B   |
|          3 | Widget C   |
|          4 | Widget D   |
|          5 | Widget E   |
|          6 | Widget F   |
+------------+------------+

As many as 30 million total
+----------+------------+
| user_id  | product_id |
+----------+------------+
|        1 |          1 |
|        1 |          4 |
|        1 |          6 |
|        2 |          2 |
|        2 |          4 |
|        2 |          5 |
+----------+------------+