在我的网站上有几个供应商可以导入他们的文章。
我想给他们一个选项来清理他们的文章(例如删除不在importfile中的文章)。
我想到的第一件事是在导入之前先删除供应商的所有文章,然而这可能会导致客户访问网站时看不到任何(特定供应商的)产品的情况。
所以经过一番思考,我想出了另外两个解决方案:
- 导入产品,并记住哪些产品已导入/更新(如果已经存在),并删除之后未在导入中的供应商的产品
- 导入另一个临时表中的产品,删除该供应商的当前产品,然后将临时表中的产品复制到'real'表中。
然而,这两个选项都可能存在一些问题。
- 我们说记住所有进口/更新的产品真的是个好主意吗?因为有时它可以超过100万种产品。
- 是否有可能删除当前产品并将产品从临时表复制到真实表中,速度如此之快,以至于访问的客户只有很小的机会看不到任何产品?
也许我找到的选项还有别的问题。
或者可能有其他的选择来做到这一点?
p>
导入时'锁定'网站/锁定客户是不允许的。当我读到你的问题时,我想到了两个解决方案:
- 逐个导入(或删除)项目,因为这样用户在任何给定的时刻最多会丢失一个产品。不过,这里有几点需要注意:
- 如果产品在用户购物篮中被删除会发生什么?
- 已经购买的参考需要保持完整,以便能够在购买的产品被删除后重建账单。
同样,你可以在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);