Как можно построить индекс базы данных поверх хранилища ключей/значений?

Я читал об LevelDB и узнал что:

Предстоящие версии браузера Chrome включают реализацию IndexedDB HTML5 API, построенную поверх LevelDB.

IndexedDB также представляет собой простое хранилище ключей и значений, которое может индексировать данные.

Мой вопрос: как можно создать индекс поверх хранилища ключей/значений? Я знаю, что индекс на самом низком уровне - это n-арное дерево, и я понимаю, как данные индексируются в базе данных. Но как можно использовать хранилище ключей/значений, такое как LevelDB, для создания индекса базы данных?


person Lu4    schedule 28.01.2012    source источник
comment
Ответ @AndyDent хороший. Чтобы увидеть, как это делается на практике, посетите github.com/ren85/linqdb.   -  person ren    schedule 25.08.2016
comment
LevelDB основан на lsm-дереве, а не на B-дереве.   -  person Helin Wang    schedule 28.07.2018


Ответы (2)


Важной особенностью является не то, что он поддерживает пользовательские компараторы, а то, что он поддерживает упорядоченную итерацию по ключам и, таким образом, поиск по частичным ключам. Вы можете эмулировать поля в ключах, просто используя соглашения для разделения строковых значений. Этот подход используется во многих слоях сценариев, расположенных поверх leveldb.

Словарный вид хранилища ключей и значений заключается в том, что вы можете определить, присутствует ключ или нет, только по точному совпадению. Невозможно использовать просто такое хранилище KV в качестве основы для индекса базы данных.

Как только вы сможете перебирать ключи, начиная с частичного совпадения, у вас будет достаточно, чтобы обеспечить операции поиска и сортировки для индекса.

person Andy Dent    schedule 30.06.2013

Всего пара моментов: LevelDB поддерживает сортировку данных с помощью пользовательского компаратора из страница, на которую вы ссылаетесь:

Согласно сайту проекта, ключевыми особенностями являются:

  • Ключи и значения представляют собой произвольные массивы байтов.
  • Данные хранятся отсортированными по ключу.
  • Вызывающие могут предоставить пользовательскую функцию сравнения, чтобы переопределить порядок сортировки.
  • ....

Таким образом, LevelDB может содержать данные, которые можно сортировать/индексировать на основе 1 порядка сортировки.

Если вам нужно несколько индексируемых полей, вы можете просто добавить свое собственное B-дерево, которое работает поверх LevelDB. Я бы предположил, что это тип подхода, который использует браузер Chrome, но я просто предполагаю.

Вы всегда можете просмотреть исходный код Chrome.

person Matt Warren    schedule 28.01.2012
comment
вам не нужно использовать B-дерево поверх leveldb, вместо этого вы должны создать еще один leveldb, который будет служить индексом для каждого поля. (фактически имитируя то, что делает реляционная база данных, когда вы добавляете индексы в таблицу), но когда я посмотрел на leveldb, я не увидел транзакций между базами данных. - person Dan D.; 29.01.2012
comment
@ДанД. Я второй! +1 за комментарий! Я бы добавил еще одну вещь: да, нет транзакций, но у вас есть пакетная запись и у вас есть много других функций, которые приближаются к транзакциям ACID. - person Kiril; 01.02.2012
comment
@Lirik Под транзакцией между базами данных я имел в виду атомарные действия с участием нескольких экземпляров leveldb, которые leveldb не поддерживает. Хотя leveldb поддерживает атомарные действия для одного экземпляра leveldb, вы не можете создавать атомарные операции для нескольких экземпляров leveldb из этого. - person Dan D.; 01.02.2012
comment
@ДанД. ах, да... это правильно, я не видел креста в кросс-транзакциях БД. - person Kiril; 01.02.2012
comment
Зачем вам нужен отдельный leveldb? Просто смешайте пары индексов с парами записей. - person Andy Dent; 26.05.2012