我有一個Sqlite3表,它將有數千到數百萬條記錄。
對于每個網站用戶,都會創建一個ID并保存在資料庫中。這個ID被發送到客戶端,然后客戶端將一些資料連同這個ID一起發回給服務器(用XHRHttpRequest)。
如果我使用
CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, ...)那么客戶端將能夠在HTML/JS中看到這個ID。問題:客戶端可以看到當前的ID,知道有多少條記錄被處理,猜測以前用戶的ID,等等。這必須避免。如果我使用
CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, ...),我也可以向客戶端發送h = mycrypt(id, salt),而不是id。但是,當資料從客戶端回來時(包括h),我們必須要做的是:UPDATE FROM mytable ... WHERE mycrypt(id, salt) = h。這最后一個查詢意味著我們必須將
mycrypt應用于每一行(即FULL SCAN!)以找到正確的行。如果該表有大量的行,這將是非常耗時的。當然,我們可以在mycrypt(id, salt)上創建一個索引,但是這將意味著有兩個索引(一個用于id,一個用于加密的id),而這是不理想的:我們最終會有兩個索引,而只需一個索引就可以了。另外,我們能否創建一個隨機的ID,作為
PRIMARY KEY?你會怎么做呢?事實上,它沒有被排序,這肯定會影響性能,是否有一個著名的方法來處理這個問題?
更廣泛地說,如何處理給客戶一個ID的問題,最好是不增加1、2、3、4、5......,但仍然有一個快速查找服務器端?
uj5u.com熱心網友回復:
我認為如果你能加密一個id,那么你可以解密到......
UPDATE FROM mytable ... WHERE id = decrypt(h, salt) 。
但更好的解決方案是隨機id。
我在我的應用程式中制作了一個UUID,并將其發送到資料庫。然后ID列就不是AUTOINCREMENT了。
很多語言都支持UUID。(C,Java,PHP) 如果你有更多的應用服務器或資料庫服務器,UUID是唯一的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/322130.html
標籤:
