2011-07-30 19 views
1

在我的網站上,幾個供應商可以導入他們的文章。防止在導入數據時沒有產品的在線商店

我想讓他們選擇清理他們的文章(例如刪除不在導入文件中的文章)。

我首先想到的是在導入之前先刪除供應商的所有文章,但這可能會導致客戶訪問該網站並且看不到任何產品(特定供應商的產品) )。

所以經過一些更多的思考,我想出了其他兩種解決方案:

  1. 進口產品,並記住產品是進口/更新(如果它們已經存在)什麼,並刪除供應商的產品,之後沒有進口
  2. 將產品導入另一個臨時表中,刪除供應商的當前產品,然後將臨時表中的產品複製到「真實」表中。

但是,這兩種選擇都可能存在一些問題。

  1. 讓我們假設記住所有導入/更新的產品真的是一個好主意,因爲有時它可能會超過100萬個產品?
  2. 是否有可能刪除當前產品並將產品從臨時表複製到實際表中的速度如此之快以至於訪問客戶不會看到任何產品的可能性很小?

也許我想到的選項還有更多問題。

或者還有其他一些選擇可以做到這一點?

PS

「鎖定」的網站/鎖定了客戶在導入是不是一種選擇。

+0

有啥問題? –

+0

店鋪有多少個併發用戶? –

+0

@勞倫斯Cherone:有什麼辦法可以防止顧客看到沒有產品的商店,也可以讓供應商刪除他們過時的產品 – PeeHaa

回答

2

當我看到你的問題,兩種解決方案來到我的腦海:

  1. 火了「維護模式」,而導入,但是那可能不是你想要的。抱歉沒有讀你最後的聲明。
  2. 逐個導入(或刪除)項目,因爲這樣用戶在任何給定時刻最多隻會丟失一個產品。雖然有幾個注意事項需要考慮:
    • 如果產品在用戶購物籃內時被刪除,會發生什麼情況?
    • 已完成購買的參考文獻需要保持不變,以便在購買產品被刪除後能夠重建賬單。

此外,您還可以像這樣PostreSQL重命名錶:

ALTER TABLE TableB RENAME TO TableC; 

如果你想要去與你的「臨時表」的解決方案,我也都用過,但下無可否認,情況要少得多。但是請注意,至少在MySQL InnoDB中,您必須擔心外鍵,如果重命名,外鍵仍將指向舊錶。如果有一個從TableA到TableB的外鍵,並且您將TableB重命名爲TableB_old並將TableB_new重命名爲TableB,則外鍵將指向TableB_old。不過,我不知道PostgreSQL的情況是否如此。

+0

我真的想阻止第一種選擇。第二個選項沒有考慮應該刪除哪些產品。另外,不要以爲我可以重命名臨時表,因爲'真正'表也包含其他供應商的產品。 – PeeHaa

+0

如果您重命名,您將如何刪除舊錶格?是不是必須事先刪除? –

+0

@PhpMyCoder:你「交換出來」。表A - > TableA_Old; TableA_New - > TableA; – fresskoma

1

我有一個變化對你的建議的方法:
有一個表叫vendortables設置有用於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問vendortables爲負責顯示供應商的產品表的名稱。

另外,既然您提到了您的網站的高使用率,您是否認爲緩存可能會在導入時請求的可能性很小。

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); 
相關問題