Допустим, у меня есть структура данных, такая как
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 и сохранил карту [строка][string] структура данных в нем, где ключом будет электронная почта, а значением будет uuid.Каждый раз, когда появляется новая запись, этот Sindex будет обновляться для размещения нового uuid и электронной почты.
Это плохой подход: поскольку по мере роста данных всю карту, соответствующую Sindex, нужно извлекать и декодировать, еслиадрес электронной почты не существует, добавьте новый ключ в Sindex, закодируйте его и сохраните снова.
Лучше всего подойдет B-дерево.
Мой вопрос: правильно ли хранить данные вторичного индекса в самой базе данных, если нет, какие стратегии я буду использовать для реализации вторичного индекса, я знаю, что выбор вторичного индекса сильно зависит от данных, но есть ликакие-нибудь хорошие готовые алгоритмы индексации, кроме B-Tree, HashMaps?