比方說,我有這樣的數據結構 type User struct { UUid string Username string Email String Password string FirstName string LastName string}我將 Users []User 存儲到 levelDB 中的鍵/值數據庫中。唯一鍵將是 UUid,然后用戶結構將根據此 UUID 進行編碼和存儲。var network bytes.Buffer // Stand-in for a network connectionenc := gob.NewEncoder(&network)err := enc.Encode(user) if err != nil { log.Println("Error in encoding gob") return "", err }err = dbSession.DBSession.Put([]byte(user.UserID), network.Bytes(), nil)由于所有條目的鍵都是唯一的 uuid,我想在電子郵件上創建二級索引,這樣我就不必掃描數據庫中存在的所有條目來查找與電子郵件對應的特定條目。我做了什么:我創建了一個名為 SIndex 的鍵,并在其中存儲了一個 map[string][string] 數據結構,其中鍵是電子郵件,值是 uuid。每次有新條目進入時,此 Sindex 都會更新以適應新的 uuid 和電子郵件。這是一個糟糕的方法:因為隨著數據的增長,需要獲取和解碼對應于 Sindex 的整個地圖,如果電子郵件不存在,則向 Sindex 添加一個新密鑰,對其進行編碼并再次存儲。B樹會更適合。我的問題:在數據庫本身中存儲二級索引數據是否正確,如果不是,我應該使用什么策略來實現二級索引,我知道二級索引的選擇受數據的影響很大但是有沒有好的開箱即用索引B-Tree、HashMaps 以外的算法?
鍵/值數據庫的二級索引
幕布斯7119047
2023-06-05 17:11:32