2010-01-19 41 views
0

這裏是我的PHP應用程序所需的流量(是的,它是模糊的,但它更容易這樣):如何檢查多對多集合的唯一性?

  1. 用戶提交一組,讓我們說,受整數ID約5的對象。 (它會更像15,但爲了方便起見,我們假設爲5)
  2. 應用程序檢查此集合是否已提交,並將其保存在MySQL數據庫中(如果不存在)
  3. 應用程序將這些對象保存在數據庫中如果他們沒有被保存前

(對象和集合是多到很多,所以有一個對象表,集合表,並與這兩個表。)

一情侶樣品流量:


  1. 用戶提交111,112,113,114
  2. 這套是新的!收藏已保存。
  3. 我們已經看到對象111和112,但是獲取並保存113和114的數據,因爲我們沒有。

  1. 另一個用戶提交111,112,113,114
  2. 之前我們已經看到了這個集合。不要打擾儲蓄。
  3. 既然我們已經看到了這個集合,我們很明顯看到了這些對象。不要打擾儲蓄。

步驟1和3是簡單的。第2步是我不知道如何繼續。看起來不必要的數據庫繁重的是要查詢包含這些確切ID的集合的關係,所以我即將發佈一些明顯的解決方案,例如簡單的ID列表和散列,但我也想知道是否還有更多理想的解決方案。

謝謝!

回答

0

一個明顯的解決方案是在集合的數據庫行中保存一個兒童ID列表,例如1111,1112,1113,1114,1115。它快速,簡單,並且保證了唯一性,但是我認爲,比較這樣的列表將會帶來不必要的CPU負擔,特別是如果它們變長了,更不用說在存儲空間中存在大量的重複。

0

另一個明顯的答案是採取相同的連接字符串並採取MD5哈希 - 快速和容易,但運行碰撞(授予,小)的風險。即使我可以很容易地通過不哈希來保證不會發生碰撞,那麼哈希是否值得使用較短字符串的本質?

0

在我的申請,我會做到這一步:

  1. 用戶提交後,並輸入到數據庫之前,我會在數據庫中的數據提取到一個數組。在你上面的例子中,我將有$collection = array('111', '112', '113', '114');
  2. 我將在兩個步驟中檢查新的用戶輸入。第一步是查看它是否已經存在於數據庫中。如果不是,則插入。否則,忽略:

    foreach ($inputs as $input) 
    { 
        if (! in_array($input, $collection)) 
        { 
        //do insert here 
        } 
    }

然後在第二循環中,我這樣做是在倒車時,刪除沒有被用戶選擇的數據。

foreach ($collection as $data) 
{ 
    if (! in_array($data, $inputs)) 
    { 
    //do delete here 
    } 
}

對於您的情況,您可能需要也可能不需要第二個循環。我需要這個,因爲我作爲複選框的輸入,用戶可以選擇激活/停用,因此我把它翻譯爲插入和刪除。

相關問題