我有一個名單/單詞塊列表,有大約500,000多個條目。數據的使用是爲了防止人們輸入這些詞作爲他們的用戶名或姓名。表結構很簡單:word_id, word, create_date
。實施用戶名黑名單
當用戶單擊提交時,我希望系統查找輸入的名稱是完全匹配還是word%
匹配。
這是實現塊的唯一方法還是有更好的方法?我不喜歡在提交中查找這麼多行的想法,因爲它會減慢提交過程。
我有一個名單/單詞塊列表,有大約500,000多個條目。數據的使用是爲了防止人們輸入這些詞作爲他們的用戶名或姓名。表結構很簡單:word_id, word, create_date
。實施用戶名黑名單
當用戶單擊提交時,我希望系統查找輸入的名稱是完全匹配還是word%
匹配。
這是實現塊的唯一方法還是有更好的方法?我不喜歡在提交中查找這麼多行的想法,因爲它會減慢提交過程。
考慮幾點:
保持你的黑名單(業務邏輯)在應用程序檢查,並執行應用程序的比較。這就是它最重要的地方,你可能會有更豐富的編程語言來實現這個邏輯。
將您的50萬條記錄加載到您的應用程序中,並將其存儲在某種緩存中。在每次註冊時,請對照緩存執行檢查。這將避免在每次註冊時擊中你的表格。它將全部在你的應用程序的內存中,並且性能會更好。
確保myEnteredUserName
在開始,結束和其他任何地方沒有列入黑名單的單詞。你的問題特別有一個開始檢查,但確保你不會錯過123_BadWord999
。
緩存帶來了自己的一套新的挑戰;考慮每天n分鐘從數據庫重新加載,或者在特定的時間或事件。這將允許加載新的黑名單,舊的將被拋出。
我迷失在第1點。黑名單檢查應用程序。與點擊數據庫並執行通配符select sql有什麼不同? – 2011-03-01 01:44:24
@Dirk:你的應用在內存中會有這個黑名單 - 會話狀態或你有什麼。它不需要訪問數據庫,而是需要訪問緩存。每個註冊只需要進入緩存,而不是數據庫。不要使用SQL,而是使用更高級別和更豐富語言的應用程序。 – 2011-03-01 05:42:28
你不能做where 'loginName' = word%
。 %只能用於文字字符串中,而不能用作列數據的一部分。
您需要說where 'logi' = word or 'login' = word or ...
您將登錄名的子字符串與壞字進行比較。您需要測試每個長度介於最短和最長的壞詞之間的子字符串,包括(含)。
請確保您的表的word
列有索引,並查看性能如何。
其他的方法可以做到這將是:
您可以在* blur *而不是* submit *,imo上執行該操作..如果他接受的名稱不被接受,它至少會立即通知用戶,而不會使請求本身變得更慢。 – yoda 2011-03-01 01:28:55
你也可以將這些單詞作爲json(或其他)緩存在一個文件中,這樣就不需要一直執行查詢(儘管對於那些條目數量,我不確定這是否是一個好主意所有) – yoda 2011-03-01 01:31:08