在导入数据时防止没有产品的在线商店

时间:2011-07-30 12:56:36

标签: php postgresql database-design pdo

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

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

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

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

  1. 导入产品并记住导入/更新的产品(如果已存在)并删除之后未在导入中的供应商产品
  2. 将产品导入另一个临时表,删除供应商的当前产品,然后将临时表中的产品复制到“真实”表中。
  3. 但是这两个选项可能存在一些问题。

    1. 让我们说记住所有导入/更新的产品确实是一个好主意,因为有时它可能是> 100万产品?
    2. 是否可以删除当前产品并将临时表中的产品复制到真实表中的速度非常快,以至于访客不会看到任何产品的可能性很小?
    3. 也许我想出的选项还有更多问题。

      或许还有其他选择可以做到这一点?

      PS

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

3 个答案:

答案 0 :(得分:2)

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

  1. 导入时启动“维护模式”,但这可能不是您想要的。抱歉没有读到您的上一个声明。
  2. 逐个导入(或删除)项目,因为在任何给定时刻,用户最多只能丢失一个产品。但是,这里有一些需要考虑的注意事项:
    • 如果产品在用户购物篮内被删除会怎样?
    • 已购买的参考文件需要保持不变,以便在购买的产品被删除后能够重建帐单。
  3. 此外,您可以在PostreSQL中重命名表格,如下所示:

    ALTER TABLE TableB RENAME TO TableC;
    

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

答案 1 :(得分:1)

我对您建议的方法有所不同:
有一个名为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询问负责显示供应商产品的表的名称。

此外,由于您提到您的网站使用率很高,您是否认为缓存可能会导致导入过程中的请求非常不可能。

答案 2 :(得分:0)

制作删除表

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);