2013-05-07 54 views
0

如果在一個站點中每個用戶可以輸入一個逗號分隔的,他們在輸入的產品清單(從預先確定的名單!),我們應該如何存儲列表中的MySQL的每個用戶,以便項目能在用戶間使用相同的項目進行匹配?如何在MySQL中存儲每個用戶的項目列表?

1)我知道我們不應該在DB中存儲以逗號分隔的字符串作爲VARCHAR,所以它應該如何存儲?應的新表ItemsList被創建,其中每行是一個UserID -> ItemName(例如,如果用戶ID 進入「相配,槍,酒精」,我們將增加3行ItemsList作爲101 -> 'Matches', 101 -> Gun, 101 -> Alcohol)?

2)如果是的話,應該用什麼PRIMARY KEY該表?

3)什麼indexes應設置爲使雙方的檢索和儘可能快的項目匹配?

4)最後,應該用什麼查詢,找出所有有共同的至少一個項目與其他用戶的用戶?

+0

我想在你擔心數據庫模式之前,你還有幾個問題要問自己。自由形式提交真的是最好的選擇嗎?如果是的話,那麼你將如何執行數據清理(即,讓不同的用戶不要放入槍,槍,槍,槍,槍等等,這些可能是邏輯匹配但不是字符串匹配)。如果您不打算強制執行數據清理,您打算如何匹配近似匹配的內容? – 2013-05-07 15:43:20

+0

@MikeBrant:我打算進行消毒,將所有的小寫字母都做成小寫,然後製作每個單詞大寫的第一個字母,然後用逗號分解列表,然後在將這些空格存儲在數據庫中之前修剪兩端的空格。這就是說,我想不出任何簡單的方法來匹配單數與複數...... – ProgrammerGirl 2013-05-07 15:59:47

回答

0

您可以將輸入作爲JSON字符串存儲在表格中的TEXT列中嗎?這樣,只要用戶需要添加新項目,您就可以檢索並顯示/更新JSON字符串。在此過程中,您不會爲每個輸入創建一個新行。這種情況下的主鍵將是用戶標識,因爲PK已經是索引,所以您不需要創建其他索引。

由於輸入將是逗號分隔的,你會做一個逗號分割成一個列表,然後序列化列表作爲JSON對象(那麼DB存儲)。

+0

在一行中存儲非標量數據(如JSON)是非常糟糕的*練習。你將如何檢索具有一個「項目」共同的用戶? – RandomSeed 2013-05-07 15:49:18

+0

可查詢緩存層(例如Couchbase)將允許您查找公用鍵/值。在我看來,這個問題的根源在於讓用戶輸入以逗號分隔的值。 – 2013-05-07 15:55:40

+0

@RyanMendoza:你說過「*這個問題的根源在於讓用戶輸入以逗號分隔的值,以我的觀點開頭*」。考慮到沒有預先確定的列表,你會如何推薦他們輸入項目,因爲他們可以輸入任何他們想要的東西? – ProgrammerGirl 2013-05-07 16:00:56

0
  1. 是的。

  2. 假設表ItemsList具有兩列UserIDItemName,主鍵應該是(UserID, ItemName)(兩列)

  3. 除了主鍵上ItemName添加索引。

  4. 你問得有點太多。請建立你的最終表格結構,嘗試一些東西,然後回來一些你已經嘗試過的代碼。

+0

如何在2個不同的列上設置主鍵?這是如何工作的,它實際上包含什麼價值?如果用戶兩次輸入相同的項目會發生什麼(我假設這將被主鍵禁用,那麼這意味着我們需要在插入之前刪除重複項)? – ProgrammerGirl 2013-05-07 15:57:17

+0

1. [見這裏](http://dev.mysql.com/doc/refman/5.6/en/alter-table.html)。 2.你真的想讓同一個物品兩次? – RandomSeed 2013-05-07 16:03:34

+0

不,我不這樣做,但是我不希望用戶在遇到數據庫錯誤的情況下也收到數據庫錯誤,這就是爲什麼我詢問在插入前是否必須刪除任何重複項的原因,如果我們在2不同的列(我認爲我們會這樣做)。我從來沒有在兩列上使用主鍵,所以我不熟悉它們的工作方式。 – ProgrammerGirl 2013-05-07 16:07:45

相關問題