比方说,我有这样的数据结构
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 connection
enc := 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 以外的算法?
Qyouu
相关分类