2010-04-13 41 views
0

我需要跟蹤數據庫中特定項目上的「點擊次數」。 事情是,「命中」應該保持唯一與用戶ID,所以如果用戶點擊該項目3次,它應該仍然計爲1命中。SQL模型優化問題

此外,我需要顯示總數對特定物品的點擊次數。

是否有更好的方法比單獨的表中存儲每個用戶每個項目的每個匹配項?將用戶標識保存在一個由逗號分隔的字符串中是一種更好且有效的方式?

回答

1

不,保留以逗號分隔的數據庫中的信息是差不多永遠不會更好,並且幾乎總是比備選方案差很多很多。

你是否需要保持每個單獨的命中(是否有附加的信息),或者只是每個用戶的計數?如果第一個爲true,則使用帶有thing_id和user_id列的表(加上適用於「hit」的其他屬性的列)。如果第二個是真實的,使用一個表thing_id,USER_ID和hit_count列,並使用UPDATE命令,如:

UPDATE hit_count_table SET hit_count = hit_count + 1 
    WHERE user_id = :userid AND thing_id = :thingid; 
+0

好吧其實我並不需要跟蹤「的總點擊量」,只有「通過用戶唯一命中」,所以我想這它會只是一個表thing_id和user_id ..每個命中將不得不「插入命中」和「失敗優雅,如果已經存在」我想:)謝謝 – mrmuggles 2010-04-13 01:40:55

+0

我覺得supermogx希望「唯一訪問者數」而不是「每用戶點擊數」,這就是你用那個UPDATE語句記錄的內容。 – benzado 2010-04-13 01:41:27

+0

@benzado:exactly;) – mrmuggles 2010-04-13 01:56:24

0

如果你有一個項目的一組號碼,且數量少,你很可能得到爲每件商品保留一個單獨的「Hit」表。

如果您有很多項目(或無限數量的項目),我可能只有一個表來跟蹤所有項目的點擊次數。如果最終獲得大量的記錄,則可能需要重新考慮設計,以便快速查找用戶,並決定是否需要插入熱門記錄。

總的來說,你有幾個選擇,他們都有性能和便利的折衷。我只是選擇一個你喜歡的,並與它一起去。你會發現什麼是好的和壞的,你可以把它記錄下來體驗!

你不應該把東西作爲「CSV」字符串存儲在數據庫中 - 這是一個完整的查詢噩夢。

1

用列thing_id和user_id創建一個新表hits。在thing_id和user_id上添加一個UNIQUE索引。然後,你可以用這個查詢更新表:

INSERT INTO hits (user_id, thing_id) VALUES (?, ?) 

因爲索引,即要麼添加行或什麼也不做(如果你可以,你應該指定ON CONFLICT IGNORE或同等學歷,當你定義表,這將避免錯誤)。你可以使用此查詢的命中次數:

SELECT COUNT(*) FROM hits WHERE thing_id = ?