【发布时间】:2019-02-04 12:06:42
【问题描述】:
可以说,我有像
这样的数据结构 type User struct {
UUid string
Username string
Email String
Password string
FirstName string
LastName string
}
我将用户 []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对应的Whole map进行获取和解码,如果email不存在,则给Sindex添加一个新的key,编码后再存储回来。
B-tree 会更合适。
我的问题:在数据库本身存储二级索引数据是否正确,如果不是我应该使用什么策略来实现二级索引,我知道二级索引的选择受数据影响很大但是有什么好的吗?除了 B-Tree、HashMaps 以外的框索引算法?
【问题讨论】:
-
LevelDB 可能已经使用一些树实现了。您应该通过将电子邮件作为键并将用户的 UUID 作为值来简单地创建二级索引。这样您可能可以快速有效地检索。
-
这正是我所做的,我创建了一个新密钥,并针对它存储了一个电子邮件 uuid 映射,然后将其存储在同一个 leveldb 上。
-
抱歉,我不是这个意思。给定具有 UUID
abba-cafe和电子邮件A@example.org的用户A,您将abba-cafe存储为键A@example.org上的直接值。您不应该存储地图。 -
好的,非常感谢乔纳斯 ...
标签: database go database-design leveldb