Php 导入数据时防止无产品在线购物

Php 导入数据时防止无产品在线购物,php,postgresql,database-design,pdo,Php,Postgresql,Database Design,Pdo,在我的网站上,几个供应商可以导入他们的文章 我想让他们选择清理他们的文章(例如,删除不在importfile中的文章) 我想到的第一件事是在导入之前先删除供应商的所有文章,但是这可能会导致客户访问该站点,并且没有看到(特定供应商的)任何产品的情况 因此,经过进一步思考,我想出了另外两个解决方案: 导入产品并记住导入/更新了哪些产品(如果已经存在),然后删除导入后不在导入中的供应商产品 导入另一个临时表中的产品,删除供应商的当前产品,然后将临时表中的产品复制到“真实”表中 但是,这两种选择都可能存

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

我想让他们选择清理他们的文章(例如,删除不在importfile中的文章)

我想到的第一件事是在导入之前先删除供应商的所有文章,但是这可能会导致客户访问该站点,并且没有看到(特定供应商的)任何产品的情况

因此,经过进一步思考,我想出了另外两个解决方案:

  • 导入产品并记住导入/更新了哪些产品(如果已经存在),然后删除导入后不在导入中的供应商产品
  • 导入另一个临时表中的产品,删除供应商的当前产品,然后将临时表中的产品复制到“真实”表中
  • 但是,这两种选择都可能存在一些问题

  • 比如说,记住所有进口/更新的产品真的是一个好主意吗?因为有时它可以超过100万个产品
  • 是否有可能删除当前产品并将产品从临时表复制到真实表?速度是否会如此之快,以至于来访的客户几乎看不到任何产品
  • 也许我想出的选择还有其他问题

    或者,也许还有其他一些方法可以做到这一点

    PS


    “锁定”网站/在导入时锁定客户不是一个选项。

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

  • 导入时启动“维护模式”,但这可能不是您想要的。对不起,我没读你上次的声明
  • 一个接一个地导入(或删除)这些项目,因为这样用户在任何给定时刻最多会丢失一个产品。不过,这里有两个值得考虑的注意事项:
    • 如果产品在用户购物篮中被删除,会发生什么情况
    • 已经购买的产品中的引用需要保持完整,以便能够在所购买的产品被删除后重建账单
  • 此外,您还可以在PostreSQL中重命名表,如下所示:

    ALTER TABLE TableB RENAME TO TableC;
    

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

    我对您建议的方法有不同的看法:
    有一个名为vendortables setup的表,其中包含vendorname或id列以及列出其产品的表的名称。 当供应商想要导入时,为输入创建一个新表(可能是vendorname+upload start time)。将所有数据上传到其中。完成后,获取当前供应商表的名称(在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 ask
    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);
    

    该商店有多少并发用户?@Lawrence Cherone:如何防止客户看到没有产品的商店,并让供应商删除其过时的产品products@RichardH:大约5万左右,我真的很想阻止第一种选择。第二个选项没有考虑应该删除哪些产品。另外,我不认为我可以直接重命名临时表,因为“real”表还包含其他供应商的产品。如果重命名,您将如何删除旧表?它不需要事先删除吗?@PhpMyCoder:你“把它们换掉”。TableA->TableA\u Old;TableA_New->TableA@PeeHaa:您可以事先创建一个表的副本,然后进行所有导入,并将其交换,但我知道,对于大型表来说,这可能不是可行的解决方案。但我真的不明白删除产品的问题是什么。如果您从表中动态删除一个产品,最坏的情况是用户将在其所访问的产品页面上看到404错误。当然,只有在您将产品复制到购物车/发票的情况下,才能动态删除产品,否则您将破坏所有现有的引用。@x3ro-Oh。我不熟悉这个。你的解决方案可能会更好+1.