防止网上商店在导入数据时没有产品


Preventing online shop without products while importing data

在我的网站上有几个供应商可以导入他们的文章。

我想给他们一个选项来清理他们的文章(例如删除不在importfile中的文章)。

我想到的第一件事是在导入之前先删除供应商的所有文章,然而这可能会导致客户访问网站时看不到任何(特定供应商的)产品的情况。

所以经过一番思考,我想出了另外两个解决方案:

  1. 导入产品,并记住哪些产品已导入/更新(如果已经存在),并删除之后未在导入中的供应商的产品
  2. 导入另一个临时表中的产品,删除该供应商的当前产品,然后将临时表中的产品复制到'real'表中。

然而,这两个选项都可能存在一些问题。

    我们说记住所有进口/更新的产品真的是个好主意吗?因为有时它可以超过100万种产品。
  1. 是否有可能删除当前产品并将产品从临时表复制到真实表中,速度如此之快,以至于访问的客户只有很小的机会看不到任何产品?

也许我找到的选项还有别的问题。

或者可能有其他的选择来做到这一点?

p>

导入时'锁定'网站/锁定客户是不允许的。

当我读到你的问题时,我想到了两个解决方案:

  1. 在导入时启动"维护模式",但这可能不是你想要的。对不起,我没有读你的最后一份声明。
  2. 逐个导入(或删除)项目,因为这样用户在任何给定的时刻最多会丢失一个产品。不过,这里有几点需要注意:
    • 如果产品在用户购物篮中被删除会发生什么?
    • 已经购买的参考需要保持完整,以便能够在购买的产品被删除后重建账单。

同样,你可以在PostreSQL中像这样重命名一个表:

ALTER TABLE TableB RENAME TO TableC;

如果您想使用"临时表"解决方案,我也使用过,尽管在不那么紧急的情况下,不可否认。但请注意,至少在MySQL InnoDB中,你必须担心外键,如果重命名,它仍然会指向旧表,例如,如果有一个从TableA到TableB的外键,并且你将TableB重命名为TableB_old和TableB_new到TableB,那么外键将指向TableB_old。我不知道PostgreSQL是不是这样

我对你建议的方法有不同的看法:
创建一个名为vendortables的表,其中包含vendorname或id列,以及列出其产品的表名。当供应商想要导入时,为输入创建一个新表(可能是vendorname +上传开始时间)。把所有的数据都上传进去。完成后,获取当前供应商表的名称(在vendortables中)并更新,以便新表的名称与上传供应商相关联。然后删除旧表(在更新之前抓取的)。
这样,就不会复制所有的表数据。

的例子:

SELECT * FROM vendortables
+--+-----+
|id|table|
+--+-----+
|01|test |
+--+-----+
SELECT * FROM test
+--+----+
|id|name|
+--+----+
|01|car |
+--+----+

//Import & upload new data
CREATE TABLE test1 USING('?', 'new car')
SELECT * FROM test1
+--+--------+
|id|name    |
+--+--------+
|01|new car |
+--+--------+
//Phase in new data 
UPDATE vendortables SET table='test1' WHERE id='1'
//Delete old table
DROP TABLE test

让PHP向vendortables询问负责显示供应商产品的表的名称。

另外,既然您提到您的站点使用率很高,您是否考虑过缓存可能会使导入期间的请求变得非常不可能。

创建一个删除表

delete from del_vendor_article where vendorid='vendorid'

对文章更新执行此操作

insert into del_vendor_article SET vendorid='vendorid', article_id='articleid'

可能向他们展示将被删除的内容。然后他们可以删除任何他们想要保留的

SELECT item FROM articles WHERE NOT EXISTS (SELECT * FROM del_vendor_article WHERE articles.articles_id = del_vendor_article.articles_id);

删除未导入项

delete from articles WHERE NOT EXISTS (SELECT * FROM del_vendor_article WHERE articles.articles_id = del_vendor_article.articles_id);