Php 导入数据时防止无产品在线购物
在我的网站上,几个供应商可以导入他们的文章 我想让他们选择清理他们的文章(例如,删除不在importfile中的文章) 我想到的第一件事是在导入之前先删除供应商的所有文章,但是这可能会导致客户访问该站点,并且没有看到(特定供应商的)任何产品的情况 因此,经过进一步思考,我想出了另外两个解决方案:Php 导入数据时防止无产品在线购物,php,postgresql,database-design,pdo,Php,Postgresql,Database Design,Pdo,在我的网站上,几个供应商可以导入他们的文章 我想让他们选择清理他们的文章(例如,删除不在importfile中的文章) 我想到的第一件事是在导入之前先删除供应商的所有文章,但是这可能会导致客户访问该站点,并且没有看到(特定供应商的)任何产品的情况 因此,经过进一步思考,我想出了另外两个解决方案: 导入产品并记住导入/更新了哪些产品(如果已经存在),然后删除导入后不在导入中的供应商产品 导入另一个临时表中的产品,删除供应商的当前产品,然后将临时表中的产品复制到“真实”表中 但是,这两种选择都可能存
“锁定”网站/在导入时锁定客户不是一个选项。当我阅读您的问题时,我想到了两个解决方案:
- 如果产品在用户购物篮中被删除,会发生什么情况
- 已经购买的产品中的引用需要保持完整,以便能够在所购买的产品被删除后重建账单
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 askvendortables
查询负责显示供应商产品的表的名称
此外,由于您提到了站点的高使用率,您是否考虑过缓存可能会使导入期间的请求变得非常不可能。创建一个删除表
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.